Eu tenho uma situação em que preciso manter um grupo de linhas de detalhes juntas, mas onde o "pai" não tem atributos adicionais e os "filhos" não têm propósito próprio. Comecei com a abordagem típica (para mim)
GroupOfSomething
Id
SomethingDetail
Id
GroupOfSomethingId (FK)
LookupToAnotherTable (FK)
SomethingElse
Acima, Id é PK de digamos INT. Querendo saber se algo como o abaixo com apenas uma tabela em vez do relacionamento pai/filho é mais apropriado (GroupId pode ser um UNIQUEIDENTIFIER)
GroupOfSomethings
GroupId
Id
LookupToAnotherTable (FK)
SomethingElse
Em um esforço para esclarecer, isso é para algo como um sistema de contabilidade. São Somethings
FKs para contas. Haverá uma coleção dessas contas que os usuários vincularão a um ou mais fornecedores. No nível em que o fornecedor e a coleção de contas estão vinculados, há metadados adicionais. Então, esse relacionamento será o pai de mais uma coleção 1:muitos e de entidades adicionais 1:1 e 1:muitos relacionadas. Então fica algo como abaixo (com a estrutura PK/FK original, sem definir o que são todas as outras tabelas FK)
GroupOfAccounts
Id (PK)
GroupOfAccountDetail
Id (PK)
GroupOfAccountId (FK)
AccountId (FK)
VendorGroupOfAccountInfo
Id (PK)
VendorId (FK)
GroupOfAccountId (FK)
VendorGroupOfAccountInfoAdditionalDetail
Id (PK)
VendorGroupOfAccountInfoId (FK)
FeeStructureId (FK)
StateId (FK)
VendorGroupOfAccountRates
Id (PK)
GroupOfAccountDetail (FK)
RatePercentage
EffectiveDate
...
É difícil acreditar que não haja metadados significativos associados aos
GroupOfSomething
s, além doId
. Mas se isso é tudo, e você não tem nenhuma lógica de negócios dependente disso (por exemplo, classificando as linhas porGroupOfSomethingId
), além de apenasSELECT
certos grupos de linhas por vez, não consigo pensar em um grande motivo ter aGroupOfSomething
mesa.A única boa razão em que consigo pensar é se você deseja implementar a integridade dos dados de forma que uma linha adicionada à
SomethingDetail
tabela só possa ser adicionada a um grupo válido existente. A lista distinta com chave estrangeira naGroupOfSomething
tabela garante que apenas um válidoGroupOfSomethingId
seja usado naSomethingDetail
tabela.