Skip to main content

Jak převést databázi na třetí normální formulář (3NF)

Anonim

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ě:

  • Databáze musí již splňovat požadavky 1NF a 2NF.
  • Všechny sloupce databáze musí záviset na primárním klíči, což znamená, že jakákoli hodnota sloupce může být odvozena pouze z primárního klíče.

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:

  • EmployeeID
  • Jméno
  • Příjmení

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:

  • ID vozidla
  • Výrobce
  • Modelka

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 níže uvedené tabulce je ID modelu cizí klíč pro Modely stůl:

  • ID vozidla
  • Výrobce
  • ModelID

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.

  • ModelID
  • Výrobce
  • Modelka

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ů:

  • Číslo objednávky
  • Zákaznické číslo
  • Jednotková cena
  • Množství
  • Celkový

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.