Třetí normální forma

Treti Normalni Forma



Toto je třetí díl série, Pět normálních forem. Názvy prvních dvou částí (tutoriálů) jsou První normální forma, po níž následuje Druhá normální forma. V této části seriálu je vysvětlena Třetí normální forma.

Vysvětlení sleduje linii příběhu: Otec zemřel a zanechal nějaké peníze pro svého syna. Syn se rozhodl peníze investovat do večerky. Večerka, známá také jako večerka, je malý maloobchodní podnik, který přijímá každodenní předměty od dodavatelů a prodává je jednotlivým zákazníkům v okolí.







V tuto chvíli je obchod již naskladněn a již proběhly nějaké prodeje. Syn, který je majitelem podniku, má několik zaměstnanců, kterým se v tomto návodu říká úředníci. Majitel a kterýkoli zaměstnanec může přijímat zásoby a prodávat po zaznamenání produktů.



Před zahájením prodejny však majitel ani zaměstnanci nevěděli nic o běžných formách. Takže vše zaznamenávali jako transakce do jedné tabulky a jednoho sešitu. Neměli počítač.



Vy, čtenáři, jste dokončili pět dílů této série tutoriálů; nyní jste vývojář databáze. Majitel večerky je váš přítel. Před dvěma dny jste navštívili obchod a zaškolili majitele a prodavače na výrobu stolu v jeho první normální podobě. Včera jste také navštívili obchod a zaškolili je, jak vytvořit tabulku ve druhé normální formě z první normální formy.





Dnes jste právě dorazili do obchodu na návštěvu, abyste je zaškolili, jak vyrobit stůl ve třetí normální formě z druhé normální formy. Všechny tabulky, které v současnosti mají, jsou ve druhé normální formě. Tabulky (podle názvu a záhlaví sloupců) jsou:

Produkty (ID produktu, ID kategorie, produkt)
Kategorie (ID kategorie, kategorie)



Prodej (ID prodeje, zákazník, zaměstnanec, datum)
Podrobnosti o prodeji (ID prodeje, ID produktu, čísloProdáno, prodejní cena)

Objednávky (ID objednávky, dodavatel, zaměstnanec, datum)
Podrobnosti objednávky (ID objednávky, ID produktu, číslo Koupeno, cena)

Jednotlivé nebo složené klávesy jsou podtržené.

Po shrnutí toho, co se učili v předchozích dvou dnech a než jste mohli něco udělat, se majitel zeptá:

„A co telefonní čísla, adresy atd. pro zákazníky a zaměstnance?

A co množství na skladě, úroveň objednávek atd. u produktů?
Potřebují své vlastní samostatné stoly, nebo by se měly vejít do současných stolů?

Vy, vývojář databáze, odpovídáte:

„Gratuluji, majiteli! Nepřímo jste uvedl problém třetí normální formy.'

Pokračuješ.

Další potřebné sloupce

Další potřebné sloupce jsou nejprve doplněny do předchozích tabulek, které jsou v 1NF a 2NF. Některé z předchozích názvů sloupců jsou upraveny.

Tabulka Kategorie by měla obsahovat minimálně následující sloupce:

Kategorie (ID kategorie, název kategorie, popis)

Popis je krátký odstavec, který popisuje kategorii. Tato tabulka kategorií je již v 1NF, 2NF a 3NF. 3NF je vysvětleno níže:

Tabulka Produkty by měla obsahovat minimálně následující sloupce:

Produkty (ID produktu, ID kategorie, ID dodavatele, název produktu, jednotková cena, množství na skladě, úroveň objednávky)

Vzhledem k tomu, že se každý produkt prodává, bude při objednání produktu dosažena nízká úroveň (počet) produktů, takže zákazníci by neměli přijít do obchodu a produkt by neměli mít. Taková absence není pro podnikání dobrá. množstvíNa skladě je počet konkrétního produktu na skladě. To zahrnuje to, co je v obchodě a co je na polici.

categoryID a SupplierID jsou cizí klíče. Proto mají místo jednoduchého podtržení čárkované podtržení. Cizí klíč je vysvětlen níže. V předchozí části série (Second Normal Form) bylo categoryID součástí primárního klíče s jediným podtržením kvůli tomu, jak se k němu dospělo. Z níže uvedeného vysvětlení by však bylo jasné, že categoryID by měl být cizí klíč (s podtržením pomlčkou).

Tato tabulka produktů je již v 1NF, 2NF a 3NF. Podívejte se, proč je v 3NF níže:

Tabulka SaleDetails by měla obsahovat minimálně následující sloupce:

