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í.