sql >> Database >  >> RDS >> Oracle

Kan een externe sleutel nul zijn?

De kolom (of kolommen) van een primaire sleutel mag NIET NULL zijn. Een record kan niet uniek worden geïdentificeerd door een NULL. Dus de ID-kolommen aan het uiteinde van de refererende sleutel waarnaar wordt verwezen, moeten worden gedefinieerd als NOT NULL.

Het is echter een legitieme ontwerpbeslissing dat een externe sleutelrelatie optioneel is, en de manier om dat weer te geven is door het verwijzende einde van de sleutel optioneel te maken, d.w.z. NULL's toestaan.

In termen van gegevensmodellering is wat u hebt beschreven een (exclusieve) boog:"een tabel ... met twee of meer externe sleutels waarvan één en slechts één niet-null kan zijn." In logische modellering zijn bogen volkomen acceptabel, maar er is een sterke mening voor het implementeren ervan als afzonderlijke tabellen. In jouw scenario zou dat een generieke Sale . zijn tabel plus twee subtype tabellen, VehicleSale en PieceSale .

De voordelen van de afzonderlijke tabelimplementatie zijn:

  • gemakkelijker om de externe sleutelbeperkingen af ​​te dwingen;
  • gemakkelijker om extra kolommen toe te voegen met betrekking tot (bijvoorbeeld) voertuigverkopen die niet van toepassing zijn op stukverkopen;
  • gemakkelijker om het model uit te breiden met extra subtypes;
  • duidelijker gegevensmodel, dat de ontwikkeling van applicaties kan vereenvoudigen.

De voordelen zijn echter niet allemaal eenrichtingsverkeer. Hoewel het vrij eenvoudig is om ervoor te zorgen dat een Sale is van toepassing op een VehicleSale of een PieceSale maar niet beide, een regel afdwingen dat een Sale moet een kinderrecord hebben wordt eigenlijk behoorlijk lastig.

Het heersende advies is dus dat een exclusieve boog verkeerd is, en het is over het algemeen een goed advies. Maar het is niet zo duidelijk als sommigen beweren.



  1. In Oracle SQL:Hoe voeg je de huidige datum + tijd in een tabel in?

  2. Maak een reeks van aangepaste domeinen postgres

  3. Meerdere tafelverbindingen in rails

  4. Doe mee op dinsdag 9 april voor het laatste Microsoft Access-nieuws