Základy normalizace databáze

Tento článek vysvětluje terminologii normalizace databází pro začátečníky. Základní pochopení této terminologie je užitečné při diskusi nad návrhem relační databáze.

Popis normalizace

Normalizace je proces uspořádání dat v databázi. Zahrnuje vytváření tabulek a vytváření relací mezi těmito tabulkami podle pravidel navržených jak k ochraně dat, tak k zajištění větší pružnosti databáze odstraněním redundance a nekonzistentních závislostí.

Redundantní data zbytečně plýtvají místem na disku a způsobují potíže s údržbou. Je-li nutné změnit data existující na více místech, je nutné je změnit přesně stejným způsobem ve všech umístěních. Změna adresy zákazníka je jednodušší implementovat, pokud jsou tato data uložená pouze v tabulce Zákazníci a nikde jinde v databázi.

Co znamená „nekonzistentní závislost“? I když je pro uživatele intuitivní hledat v tabulce Zákazníci adresu konkrétního zákazníka, nemusí mít smysl hledat tam plat zaměstnance, který ho volá. Plat zaměstnance se vztahuje nebo je závislý na daném zaměstnanci a proto by měl být přesunut do tabulky Zaměstnanci. Nekonzistentní závislosti mohou ztížit přístup k datům, protože cesta k nim může chybět nebo být neplatná.

Existuje několik pravidel pro normalizaci databáze. Každé pravidlo se nazývá "normální forma". Pokud je dodrženo první pravidlo, říká se, že databáze je v "první normální formě". Pokud jsou dodržena první tři pravidla, databáze se považuje za třetí normální formu. I když jsou možné jiné úrovně normalizace, třetí normální forma je považována za nejvyšší úroveň potřebnou pro většinu aplikací.

Stejně jako u mnoha formálních pravidel a specifikací ani scénáře z reálného světa neumožňují vždy dokonalé dodržování předpisů. Normalizace obecně vyžaduje další tabulky a někteří zákazníci to považují za nepohodlné. Rozhodnete-li se porušit jedno z prvních tří pravidel normalizace, ověřte, zda je vaše aplikace připravená na všechny problémy, ke kterým by mohlo dojít, například redundantní data a nekonzistentní závislosti.

Následující popisy obsahují příklady.

První normální forma

  • Eliminujte opakující se skupiny v jednotlivých tabulkách.
  • Vytvořte samostatnou tabulku pro každou sadu souvisejících dat.
  • V každé sadě souvisejících dat definujte identifikaci prostřednictvím primárního klíče.

Nepoužívejte k ukládání podobných dat více polí v jedné tabulce. Chcete-li například sledovat skladovou položku, která může pocházet ze dvou možných zdrojů, může skladový záznam obsahovat dvě pole pro Kód dodavatele 1 a Kód dodavatele 2.

Co se stane, když přidáte třetího dodavatele? Přidání pole není odpověď. vyžaduje úpravy programů a tabulek a nepochází bez problémů s dynamickým počtem dodavatelů. Namísto toho umístěte všechny informace o dodavatelích do samostatné tabulky s názvem Dodavatelé. Poté vytvořte vazbu skladu na prodejce pomocí klíče čísla položky nebo vazbu dodavatelů na sklad pomocí klíče kódu dodavatele.

Druhá normální forma

  • Vytvořte oddělené tabulky pro sady hodnot, které se týkají více záznamů.
  • Vytvořte relace na tyto tabulky pomocí cizího klíče.

Záznamy by neměly záviset na ničem jiném než na primárním klíči tabulky (v případě potřeby na složený klíč). Uvažujme například adresu zákazníka v účetním systému. Tato adresa je potřebná v tabulce Zákazníci, ale také v tabulkách Objednávky, Doprava, Faktury, Pohledávky a Inkaso. Namísto uložení adresy zákazníka jako samostatné položky v každé z těchto tabulek uložte adresu na jednom místě, buď v tabulce Zákazníci, nebo v samostatné tabulce Adresy.

Třetí normální forma

  • Odstraňte pole, která nezávisí na klíči.

Hodnoty v záznamu, které nejsou součástí klíče záznamu, nepatří do tabulky. Obecně lze říci, že kdykoli se obsah skupiny polí může týkat více než jednoho záznamu v tabulce, měli byste uvažovat o umístění těchto polí do samostatné tabulky.

