sql >> Databáze >  >> RDS >> Mysql

Otázka návrhu DB týkající se cizích klíčů s hodnotou Null a normalizace

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 vám poskytne podrobnější popis techniky sdíleného primárního klíče.



  1. Upozornění:mysqli_query() očekává, že parametr 1 bude mysqli, daný zdroj

  2. PowerManager.PARTIAL_WAKE_LOCK android

  3. Datový typ hodnocení 5 hvězdiček MySQL?

  4. Přidejte cizí klíč do existující tabulky v SQLite