En enhet är inte svag för att den inte kan existera oberoende, utan för att den inte kan identifieras oberoende av. Därför kallas en relation som "leder" till en svag enhet "identifierande" relation. I praktiken betyder detta att förälderns primärnyckel migreras till (vanligtvis korrekt ) delmängd av barnets PK (termen "svag enhet" definieras vanligtvis i relation till primärnycklar, även om det i teorin kan gälla vilken nyckel som helst).
Det är helt legitimt att ha en enhet som inte kan existera oberoende, men som kan identifieras oberoende - med andra ord, det vill säga i ett icke-identifierande förhållande till en icke-NULL.
Du måste fråga:kan historyLineID
vara unik ensam , eller i kombination med orderID
? Jag misstänker att det senare är fallet, vilket skulle göra det till en svag enhet.
Det du har visat oss är inte en svag enhet - förälders PK migreras inte till barnets PK.
Du har i huvudsak två alternativ:
-
orderHistory
har en sammansatt PK:{orderID, historyLineID}
, därorderID
är FK. BTW, denna PK kan betraktas som "naturlig": -
orderHistory
har en surrogat-PK:{orderHistoryID}
, medanorderID
är utanför PK. Du skulle fortfarande behöva ha en alternativ nyckel{orderID, historyLineID}
dock:
Ja, detta är det första alternativet som beskrivs ovan. Såvida du inte har underordnade relationer på orderHistory
i sig är detta också den bästa lösningen. Om orderHistory
har barn, men detta kan eller kanske inte är den bästa lösningen, beroende på flera faktorer.
Detta är inte antingen-eller. Ett fält kan vara både FK och en del av en (primär eller alternativ) nyckel, som visas ovan.
Du kommer inte att kunna nå 3NF om du inte anger dina nycklar korrekt, och du kommer inte att kunna göra det utan att överväga vilken enhet som kan identifieras oberoende och vilken som inte kan.