Například v tabulce Nábor zaměstnanců může být u kandidáta uveden název univerzity a její adresa. Nicméně potřebujete úplný seznam univerzit, abyste mohli odesílat hromadnou poštu. Jsou-li informace o univerzitách uložené v tabulce Kandidáti, neexistuje žádný způsob, jak vytvořit seznam univerzit bez aktuálních kandidátů. Vytvořte oddělenou tabulku Univerzity a propojte ji s tabulkou Kandidáti pomocí klíče kódu univerzity.

VÝJIMKA: Dodržování třetí normální formy, i když je teoreticky žádoucí, není vždy praktické. Máte-li tabulku Zákazníci a chcete eliminovat všechny možné závislosti mezi poli, je nutné vytvořit samostatné tabulky pro města, PSČ, obchodní zástupce, třídy zákazníků a další faktory, u kterých může dojít ve více záznamech k duplikaci. Teoreticky je normalizace hodná. Mnoho malých tabulek může ovšem snížit výkon nebo překročit kapacitu paměti a otevřených souborů.

Může být proto vhodnější použít třetí normální formu pouze pro data, která se často mění. Pokud zůstanou nějaká závislá pole, navrhněte aplikaci tak, aby v případě změny jednoho pole po uživateli požadovala ověření všech souvisejících polí.

Další formy normalizace

Čtvrtá normální forma, označovaná také jako Boyce-Codd normální formulář (BCNF) a pátá normální forma existují, ale v praktickém návrhu se uváží jen zřídka. Ignorování těchto pravidel může vést k méně než dokonalému návrhu databáze, ale nemělo by to mít vliv na funkčnost.

Normalizace vzorové tabulky

Tyto kroky demonstrují proces normalizace fiktivní tabulky studentů.

  1. Nenormalizovaná tabulka:

    Číslo studenta Poradce Kancelář poradce Přednáška1 Přednáška2 Přednáška3
    1022 Dvořák 412 101-07 143-01 159-02
    4123 Novák 216 101-07 143-01 179-04
  2. První normální forma: Žádné opakující se skupiny

    Tabulky by měly být pouze dvourozměrné. Jeden student má několik přednášek, a proto by tyto přednášky měly být uvedené v samostatné tabulce. Pole Přednáška1, Přednáška2, Přednáška3 v uvedených záznamech ukazují na potíže s návrhem.

    Tabulky často používají třetí dimenzi, ale tabulky by neměly. Dalším způsobem, jak se na tento problém podívat, je použít relaci 1:N, nevkládejte jednu stranu a strany N do stejné tabulky. Místo toho vytvořte další tabulku v první normální podobě odstraněním opakující se skupiny (Class#), jak je znázorněno v následujícím příkladu:

    Číslo studenta Poradce Kancelář poradce Číslo přednášky
    1022 Dvořák 412 101-07
    1022 Dvořák 412 143-01
    1022 Dvořák 412 159-02
    4123 Novák 216 101-07
    4123 Novák 216 143-01
    4123 Novák 216 179-04
  3. Druhá normální forma: Odstranění nadbytečných dat

    Všimněte si několika hodnot Class# pro každou hodnotu Student# ve výše uvedené tabulce. Class# není funkčně závislá na Student# (primární klíč), takže tato relace není ve druhé normální podobě.

    Následující dvě tabulky demonstrují druhou normální formu:

    Studenti:

    Číslo studenta Poradce Kancelář poradce
    1022 Dvořák 412
    4123 Novák 216

    Registrace:

    Číslo studenta Číslo přednášky
    1022 101-07
    1022 143-01
    1022 159-02
    4123 101-07
    4123 143-01
    4123 179-04
  4. Třetí normální forma: Odstranění dat, která nejsou závislá na klíči

    V posledním příkladu je pole Kancelář poradce (číslo kanceláře poradce) funkčně závislé na atributu Poradce. Řešením je přesunout tento atribut z tabulky Studenti do tabulky Fakulta, jak je ukázáno v následujícím příkladu:

    Studenti:

    Číslo studenta Poradce
    1022 Dvořák
    4123 Novák

    Fakulta:

    Name (Název) Místnost Katedra
    Dvořák 412 42
    Novák 216 42