sql >> Databáze >  >> RDS >> Oracle

Může být cizí klíč null?

Sloupec (nebo sloupce) primárního klíče nesmí být NULL. Záznam nelze jednoznačně identifikovat pomocí NULL. Takže sloupce ID na odkazovaném konci cizího klíče musí být definovány jako NOT NULL.

Je však legitimním návrhovým rozhodnutím, aby byl vztah cizího klíče volitelný, a způsob, jak to reprezentovat, je učinit odkazující konec klíče volitelným, tj. povolit hodnoty NULL.

Z hlediska datového modelování je to, co jste popsali, (výhradní) oblouk:"tabulka ... se dvěma nebo více cizími klíči, kde jeden a pouze jeden z nich může být nenulový." V logickém modelování jsou oblouky naprosto přijatelné, ale existuje silná skupina názorů ve prospěch jejich implementace jako samostatných tabulek. Ve vašem scénáři by to byl obecný Sale tabulka plus dvě tabulky podtypů, VehicleSale a PieceSale .

Výhody implementace samostatné tabulky jsou:

  • snazší vynutit omezení cizího klíče;
  • snazší přidávat další sloupce týkající se (řekněme) prodeje vozidel, které se nevztahují na kusové prodeje;
  • jednodušší rozšíření modelu o další podtypy;
  • jasnější datový model, který může zjednodušit vývoj aplikací.

Výhody však nejsou pouze jednosměrné. I když je docela snadné zajistit, aby Sale platí buď pro VehicleSale nebo PieceSale ale ne obojí, což vynucuje pravidlo, že Sale musí mít záznam dítěte je ve skutečnosti dost drsný.

Takže převládající rada je, že výhradní oblouk je chybný, a je to obecně dobrá rada. Ale není to tak jasné, jak někteří tvrdí.



  1. Přístup odepřen pro 'user'@'localhost'

  2. Jak vyčistit nebo změnit velikost souboru ibtmp1 v MySQL?

  3. Klauzule LIKE Mysql a samostatná slova v poli

  4. Co zkontrolovat, zda je využití I/O MySQL vysoké