Datenbank innerhalb einer Datenbank (Tabellendesign) [duplizieren]

Mögliche Duplikate:
Datenbankdesign zum Erstellen von Tabellen im laufenden Betrieb

Ich muss eine Datenbank in einer Datenbank erstellen. Diese Frage bezieht sich aufdiese. Ich werde versuchen zu erklären, was ich im Detail zu tun versuche und Beispiele im Code bereitzustellen. Grundsätzlich möchte ich die Möglichkeit haben, dynamische Tabellen in einer Datenbank zu erstellen. Ich werde zum Beispiel eine Webseite haben, auf der Benutzer ihre eigene Tabelle mit Spalten und Daten erstellen können. Hier ist das Datenbankdesign, das ich mir ausgedacht habe:

aColumn
aDataType
aRow
aTable
zBit
zDateTime
zMoney
zNumber
zText

Tabellen, die mit einem beginnenz sind Daten, in die bestimmte Daten eingehen, wie z. B. ints, datetime-Werte usw. aColumn sind Spalten, die zu einer bestimmten Tabelle gehören. aRow identifiziert eine bestimmte Zeile in der aTabelle. Hier ist das Datenbankdesign:

aTable: Id, name
aColumn: Id, Name, aTable, aDataType
aDataType: Id, Name
aRow: Id, aTable
zBit: Id, aRow, aColumn, Data(Bit)
zDateTime: Id, aRow, aColumn, Data (DateTime)
zMoney: Id, aRow, aColumn, Data (Money)
zNumber: Id, aRow, aColumn, Data (INT)
zText: Id, aRow, aColumn, Data (nvarchar(MAX))

Hier sind einige Beispieldaten, die ich verwendet habe, um es zum Laufen zu bringen:

ein Tisch

Id          Name
1           Users

aSäulen

Id          Name           aTable       aDataType
1           Name           1            2
2           UserId         1            1
3           Occupation     1            2

aDataType

Id          Name
1           Number
2           Text

eine Reihe

Id          aTable
1           1
2           1

eine Zahl

Id          aRow           aColumn      Data
1           1              1            1245
2           2              2            56

ein Text

Id          aRow           aColumn      Data
1           1              1            Sara
2           2              1            Jake

Alle anderen z * -Tabellen sind leer

Hier ist die Abfrage zum Erstellen einer dynamischen Tabelle:

