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.