Podrobnosti o prodeji (ID prodeje, ID produktu, jednotková cena prodeje, množství, sleva)

Očekává se, že hodnota diskontu bude většinou nula. Sleva je sleva, kterou obchod poskytuje zákazníkovi.

Tabulka OrderDetails by měla obsahovat minimálně následující sloupce:

Podrobnosti objednávky (ID objednávky, ID produktu, jednotkováCostPrice, množství, sleva)

Očekává se, že hodnota diskontu bude většinou nula. Sleva je zde sleva, kterou dodavatel poskytuje obchodu.

Jak je vidět níže, tabulku produktů lze uvažovat v 2NF nebo 3NF. Tabulky Prodej a Objednávka mají vydání 3NF. K vysvětlení problému a řešení bude použita pouze tabulka prodejů. Tabulka 3NF pro tabulku objednávek a tabulku produktů se řídí podobným uvažováním a byla by pouze citována.

Při přidávání sloupců bude tabulka Prodej:

Prodej (ID prodeje, datumProdané jméno zákazníka, telefon, adresa, město, region, PSČ, země, zaměstnanec)

Sedm sloupců nahradilo sloupec zákazník v původní tabulce. Vzhledem k tomu, že zákazníci jsou lidé v sousedství, mohou být buňky pro sloupce města, regionu (státu), PSČ a země prázdné, i když v tomto článku prázdné nejsou.

Tato prodejní tabulka je stále v 2NF, protože pravidla 1NF a 2NF nebyla porušena. Je však třeba si uvědomit, že v řádku tabulky Prodej byl zákazník (jméno) nahrazen sedmi buňkami řádku zákazníka.

Poznámka: Buňka adresy obsahuje číslo domu, název ulice nebo silnice a název města, vše oddělené čárkami. Město lze považovat za složené z několika měst. Ačkoli čárky oddělují tyto konkrétní složky řetězce, tvoří hodnotu jedné buňky, nikoli tři hodnoty buňky.

Sloupec zaměstnanec musí být také nahrazen sedmi takovými sloupci. To však není v tomto tutoriálu provedeno, aby se ušetřilo výukové místo a čas. Tabulka prodeje s daty tedy může být:

Prodejní tabulka – 2NF – Bez customerID

Sloupec datového typu SaleID je celé číslo nebo lépe automatický přírůstek. Datovým typem sloupce dateSold je datum, nikoli číslo, protože obsahuje znak „/“, což není číslice. Datový typ pro ostatní sloupce, včetně sloupce telefon, je řetězec (nebo text). Hodnota telefonu má znak „-“, což není číslice.

Všimněte si, že pro každý řádek byl zákazník (jméno), stejně jako v předchozí části série, nahrazen sedmi buňkami, z nichž jedna je stále jméno zákazníka. To znamená, že zákaznická data jsou entita. V současné době jméno zákazníka identifikuje svých dalších šest údajů v řadě. Pokud je tato tabulka naprogramována, bude vhodné identifikovat entitu zákazníka v každém řádku celým číslem (nikoli automatickým přírůstkem). V takovém případě by měl sloupec customerID předcházet customerName. Předchozí tabulka bude:

Prodejní tabulka – 2NF – S customerID

Existují tři zákaznická ID: 1, 2 a 3, přičemž 1 se vyskytuje pětkrát u Johna Smithe, 2 se vyskytuje dvakrát u Jamese Taylora a 3 se vyskytuje jednou u Susan Wrightové.

Všimněte si, že některá čísla zákazníků a jejich závislé osoby se opakují.

Pravidla pro třetí normální formulář

Tabulka je ve třetí normální formě, pokud dodržuje následující pravidla:

  1. Mělo by to být již ve druhé normální formě.
  2. A nemělo by mít tranzitivní závislost.

Pak se jeden z úředníků (zaměstnanců) ptá: „Co je to tranzitivní závislost?“. A vy, vývojář databáze, odpovíte: 'To je dobrá otázka!'

Tranzitivní závislost

Je pravda, že v řádku SaleID identifikuje všechny hodnoty v řádku; však customerID identifikuje svých sedm datových hodnot, ale neidentifikuje zbytek hodnot identifikovaných SaleID v tomto řádku. Jinak řečeno, SaleID závisí na deseti hodnotách buněk v každém řádku. CustomerID však závisí na sedmi hodnotách buňky ve stejném řádku, ale customerID nezávisí na SaleID a dalších hodnotách, na kterých SaleID závisí.

