Skip to content

Uvedení databáze do třetí normální formy (3NF)

24 de Červen de 2021
GettyImages 748345779 5c15819d46e0fb00013645c5

Třetí normální forma (3NF) je princip databáze, který podporuje integritu dat na základě principů normalizace databáze poskytovaných první normální formou (1NF) a druhou normální formou (2NF). Účelem 3NF je zlepšit zpracování databáze a zároveň minimalizovat náklady na úložiště.

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

Existují dva základní požadavky na to, aby databáze byla v 3NF:

  • Databáze musí splňovat požadavky jak 1NF, tak 2NF.
  • Všechny sloupce databáze musí záviset na primárním klíči, což znamená, že hodnotu libovolného sloupce lze odvodit pouze z primárního klíče.

Závislost primárního klíče

Prozkoumejme dále, 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 3NF. Zvažte tabulku zaměstnanců s těmito sloupci:

  • ID zaměstnance
  • Jméno
  • Příjmení

Závisí příjmení i jméno pouze na hodnotě EmployeeID? Může LastName záviset na FirstName? Ne, protože nic, co je vlastní příjmení, by nenaznačovalo hodnotu jména. Mohlo by křestní jméno záviset na příjmení? Ne, protože to samé platí: Ať už je LastName jakékoli, nemůže poskytnout nápovědu k hodnotě FirstName. Proto je tato tabulka kompatibilní s 3NF. Pak zvažte tuto tabulku vozidel:

  • ID vozidla
  • Výrobce
  • Modelka

Výrobce a model by mohli pocházet z VehicleID, ale model by také mohl být odvozen od výrobce, protože model vozidla vyrábí pouze jeden konkrétní výrobce. Tento návrh tabulky nevyhovuje normě 3NF, a proto by mohl vést k anomáliím dat. Můžete například aktualizovat výrobce bez aktualizace modelu a zavést nepřesnosti.

Uvedení databáze do třetí normální formy (3NF)

Přesunutím dalšího závislého sloupce do jiné tabulky a odkazem na něj pomocí cizího klíče by bylo vyhovující. Výsledkem by byly dvě tabulky, které budeme nazývat „Vozidla“ a „Modely“. V tabulce „Vozidla“ je ModelID cizím klíčem k tabulce „Modely“:

  • ID vozidla
  • Výrobce
  • ModelID

Nová tabulka „Modely“ mapuje modely na výrobce. Pokud chcete aktualizovat jakékoli informace o vozidle specifické pro model, uděláte to v této tabulce, nikoli v tabulce „Vozidla“.

  • ModelID
  • Výrobce
  • Modelka

Odvozená pole v modelu 3NF

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

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

Celkem porušuje soulad s 3NF, protože jej lze odvodit vynásobením jednotkové ceny množstvím, místo aby byl plně závislý na primárním klíči. Chcete-li vyhovět třetímu normálnímu formuláři, musíte z tabulky odstranit Total. Vzhledem k tomu, že je odvozen, je lepší ho vůbec neukládat do databáze, ale jednoduše jej průběžně vypočítávat při provádění databázových dotazů. Například jsme tento dotaz mohli dříve použít k načtení čísel objednávek a součtů:

VYBERTE číslo objednávky, celkem
Z WidgetOrders

Nyní použijte následující dotaz k dosažení stejných výsledků bez porušení pravidel normalizace:

VYBERTE Číslo objednávky, Jednotková cena * Množství AS Celkem
Z WidgetOrders