Vložení databáze do třetího normálního formátu (3NF)

Třetí normální forma (3NF) je princip databáze, který podporuje integritu dat tím, že staví na principech normalizace databáze poskytovaných normální normou (1NF) a druhou normální formou (2NF).

Třetí požadavek na normální formulář

Existují dva základní požadavky na to, aby databáze byla ve třetí normální podobě:

O závislosti primárního klíče

Podívejme se dále na to, co máme na mysli tím, že všechny sloupce musí záviset na primárním klíči.

Pokud lze hodnotu sloupce odvodit jak z primárního klíče, tak z jiného sloupce v tabulce, porušuje to 3NF. Zvažte tabulku Zaměstnanci s těmito sloupci:

Obě jméno a FirstName závisí pouze na hodnotě EmployeeID? No, může LastName záviset na FirstName? Ne, protože nic, co je vlastně v LastName, by naznačovalo hodnotu FirstName. Mohla by být FirstName závislá na LastName? Ne znovu, protože to samé je pravda: ať už by mohla být jména LastName, nemohla by poskytnout náznak, pokud jde o hodnotu FirstName. Proto je tato tabulka kompatibilní s 3NF.

Ale zvažte tuto tabulku vozidel:

Výrobce a model by mohly pocházet z vozidla VehicleID - ale model může také pocházet od výrobce, protože model vozidla je vyráběn pouze konkrétním výrobcem. Tento návrh tabulky není kompatibilní s 3NF a mohl by proto vést k chybám dat. Můžete například aktualizovat výrobce bez aktualizace modelu a zavést nepřesnosti.

Aby byla kompatibilní, museli bychom přesunout další závislý sloupec do jiné tabulky a odkazovat na něj pomocí cizího klíče. To by vedlo k dvěma tabulkám:

Tabulka vozidel

V tabulce níže ID modelu je cizí klíč tabulky modelů :

Tabulka modelů

Tato nová tabulka mapuje modely výrobcům. Chcete-li aktualizovat informace o vozidle specifické pro model, proveďte to v tabulce, nikoli v tabulce Vozidla.

Odvozená pole v modelu 3NF

Tabulka může obsahovat odvozené pole, které je vypočítáno na základě jiných sloupců v tabulce. Zvažte například tuto tabulku příkazů widgetů:

Celkový součet je v souladu s 3NF, protože může být odvozen vynásobením jednotkové ceny množstvím spíše než plně závislou na primárním klíči. Musíme jej odstranit z tabulky, abychom vyhověli třetím normálním formulářům.

Ve skutečnosti, protože je odvozena, je lepší ji vůbec neukládat do databáze.

Můžeme jej jednoduše vypočítat "za běhu" při provádění dotazů na databázi. Můžeme například použít tento dotaz k získání čísel objednávek a součtů:

SELECT OrderNumber, celkem FROM WidgetOrders

Nyní můžeme použít následující dotaz:

SELECT OrderNumber, UnitPrice * Množství AS Celkem FROM WidgetOrders

k dosažení stejných výsledků bez porušení normalizačních pravidel.