Sou novo em design de banco de dados e projetei um banco de dados que parece bom para o aplicativo, mas parece ter uma grande bandeira vermelha para mim.
Eu tenho uma tabela mestre que é unida a outra tabela, mas a tabela que é unida é baseada em alguns dados em outra coluna.
Meu aplicativo, por sua vez, executará consultas como:
SELECT f.dataA, m.data1, m.data2
FROM Master_Table m
INNER JOIN Foo f ON f.id = m.TableKey
WHERE TableName = 'Foo'
e
SELECT fb.dataA, fb.dataB, m.data1, m.data2
FROM Master_Table m
INNER JOIN Foobar fb ON fb.id = m.TableKey
WHERE TableName = 'Foobar'
Isso funciona como desejado, mas não gosto do fato de que meu Master_Table.TableKey
provavelmente deve ser mantido em uma restrição de chave estrangeira, mas isso é impossível com esse design (ou pelo menos acho que sim).
A coluna deve TableKey
ser dividida em um FooKey
e ? Isso também parece estranho porque eu garanto isso e será null where = "Foo".BarKey
FoobarKey
BarKey
FoobarKey
TableName
Ou há uma maneira completamente diferente de abordar isso?
EDIT: Curiosamente, este recente post meta.dba parece tocar nessa ideia sobre herança, mas não tenho muita certeza de qual é a melhor abordagem ainda.
Este não é um ótimo design. Você tem algumas opções para melhorá-lo:
Vá com sua alternativa (chaves separadas). Você não lista seus requisitos, mas se for imperativo que você tenha apenas UM registro filho por registro mestre, você pode impor isso com restrições de verificação.
Coloque a chave pai na tabela filho. Se cada registro filho se referir a um registro mestre, basta colocar o masterid na tabela filho. Isso também oferece a opção de vários registros filho por mestre/pai. Se você quiser ter apenas um filho por pai, remova a chave substituta na tabela filho e tenha apenas o id mestre relacionado.
Qualquer que seja sua escolha, eu não recomendaria armazenar o nome da tabela filha em uma coluna no registro mestre. Você pode torná-lo um campo "Tipo", mas colocar metadados em seus dados sempre leva a problemas no futuro. Também é desnecessário se você tiver chaves separadas, pois sabe que se tiver um
FooID
valor, o tipo de registro éFoo
.