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}
, ondeorderID
é FK. BTW, este PK pode ser considerado "natural":
-
orderHistory
tem um PK substituto:{orderHistoryID}
, enquantoorderID
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.