Uvedení databáze do třetí normální formy (3NF)
Třetí normální forma (3NF) je princip databáze, který podporuje integritu dat tím, že staví na principy normalizace databáze poskytuje první normální forma (1NF) a druhá normální forma (2NF). Účelem 3NF je zlepšit zpracování databáze a zároveň minimalizovat náklady na úložiště.
Požadavky na třetí normální formulář
Existují dva základní požadavky na to, aby databáze byla v 3NF:
- Databáze musí splňovat požadavky 1NF i 2NF.
- Všechny sloupce databáze musí záviset na primární klíč, což znamená, že hodnotu libovolného sloupce lze odvodit pouze z primárního klíče.
Závislost na primárním klíči
Pojďme dále prozkoumat, 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ěstnanců s těmito sloupci:
- ID zaměstnance
- Jméno
- Příjmení
Závisí příjmení i jméno pouze na hodnotě EmployeeID? No, mohlo by příjmení záviset na jménu? Ne, protože nic obsažené v Příjmení nenaznačuje hodnotu Jméno.
Mohlo by křestní jméno záviset na příjmení? Znovu ne, protože platí totéž: Ať už je příjmení jakékoli, nemůže poskytnout nápovědu ohledně hodnoty jména. Proto je tato tabulka v souladu s 3NF.
Pak zvažte tuto tabulku vozidel:
- VehicleID
- Výrobce
- Modelka
Výrobce a model by mohly být odvozeny z VehicleID, ale model by mohl být odvozen také od výrobce, protože pouze jeden konkrétní výrobce vyrábí model vozidla. Tento návrh tabulky není kompatibilní s 3NF, a proto by mohl vést k anomáliím dat. Můžete například aktualizovat výrobce, aniž byste aktualizovali model, čímž by se zavedly nepřesnosti.
Uvedení databáze do třetí normální formy (3NF)
Přesunutí dalšího závislého sloupce do jiné tabulky a odkazování na něj pomocí a cizí klíč by to vyhovovalo. Výsledkem by byly dvě tabulky, které budeme nazývat „Vozidla“ a „Modely“.
V tabulce „Vehicles“ je ModelID cizím klíčem tabulky „Models“:
- VehicleID
- Výrobce
- ID modelu
Nová tabulka „Models“ mapuje modely k výrobcům. Pokud chcete aktualizovat jakékoli informace o vozidle specifické pro model, proveďte to v této tabulce, nikoli v tabulce „Vozidla“.
- ID modelu
- Výrobce
- Modelka
Odvozená pole v modelu 3NF
Tabulka může obsahovat odvozené pole, což je pole, které je vypočí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ý
Součet porušuje shodu s 3NF, protože může být odvozen vynásobením jednotkové ceny množstvím, spíše než být plně závislý na primárním klíči. Musíte odstranit Total z tabulky, abyste splnili třetí normální formulář.
Protože je odvozená, je lepší ji do databáze vůbec neukládat, ale jednoduše ji vypočítat za běhu při provádění databázových dotazů. Tento dotaz jsme například mohli dříve použít k získání čísel objednávek a součtů:
SELECT Čí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:
SELECT Číslo objednávky, JednotkováCena * Množství JAKO Celkem
Z WidgetOrders