sql >> Database >  >> RDS >> Mysql

Databasemodellering voor een zwakke entiteit

Een entiteit is niet zwak omdat ze niet onafhankelijk kan bestaan, maar omdat ze niet geïdentificeerd kan worden onafhankelijk. Daarom wordt een relatie die 'leidt' tot een zwakke entiteit 'identificerende' relatie genoemd. In de praktijk betekent dit dat de primaire sleutel van de ouder wordt gemigreerd naar (meestal proper ) subset van de PK van het kind (de term 'zwakke entiteit' wordt meestal gedefinieerd in relatie tot primaire sleutels, hoewel het in theorie van toepassing kan zijn op elke sleutel).

Het is volkomen legitiem om een ​​entiteit te hebben die niet onafhankelijk kan bestaan, maar wel onafhankelijk kan worden geïdentificeerd - met andere woorden, dat wil zeggen in een niet-identificerende relatie met een niet-NULL.

Je moet vragen:kan historyLineID wees uniek alleen , of in combinatie met orderID ? Ik vermoed dat het laatste het geval is, wat het een zwakke entiteit zou maken.

Wat u ons heeft laten zien, is geen zwakke entiteit - de PK van de ouder wordt niet gemigreerd naar de PK van het kind.

Je hebt in wezen twee opties:

  • orderHistory heeft een samengestelde PK:{orderID, historyLineID} , waar orderID is FK. Trouwens, deze PK kan als "natuurlijk" worden beschouwd:

  • orderHistory heeft een surrogaat PK:{orderHistoryID} , terwijl orderID valt buiten de PK. U heeft nog steeds een alternatieve sleutel {orderID, historyLineID} . nodig hoewel:

Ja, dit is de eerste hierboven beschreven optie. Tenzij je onderliggende relaties hebt op orderHistory zelf is dit ook de beste oplossing. Als orderHistory wel kinderen heeft, dan kan dit al dan niet de beste oplossing zijn, afhankelijk van verschillende factoren.

Dit is niet of-of. Een veld kan zowel FK zijn als een deel van een (primaire of alternatieve) sleutel, zoals hierboven weergegeven.

U kunt 3NF niet bereiken tenzij u uw sleutels correct specificeert, en u kunt dat niet doen zonder te overwegen welke entiteit onafhankelijk kan worden geïdentificeerd en welke niet.



  1. Is het mogelijk om een ​​SQLPLUS-script uit te voeren op een bestand dat is gecodeerd als UTF-8 met stuklijst?

  2. 10 SP_EXECUTESQL Gotcha's om te vermijden voor een betere dynamische SQL

  3. Voeg gegevens in de externe mysql-database in via de POST-methode vanaf een iOS-apparaat

  4. Detecteren of een waarde ten minste één nummer bevat in SQL Server