Taková závislost pro ID zákazníka je přechodná závislost. A customerID se nazývá cizí klíč a v této sérii výukových programů The Five Normal Forms je podtrženo pomlčkou.

Předpokládejme, že atribut, který není prvočíslem (hodnota jiné než primární buňky), závisí na jiných atributech, které nejsou prvočíslem, a dotyčný atribut, který není prvočíslem (např. customerID a jeho závislé osoby) nezávisí na primárním klíči a zbytku buňky. hodnoty v řádku. Pak je to tranzitivní závislost.

Předchozí tabulka Prodej s cizím klíčem a jeho závislými osobami by způsobila účetní problémy (anomálie).

Prodejní tabulka Od 2NF do 3NF

Chcete-li vyřešit problém způsobený cizím klíčem a jeho závislými osobami, odstraňte cizí klíč a jeho závislé osoby a vytvořte novou tabulku bez opakování. I když však cizí klíč nezávisí na primárním klíči, primární klíč závisí na cizím klíči. Kopie cizího klíče tedy musí zůstat v nadřazené tabulce. Nová prodejní tabulka v tomto bodě vyhovuje 1NF, 2NF a 3NF; je to nadřazená tabulka. Nová podřízená tabulka z předchozí tabulky Prodej je také kompatibilní s 1NF, 2NF a 3NF. Název podřízené tabulky s cizím klíčem a jejími závislými osobami je Zákazníci. Pokud nelze najít vhodný název, pak se v analýze něco pokazilo. Nová tabulka prodejů v 3NF je:

Konečná tabulka prodejů v 3NF

Tato tabulka v 3NF má stejný počet řádků jako v 2NF, ale má méně sloupců.

Zápis tabulky pro tuto konečnou prodejní tabulku v 3NF je:

Prodej (saleID, dateSold, customerID, zamestnanecID)

SalesID je primární klíč s jedním podtržením. customerID je cizí klíč s podtrženou pomlčkou. zaměstnanecID je také cizí klíč s podtrženou pomlčkou. Všimněte si, že situace zaměstnanců v tabulce Prodej v 2NF je stejná jako situace zákazníků. ID zaměstnance a jeho vlastní závislé osoby musí být odstraněny, aby se vytvořila další tabulka; zůstane kopie zaměstnaneckého ID.

Poznámka: salesID, customerID a zaměstnanecID netvoří složený klíč. salesID je závislé na customerID a zaměstnanecID.

Vztah mezi salesID a customerID je mnoho ku jedné.

Tabulka zákazníků v 3NF

Tato tabulka má tři řádky místo 9 řádků v tabulce Prodej 2NF. V této tabulce je customerID primární klíč. Je stejný jako cizí klíč v tabulce Prodej, ale bez opakování. Cizí klíč v tabulce Prodej a primární klíč v tabulce Zákazník propojují obě tabulky.

Opakované řádky v tabulce Zákazník byly odstraněny, aby nedošlo k porušení 1NF.

Jak čtenář vidí, vložení tabulky do 3NF by také vyřešilo problém opakovaných řádků (redundance).

Zápis tabulky pro tabulku zákazníků je:

Zákazníci (číslo zákazníka, jméno zákazníka, telefon, adresa, město, region, PSČ, země)

Znovu navštívená tabulka produktů

Tabulka produktů uvedená výše ve formě zápisu je:

Produkty (ID produktu, ID kategorie, ID dodavatele, název produktu, jednotková cena, množství na skladě, úroveň objednávky)

Primárním klíčem je zde productID. categoryID a SupplierID jsou cizí klíče. Podobně jako v tabulce Zákazník existuje tabulka Kategorie, kde je primární klíč categoryID, a existuje tabulka Dodavatel, kde je primární klíč dodavatelID.

Pokud hodnoty pro buňky pro jednotkovou cenu, množství na skladě a reorderLevel zůstanou pevné, pak je tabulka Products tak, jak je, skutečně v 3NF. Pokud se tyto hodnoty budou měnit, pak je tabulka Produkty tak, jak je, v 2NF. V této části série výukových programů se předpokládá, že tyto hodnoty zůstanou v průběhu času neměnné.

Všechny tabulky

Všechny tabulky jsou nyní v 3NF. Jsou zobrazeny jako:

Zaměstnanci (ID zaměstnance, jméno, telefon, adresa, město, region, PSČ, země, datum narození, datum nástupu, datum vydání)

Dodavatelé (ID dodavatele, jméno, telefon, adresa, město, region, PSČ, země)

