Banco de dados dentro de um banco de dados (design de tabela) [duplicado]
Duplicata Possível:
Design de banco de dados para criar tabelas rapidamente
Eu tenho a necessidade de criar um banco de dados dentro de um banco de dados. Esta questão está relacionada comisto. Tentarei explicar em detalhes o que estou tentando fazer e fornecer exemplos no código. Basicamente, eu quero capacidade de criar tabelas dinâmicas em um banco de dados. Por exemplo, eu terei uma página da Web que permita aos usuários criar sua própria tabela com colunas e dados. Aqui está o design do banco de dados que eu criei:
aColumn
aDataType
aRow
aTable
zBit
zDateTime
zMoney
zNumber
zText
Tabelas que começam com umz
são dados que dados específicos entram, como ints, valores de data e hora, etc. aColumn são colunas que pertencem a uma tabela específica. aRow identifica uma linha específica dentro da tabela. Aqui está o design do banco de dados:
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))
Aqui estão alguns dados de amostra que usei para colocá-lo em funcionamento:
uma mesa
Id Name
1 Users
aColumns
Id Name aTable aDataType
1 Name 1 2
2 UserId 1 1
3 Occupation 1 2
aDataType
Id Name
1 Number
2 Text
uma fila
Id aTable
1 1
2 1
um número
Id aRow aColumn Data
1 1 1 1245
2 2 2 56
um texto
Id aRow aColumn Data
1 1 1 Sara
2 2 1 Jake
Todas as outras tabelas z * estão em branco
Aqui está a consulta para criar uma tabela dinâmica:
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]
Aqui está um pedaço dessa consulta:
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]
Como você pode ver aqui, um pedaço de dados (tabelas z *) é identificado por uma linha e uma coluna. Quando executo essa consulta, recebo isto:
Resultados
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
Aqui estão os meus resultados desejados: (Eu não sei como transformar essas linhas em colunas se as colunas foremdesconhecido)
Row UserId Name
1 1245 Sara
2 56 Jake
Grande problema Esta tabela é suposto ter 3 colunas lembrar?
aColumns
Id Name aTable aDataType
1 Name 1 2
2 UserId 1 1
3 Occupation 1 2
Então, meus resultados esperados são:
Row UserId Name Occupation
1 1245 Sara NULL
2 56 Jake NULL
Nos resultados, preciso classificar as colunas também. Isso é possível? Quais bancos de dados suportam esse tipo de funcionalidade. Estou aberto a qualquer banco de dados que possa fazer isso.