select t.[Id] as [Table], c.Name as [Column], dt.Name as [DataType], r.[Id] as [Row], cast(v.Data as nvarchar(MAX)) as Data from [pod].[dbo].[aTable] t
INNER JOIN [pod].[dbo].[aColumn] c on t.Id = c.[aTable]
INNER JOIN [pod].[dbo].[aDataType] dt on c.[aDataType] = dt.Id
INNER JOIN [pod].[dbo].[aRow] r on t.[Id] = r.[aTable]
INNER JOIN [pod].[dbo].[zBit] v on c.[Id] = v.aColumn and r.[Id] = v.[aRow]
UNION ALL
select t.[Id] as [Table], c.Name as [Column], dt.Name as [DataType], r.[Id] as [Row], cast(v.Data as nvarchar(MAX)) as Data from [pod].[dbo].[aTable] t
INNER JOIN [pod].[dbo].[aColumn] c on t.Id = c.[aTable]
INNER JOIN [pod].[dbo].[aDataType] dt on c.[aDataType] = dt.Id
INNER JOIN [pod].[dbo].[aRow] r on t.[Id] = r.[aTable]
INNER JOIN [pod].[dbo].[zDateTime] v on c.[Id] = v.aColumn and r.[Id] = v.[aRow]
UNION ALL
select t.[Id] as [Table], c.Name as [Column], dt.Name as [DataType], r.[Id] as [Row], cast(v.Data as nvarchar(MAX)) as Data from [pod].[dbo].[aTable] t
INNER JOIN [pod].[dbo].[aColumn] c on t.Id = c.[aTable]
INNER JOIN [pod].[dbo].[aDataType] dt on c.[aDataType] = dt.Id
INNER JOIN [pod].[dbo].[aRow] r on t.[Id] = r.[aTable]
INNER JOIN [pod].[dbo].[zMoney] v on c.[Id] = v.aColumn and r.[Id] = v.[aRow]
UNION ALL
select t.[Id] as [Table], c.Name as [Column], dt.Name as [DataType], r.[Id] as [Row], cast(v.Data as nvarchar(MAX)) as Data from [pod].[dbo].[aTable] t
INNER JOIN [pod].[dbo].[aColumn] c on t.Id = c.[aTable]
INNER JOIN [pod].[dbo].[aDataType] dt on c.[aDataType] = dt.Id
INNER JOIN [pod].[dbo].[aRow] r on t.[Id] = r.[aTable]
INNER JOIN [pod].[dbo].[zMoney] v on c.[Id] = v.aColumn and r.[Id] = v.[aRow]
UNION ALL
select t.[Id] as [Table], c.Name as [Column], dt.Name as [DataType], r.[Id] as [Row], cast(v.Data as nvarchar(MAX)) as Data from [pod].[dbo].[aTable] t
INNER JOIN [pod].[dbo].[aColumn] c on t.Id = c.[aTable]
INNER JOIN [pod].[dbo].[aDataType] dt on c.[aDataType] = dt.Id
INNER JOIN [pod].[dbo].[aRow] r on t.[Id] = r.[aTable]
INNER JOIN [pod].[dbo].[zNumber] v on c.[Id] = v.aColumn and r.[Id] = v.[aRow]
UNION ALL
select t.[Id] as [Table], c.Name as [Column], dt.Name as [DataType], r.[Id] as [Row], cast(v.Data as nvarchar(MAX)) as Data from [pod].[dbo].[aTable] t
INNER JOIN [pod].[dbo].[aColumn] c on t.Id = c.[aTable]
INNER JOIN [pod].[dbo].[aDataType] dt on c.[aDataType] = dt.Id
INNER JOIN [pod].[dbo].[aRow] r on t.[Id] = r.[aTable]
INNER JOIN [pod].[dbo].[zText] v on c.[Id] = v.aColumn and r.[Id] = v.[aRow]

Hier ist ein Teil dieser Abfrage:

select t.[Id] as [Table], c.Name as [Column], dt.Name as [DataType], r.[Id] as [Row], cast(v.Data as nvarchar(MAX)) as Data from [pod].[dbo].[aTable] t
INNER JOIN [pod].[dbo].[aColumn] c on t.Id = c.[aTable]
INNER JOIN [pod].[dbo].[aDataType] dt on c.[aDataType] = dt.Id
INNER JOIN [pod].[dbo].[aRow] r on t.[Id] = r.[aTable]
INNER JOIN [pod].[dbo].[zText] v on c.[Id] = v.aColumn and r.[Id] = v.[aRow]

Wie Sie hier sehen können, sind Daten (z * -Tabellen) durch eine Zeile und eine Spalte gekennzeichnet. Wenn ich diese Abfrage starte, erhalte ich Folgendes:

Ergebnisse

Table       Column         DataType     Row           Data
1           UserId         Number       1             1245          
1           UserId         Number       2             56
1           Name           Text         1             Sara
1           Name           Text         2             Jake

Hier sind meine gewünschten Ergebnisse: (Ich bin nicht sicher, wie ich diese Zeilen in Spalten umwandeln soll, wenn es sich um Spalten handeltunbekannte)

Row         UserId       Name
1           1245         Sara
2           56           Jake

Großes Problem Angenommen, diese Tabelle enthält 3 Spalten.

aSäulen

Id          Name           aTable       aDataType
1           Name           1            2
2           UserId         1            1
3           Occupation     1            2

Meine endgültigen erwarteten Ergebnisse sind also:

Row         UserId       Name         Occupation
1           1245         Sara         NULL
2           56           Jake         NULL

In den Ergebnissen muss ich auch Spalten sortieren. Ist das überhaupt möglich? Welche Datenbanken unterstützen diese Art von Funktionalität? Ich bin offen für jede Datenbank, die dies kann.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage