Někteří velmi dobří návrháři používají NULL v cizích klíčích bez nepříznivých následků. Sám se tak nakláním. FK s možností null představuje volitelný vztah. V případech, kdy entita nemá žádný vztah, obsahuje FK hodnotu NULL. Prostor nad hlavou je minimální. Když se spojení (přesněji ekvijoiny) provedou napříč dvěma tabulkami, instance obsahující NULL v FK ze spojení vypadnou, a to je vhodné.
Když jsem to řekl, doporučím vám čtvrtou metodu. To zahrnuje celkem 4 tabulky, účty, widgety, typy a custom_types. Tabulka custom_types používá techniku zvanou Shared-primary-key, popsanou níže.
CREATE TABLE accounts (
account_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
# Other Columns...,
PRIMARY KEY (account_id)
);
CREATE TABLE widgets (
widget_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
account_id INT UNSIGNED NOT NULL,
type_id INT UNSIGNED NOT NULL,
PRIMARY KEY (widget_id),
FOREIGN KEY (account_id) REFERENCES accounts(account_id) ON DELETE CASCADE,
FOREIGN KEY (type_id) REFERENCES types(type_id)
);
CREATE TABLE types (
type_id INT UNSIGNED AUTO_INCREMENT NOT NULL,
account_id INT UNSIGNED NOT NULL,
name VARCHAR(100) NOT NULL,
PRIMARY KEY (type_id),
FOREIGN KEY (account_id) REFERENCES accounts(account_id)
CREATE TABLE custom_types (
type_id INT NOT NULL,
account_id INT UNSIGNED NOT NULL,
PRIMARY KEY (type_id),
FOREIGN KEY (type_id) REFERENCES types(type_id),
FOREIGN KEY (account_id) REFERENCES accounts(account_id)
);
Sloupec type_id v custom_types je sdílený primární klíč. Všimněte si, že je deklarován JAK jako primární klíč i jako cizí klíč a že nepoužívá automatické číslování. Je to kopie primárního klíče v typech pro odpovídající položku. Tabulka vlastních typů obsahuje všechna data, která jsou přítomna ve vlastních typech, ale chybí v přednastavených typech.
U přednastavených typů se záznam provádí v typech, ale v custom_types se neprovádí žádný záznam. U custom_types se nejprve provede záznam v typech a poté se výsledná hodnota type_id zkopíruje do custom_types spolu s account_id.
Pokud použijete typy INNER JOIN a custom_types, přednastavené typy ze spojení vypadnou. Pokud chcete vlastní i přednastavené typy v jediném spojení, musíte k dosažení tohoto efektu použít LEFT JOIN nebo RIGHT JOIN. Všimněte si, že výsledek LEFT nebo RIGHT JOIN bude obsahovat některé hodnoty NULL, i když tyto hodnoty NULL nejsou uloženy v databázi.
Kliknutím na tento sdílený-primární-klíč vám poskytne podrobnější popis techniky sdíleného primárního klíče.