Produkty (ID produktu, ID kategorie, ID dodavatele, název produktu, jednotková cena, množství na skladě, úroveň objednávky)
Kategorie (ID kategorie, název kategorie, popis)

Prodej (saleID, dateSold, customerID, zamestnanecID)
Podrobnosti o prodeji (ID prodeje, ID produktu, čísloProdáno, prodejní cena)
Zákazníci (číslo zákazníka, jméno zákazníka, telefon, adresa, město, region, PSČ, země)

Objednávky (ID objednávky, datum prodeje, ID dodavatele, ID zaměstnance)
Podrobnosti objednávky (ID objednávky, ID produktu, číslo Koupeno, cena)

Z jedné tabulky vytvořené nováčky bylo vyrobeno až devět profesionálních tabulek, aby se předešlo redundanci a problémům s účtováním (anomálie z vkládání, mazání a aktualizace). Samotný novicový stůl by vedl k finančním ztrátám.

Testování personálu

V tomto okamžiku by všichni zaměstnanci, včetně majitele, měli rozumět 1NF, 2NF a 3NF. Musí se však testovat. Všichni, včetně majitele, se posadí na různá místa a dokončí test. Test skládající se z jedné otázky zabere jednu hodinu a je následující:

Otázka: Pomocí pravidel pro 1NF, 2NF a 3NF dokažte, že všech výše uvedených devět tabulek je již v první normální formě, druhé normální formě a třetí normální formě. Zákazníci a dodavatelé nemusí být skutečnými subjekty. Data pro tabulky by měla zálohovat zápisy tabulek.

Zatímco oni dokončují test, vy jako vývojář databáze si jdete dát svačinu a pivo, abyste se po hodině vrátili.

Blízká a vzdálená budoucnost

Zatímco vy, vývojář databáze, jste mimo, také zvažujete, jakou radu jim dát, pokud všichni projdou testem.

Také, zatímco jste je školili a nyní, když procházejí testem, zákazníci přicházeli a odcházeli, aniž by byli obslouženi. To není dobré pro obchod a vy, vývojář databáze, to víte. Někteří zákazníci mohou jít do konkurenčních obchodů a nikdy se nevrátí.

Vám, vývojáři databáze, je 30 let. Majiteli, jako vašemu příteli, je také 30 let. Úředníci (zaměstnanci) jsou ve věku od 18 do 24 let. Všechny vlastnosti, které potřebovali k práci pro majitele, byly: být zdravý, umět číst a psát, umět sčítat, odčítat, násobit a dělit a mít možnost používat počítač a internet.

Když je tabulka v 3NF, většina zranitelností byla z databáze odstraněna. Mnoho komerčních databází nepřesahuje 3NF a firmy nebo společnosti jsou pohodlné.

Pokud tedy všichni projdou testem, požádáte úředníky, aby šli a pokračovali v práci. Také jim poradíte, aby si šetřili části svých platů, aby mohli vlastnit své večerky. Zítra budete pokračovat ve školení pouze majitele v 4NF a 5NF. Se znalostí 4NF a 5NF jsou odstraněny všechny známé zranitelnosti.

Hodnocení

Po hodině se vy, vývojář databáze, vrátíte. Označíte jejich scénáře. Skvělá zpráva! Všichni, včetně majitele, mají každý 100%. Hurá! To je vynikající!

Takže gratuluji vám všem: učiteli i žákům.

V tomto tutoriálu nezbývá nic jiného než uzavřít.

Závěr

Tabulka je v první normální formě, pokud neporušuje žádné z následujících pravidel:

  1. Všechny sloupce v tabulce by měly mít jedinečné názvy záhlaví.
  2. Každá buňka musí mít pouze jednu hodnotu.
  3. Hodnoty uložené ve sloupci by měly být stejného typu.
  4. Řádky by měly být odlišné.
  5. Na pořadí sloupců nebo řádků nezáleží.

Tabulka je ve druhé normální formě, pokud neporušuje žádné z následujících pravidel:

  1. Tabulka již musí být ve formátu First Normal Form.
  2. Nesmí existovat žádná částečná závislost.

Tabulka je ve třetí normální formě, pokud neporušuje žádné z následujících pravidel:

  1. Musí být již ve druhé normální formě.
  2. A nesmí mít tranzitivní závislost.

Vy, vývojář databáze, řekněte úředníkům, že se naučili dost. Poskytnete jim rady a požádáte je, aby se vrátili do práce a standardně zůstali na svých stanicích.

Domluvíte si schůzku pouze s majitelem, která se zítra uskuteční v jeho kanceláři na školení na 4NF a 5NF.