Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Modelagem de banco de dados para uma entidade fraca


Uma entidade não é fraca porque não pode existir independentemente, mas porque não pode ser identificada independentemente. Portanto, um relacionamento que "leva" a uma entidade fraca é chamado de relacionamento "identificador". Na prática, isso significa que a chave primária do pai é migrada para (geralmente propria ) subconjunto da PK do filho (o termo "entidade fraca" geralmente é definido em relação às chaves primárias, embora possa, em teoria, ser aplicado a qualquer chave).

É perfeitamente legítimo ter uma entidade que não pode existir independentemente, mas pode ser identificada independentemente - em outras palavras, que está em um relacionamento não identificador com um não NULL.

Você tem que perguntar:pode historyLineID seja único sozinho , ou em combinação com orderID ? Suspeito que o último seja o caso, o que o tornaria uma entidade fraca.

O que você nos mostrou não é uma entidade fraca - o PK dos pais não é migrado para o PK da criança.

Você tem basicamente duas opções:

  • orderHistory tem um PK composto:{orderID, historyLineID} , onde orderID é FK. BTW, este PK pode ser considerado "natural":



  • orderHistory tem um PK substituto:{orderHistoryID} , enquanto orderID está fora do PK. Você ainda precisa ter uma chave alternativa {orderID, historyLineID} no entanto:



Sim, esta é a primeira opção descrita acima. A menos que você tenha relacionamentos filhos em orderHistory em si, esta também é a melhor solução. Se orderHistory tem filhos, então esta pode ou não ser a melhor solução, dependendo de vários fatores.

Isso não é um ou outro. Um campo pode ser FK e parte de uma chave (primária ou alternativa), conforme mostrado acima.

Você não poderá alcançar a 3NF a menos que especifique suas chaves corretamente e não poderá fazer isso sem considerar qual entidade pode ser identificada independentemente e qual não pode.