sql >> Database >  >> RDS >> Mysql

Identificerende versus niet-identificerende relaties (opnieuw!!!)

Je denkt te veel na over het verband tussen optionaliteit en identiteit. Totdat het geheel natuurlijker voor je wordt, kun je ze het beste beschouwen als volledig los van elkaar .

Wat betreft optionaliteit is het belangrijk om te onthouden dat de optionaliteit richtinggevend is. Om uw voorbeeld van employee_equipment te gebruiken :Tuurlijk, werknemers hebben geen apparatuur nodig. De een-op-veel-relatie van employee naar employee_equipment is optioneel. Tegelijkertijd, vanuit het tegenovergestelde perspectief bekeken, is de relatie verplicht. U kunt geen record hebben in employee_equipment tenzij er een employee . is om het mee te associëren.

Identiteit heeft niets te maken met optionaliteit, behalve toevallig een identificerende relatie is verplicht van het kind tot de ouder. Of het ook verplicht is van de ouder aan het kind is noch hier noch daar wat betreft identiteit.

Wat een relatie identificerend maakt, is dat je moet weten over welke ouder je het hebt (en nog wat andere dingen) om te weten over welk kind je het hebt. Dat wil zeggen dat de primaire sleutel van het kind een externe sleutel naar de ouder moet bevatten.

Pure intersectietabellen (bijv. employee_equipment ) zijn daar goede voorbeelden van. De primaire sleutel van een zuivere intersectie is de combinatie van de refererende sleutels naar beide bovenliggende tabellen. Merk op dat sommige mensen ook een surrogaatsleutel aan dit soort tabellen kunnen toevoegen. Vanuit identiteitsperspectief maakt het niet zoveel uit of er meerdere kandidaatsleutels zijn. Wat belangrijk is bij het bepalen van de identiteit is of de refererende sleutel deel uitmaakt van een kandidaatsleutel, of die kandidaatsleutel al dan niet de primaire sleutel is.

Een ander goed voorbeeld is zoiets als de metadatacatalogus van een database, waar een kolom wordt geïdentificeerd door de tabel waartoe hij behoort, net zoals de tabel wordt geïdentificeerd door het schema waarin hij zich bevindt, enzovoort. Weten dat een kolom NAME heet geeft niet aan welke kolom het is. Wetende dat het de NAME . is kolom in de CUSTOMER tafel helpt. (Je moet ook weten welk schema CUSTOMER is in, enzovoort).



  1. Een postgresql-sessie/verbinding beëindigen

  2. Hoe SQL Developer op een Mac te installeren

  3. lokale verzamelingstypen niet toegestaan ​​in SQL-instructies

  4. Hoe rond je een gemiddelde af op 2 decimalen in PostgreSQL?