Tretia normálna forma

Tretia Normalna Forma



Toto je tretia časť série, Päť normálnych foriem. Názvy prvých dvoch častí (návodov) sú Prvá normálna forma, po ktorej nasleduje Druhá normálna forma. V tejto časti seriálu je vysvetlená Tretia normálna forma.

Vysvetlenie sleduje dejovú líniu: Otec zomrel a zanechal nejaké peniaze pre svojho syna. Syn sa rozhodol investovať peniaze do večerky. Obchod so zmiešaným tovarom, tiež známy ako obchod so zmiešaným tovarom, je malý maloobchodný podnik, ktorý prijíma každodenné predmety od dodávateľov a predáva ich jednotlivým zákazníkom v susedstve.







V tejto chvíli je obchod už naskladnený a už sa uskutočnili nejaké výpredaje. Syn, ktorý je majiteľom podniku, má niekoľko zamestnancov, ktorí sa v tomto návode nazývajú úradníci. Majiteľ a ktorýkoľvek zamestnanec môže prijímať zásoby a uskutočňovať predaj po zaznamenaní produktov.



Pred spustením predajne však ani majiteľ, ani zamestnanci nevedeli nič o bežných formách. Takže všetko zaznamenávali ako transakcie do jednej tabuľky a jedného zošita. Nemali počítač.



Vy, čitatelia, ste dokončili päť častí tejto série tutoriálov; teraz ste vývojár databázy. Majiteľ obchodu so zmiešaným tovarom je váš priateľ. Pred dvoma dňami ste navštívili obchod a zaškolili majiteľa a predavačov na výrobu stola v jeho prvej normálnej podobe. Včera ste tiež navštívili predajňu a zaškolili ste ich, ako z prvej normálnej formy vytvoriť tabuľku v druhej normálnej forme.





Dnes ste práve prišli na návštevu do obchodu, aby ste ich zaškolili, ako vyrobiť stôl v tretej normálnej forme z druhej normálnej formy. Všetky tabuľky, ktoré v súčasnosti majú, sú v druhej normálnej forme. Tabuľky (podľa názvu a nadpisov stĺpcov) sú:

Produkty(productID, categoryID, product)
Categories(categoryID, category)



Predaj (ID predaja, zákazník, zamestnanec, dátum)
Podrobnosti o predaji (ID predaja, ID produktu, čísloPredané, predajná cena)

Objednávky (ID objednávky, dodávateľ, zamestnanec, dátum)
Podrobnosti objednávky(ID objednávky, ID produktu, čísloKúpené, cena)

Jednotlivé alebo zložené klávesy sú podčiarknuté.

Po zhrnutí toho, čo sa učili v predchádzajúcich dvoch dňoch a predtým, ako ste mohli čokoľvek urobiť, sa majiteľ pýta:

„A čo telefónne čísla, adresy atď. pre zákazníkov a zamestnancov?

A čo množstvo na sklade, úroveň doobjednania atď. pri produktoch?
Potrebujú svoje vlastné samostatné stoly, alebo by sa mali umiestniť do súčasných stolov?

Vy, vývojár databázy, odpovedzte:

„Gratulujem, majiteľ! Nepriamo ste uviedli problém tretej normálnej formy.“

pokračuješ.

Ďalšie potrebné stĺpce

Ďalšie potrebné stĺpce sa najskôr dopĺňajú do predchádzajúcich tabuliek, ktoré sú v 1NF a 2NF. Niektoré z predchádzajúcich názvov stĺpcov sú upravené.

Tabuľka Kategórie by mala obsahovať minimálne tieto stĺpce:

Categories(categoryID, categoryName, description)

Popis je krátky odsek, ktorý popisuje kategóriu. Táto tabuľka kategórií je už v 1NF, 2NF a 3NF. 3NF je vysvetlené nižšie:

Tabuľka Produkty by mala obsahovať minimálne tieto stĺpce:

Produkty (ID produktu, ID kategórie, ID dodávateľa, názov produktu, jednotková cena, množstvo na sklade, úroveň objednávky)

Keďže sa každý produkt predáva, pri objednávke produktu sa dosiahne nízka úroveň (počet) produktov, takže zákazníci by nemali prísť do obchodu a produkt by nemali mať. Takáto absencia nie je dobrá pre podnikanie. množstvoNa sklade je počet konkrétneho produktu na sklade. To zahŕňa to, čo je v obchode a čo je na polici.

categoryID a SupplierID sú cudzie kľúče. Preto majú namiesto jednoduchého podčiarknutia čiarkované. Cudzí kľúč je vysvetlený nižšie. V predchádzajúcej časti série (Druhá normálna forma) bolo categoryID súčasťou primárneho kľúča s jedným podčiarknutím kvôli tomu, ako sa k nemu dospelo. Z vysvetlenia nižšie by však bolo jasné, že categoryID by mal byť cudzí kľúč (s pomlčkou podčiarknutý).

Táto tabuľka produktov je už v 1NF, 2NF a 3NF. Pozrite sa, prečo je to v 3NF nižšie:

Tabuľka SaleDetails by mala obsahovať minimálne tieto stĺpce:

Podrobnosti o predaji (ID predaja, ID produktu, jednotkováPredajná cena, množstvo, zľava)

Očakáva sa, že hodnota diskontu bude väčšinou nula. Zľava je zľava, ktorú obchod poskytuje zákazníkovi.

Tabuľka OrderDetails by mala mať minimálne tieto stĺpce:

Podrobnosti objednávky (ID objednávky, ID produktu, jednotkováCena, množstvo, zľava)

Očakáva sa, že hodnota diskontu bude väčšinou nula. Zľava je tu zľava, ktorú dodávateľ poskytuje obchodu.

Ako je vidieť nižšie, tabuľku produktov možno považovať za 2NF alebo 3NF. Tabuľky Predaj a Objednávka majú vydanie 3NF. Na vysvetlenie problému a riešenia bude použitá iba tabuľka predaja. Tabuľka 3NF pre tabuľku objednávok a tabuľku produktov vychádza z podobného zdôvodnenia a bola by len citovaná.

Pri pridávaní stĺpcov bude tabuľka Predaj vyzerať takto:

Predaj (ID predaja, dátumPredané meno zákazníka, telefón, adresa, mesto, región, PSČ, krajina, zamestnanec)

Sedem stĺpcov nahradilo stĺpec Zákazník v pôvodnej tabuľke. Keďže zákazníkmi sú ľudia v susedstve, bunky pre mesto, región (štát), PSČ a krajinu môžu zostať prázdne, aj keď v tomto článku nie sú prázdne.

Táto tabuľka predaja je stále v 2NF, pretože pravidlá 1NF ani 2NF neboli porušené. Treba si však uvedomiť, že v riadku tabuľky Predaj bol zákazník (názov) nahradený siedmimi bunkami riadku zákazníka.

Poznámka: Bunka adresy obsahuje číslo domu, názov ulice alebo cesty a názov mesta, všetko oddelené čiarkami. Mesto možno považovať za tvorené niekoľkými mestami. Hoci čiarky oddeľujú tieto konkrétne zložky reťazca, tvoria jednu bunkovú hodnotu a nie tri bunkové hodnoty.

Stĺpec Zamestnanec sa tiež musí nahradiť siedmimi takýmito stĺpcami. To sa však v tomto návode nerobí, aby sa ušetril čas a priestor pri výučbe. Tabuľka predaja s údajmi teda môže byť:

Tabuľka predaja – 2NF – Bez customerID

Stĺpec s typom údajov SaleID je celé číslo alebo, lepšie, automatický prírastok. Typ údajov stĺpca dateSold je dátum a nie číslo, pretože obsahuje znak „/“, čo nie je číslica. Typ údajov pre ostatné stĺpce vrátane stĺpca telefón je reťazec (alebo text). Hodnota telefónu má znak „-“, čo nie je číslica.

Všimnite si, že pre každý riadok bol zákazník (meno), ako to bolo v predchádzajúcej časti série, nahradený siedmimi bunkami, z ktorých jedna je stále meno zákazníka. To znamená, že údaje o zákazníkoch sú entita. V súčasnosti názov zákazníka identifikuje svojich ďalších šesť údajov v rade. Ak je táto tabuľka naprogramovaná, bude vhodné identifikovať entitu zákazníka v každom riadku celým číslom (nie automatickým prírastkom). V takom prípade by mal stĺpec customerID predchádzať customerName. Predchádzajúca tabuľka bude:

Tabuľka predaja – 2NF – S customerID

Existujú tri zákaznícke ID: 1, 2 a 3, pričom 1 sa vyskytuje päťkrát pre Johna Smitha, 2 sa vyskytuje dvakrát pre Jamesa Taylora a 3 sa vyskytuje raz pre Susan Wrightovú.

Všimnite si, že niektoré zákaznícke ID a ich závislé osoby sa opakujú.

Pravidlá pre tretí normálny formulár

Tabuľka je v tretej normálnej forme, ak spĺňa nasledujúce pravidlá:

  1. Malo by to byť už v Druhej normálnej forme.
  2. A nemalo by mať prechodnú závislosť.

Potom sa jeden z úradníkov (zamestnancov) pýta: „Čo je to tranzitívna závislosť?“. A vy, vývojár databázy, odpoviete: 'To je dobrá otázka!'

Tranzitívna závislosť

Je pravda, že v riadku SaleID identifikuje všetky hodnoty v riadku; CustomerID však identifikuje svojich sedem údajových hodnôt, ale neidentifikuje zvyšné hodnoty identifikované SaleID v danom riadku. Inak povedané, SaleID závisí od desiatich hodnôt buniek v každom riadku. CustomerID však závisí od siedmich hodnôt buniek v rovnakom riadku, ale customerID nezávisí od SaleID a ostatných hodnôt, od ktorých SaleID závisí.

Takáto závislosť pre ID zákazníka je prechodná závislosť. A customerID sa nazýva cudzí kľúč a v tejto sérii tutoriálov The Five Normal Forms je podčiarknuté pomlčkou.

Predpokladajme, že atribút, ktorý nie je prvočíslom (hodnota inej ako primárnej bunky) závisí od iných atribútov, ktoré nie sú prvočíslom, a príslušný atribút, ktorý nie je prvočíslom (napr. customerID a jeho závislé osoby) nezávisí od primárneho kľúča a zvyšku bunky. hodnoty v riadku. Potom je to tranzitívna závislosť.

Predchádzajúca tabuľka Predaj s cudzím kľúčom a jeho závislými osobami by spôsobila účtovné problémy (anomálie).

Predajná tabuľka od 2NF do 3NF

Ak chcete vyriešiť problém, ktorý predstavuje cudzí kľúč a jeho závislé osoby, odstráňte cudzí kľúč a jeho závislé osoby, aby ste vytvorili novú tabuľku bez opakovaní. Avšak aj keď cudzí kľúč nezávisí od primárneho kľúča, primárny kľúč závisí od cudzieho kľúča. Takže kópia cudzieho kľúča musí zostať v nadradenej tabuľke. Nová predajná tabuľka v tomto bode vyhovuje 1NF, 2NF a 3NF; je to nadradená tabuľka. Nová podradená tabuľka z predchádzajúcej tabuľky Predaj je tiež kompatibilná s 1NF, 2NF a 3NF. Názov podriadenej tabuľky s cudzím kľúčom a jej závislými osobami je Zákazníci. Ak nie je možné nájsť vhodný názov, potom sa v analýze niečo pokazilo. Nová tabuľka predaja v 3NF je:

Konečná tabuľka predaja v 3NF

Táto tabuľka v 3NF má rovnaký počet riadkov ako v 2NF, ale s menším počtom stĺpcov.

Zápis tabuľky pre túto konečnú tabuľku predaja v 3NF je:

Predaj(saleID, dateSold, customerID, zamestnanecID)

SalesID je primárny kľúč s jedným podčiarknutím. customerID je cudzí kľúč s podčiarknutou pomlčkou. zamestnanec ID je tiež cudzí kľúč s podčiarknutým pomlčkou. Všimnite si, že situácia zamestnanca v tabuľke Predaj v 2NF je rovnaká ako situácia zákazníka. ID zamestnanca a jeho vlastné závislé osoby sa musia stiahnuť, aby sa vytvorila ďalšia tabuľka; zostane kópia zamestnaneckého ID.

Poznámka: saleID, customerID a zamestnanec ID netvoria zložený kľúč. saleID závisí od customerID a zamestnanecID.

Vzťah medzi saleID a customerID je mnohonásobný.

Tabuľka zákazníkov v 3NF

Táto tabuľka má tri riadky namiesto 9 riadkov v tabuľke 2NF Sales. V tejto tabuľke je customerID primárnym kľúčom. Je rovnaký ako cudzí kľúč v tabuľke Predaj, ale bez opakovaní. Cudzí kľúč v tabuľke Predaj a primárny kľúč v tabuľke Zákazník spájajú obe tabuľky.

Opakované riadky v tabuľke Zákazník boli odstránené, aby nedošlo k porušeniu 1NF.

Ako čitateľ vidí, vloženie tabuľky do 3NF by tiež vyriešilo problém opakovaných riadkov (redundancia).

Zápis tabuľky pre tabuľku zákazníkov je:

Zákazníci (ID zákazníka, meno zákazníka, telefón, adresa, mesto, región, PSČ, krajina)

Tabuľka produktov bola znovu navštívená

Tabuľka produktov uvedená vyššie vo forme zápisu je:

Produkty (ID produktu, ID kategórie, ID dodávateľa, názov produktu, jednotková cena, množstvo na sklade, úroveň objednávky)

Primárny kľúč je tu productID. categoryID a SupplierID sú cudzie kľúče. Podobne ako v tabuľke Zákazník existuje tabuľka Kategórie, kde categoryID je primárny kľúč, a existuje tabuľka Supplier, kde SupplierID je primárny kľúč.

Ak hodnoty buniek pre jednotkovú cenu, množstvo na sklade a úroveň opätovného poradia zostanú nemenné, potom je tabuľka Produkty skutočne v 3NF. Ak sa tieto hodnoty budú meniť, potom je tabuľka Produkty tak, ako je, v 2NF. V tejto časti série tutoriálov sa predpokladá, že tieto hodnoty zostanú v priebehu času nemenné.

Všetky tabuľky

Všetky tabuľky sú teraz v 3NF. Sú zobrazené ako:

Zamestnanci (ID zamestnanca, meno, telefón, adresa, mesto, región, PSČ, krajina, dátum narodenia, dátum prijatia, dátum uvoľnenia)

Dodávatelia (ID dodávateľa, meno, telefón, adresa, mesto, región, PSČ, krajina)

Produkty (ID produktu, ID kategórie, ID dodávateľa, názov produktu, jednotková cena, množstvo na sklade, úroveň objednávky)
Categories(categoryID, categoryName, description)

Predaj(saleID, dateSold, customerID, zamestnanecID)
Podrobnosti o predaji (ID predaja, ID produktu, čísloPredané, predajná cena)
Zákazníci (ID zákazníka, meno zákazníka, telefón, adresa, mesto, región, PSČ, krajina)

Objednávky (ID objednávky, dátum predaja, ID dodávateľa, ID zamestnanca)
Podrobnosti objednávky(ID objednávky, ID produktu, čísloKúpené, cena)

Z jednej tabuľky vyrobenej nováčikmi bolo vyrobených až deväť profesionálnych tabuliek, aby sa predišlo redundancii a problémom s účtovaním (anomálie pri vkladaní, vymazávaní a aktualizácii). Samotný nováčik by viedol k finančným stratám.

Testovanie personálu

V tomto bode by všetci zamestnanci vrátane majiteľa mali pochopiť 1NF, 2NF a 3NF. Treba ich však otestovať. Všetci, vrátane majiteľa, budú sedieť na rôznych miestach a dokončiť test. Test pozostávajúci z jednej otázky bude trvať jednu hodinu a je nasledovný:

Otázka: Pomocou pravidiel pre 1NF, 2NF a 3NF dokážte, že všetkých vyššie uvedených deväť tabuliek je už v prvej normálnej forme, druhej normálnej forme a tretej normálnej forme. Zákazníci a dodávatelia nemusia byť skutočnými subjektmi. Údaje pre tabuľky by mali zálohovať zápisy tabuliek.

Zatiaľ čo oni dokončujú test, vy, ako vývojár databázy, sa idete občerstviť a napiť piva, aby ste sa po hodine vrátili.

Blízka a vzdialená budúcnosť

Zatiaľ čo vy, vývojár databázy, ste mimo, tiež zvažujete, akú radu im dať, ak všetci prejdú testom.

Okrem toho, zatiaľ čo ste ich školili a teraz, keď absolvujú test, zákazníci prichádzajú a odchádzajú bez toho, aby ich niekto obslúžil. To nie je dobré pre podnikanie a vy, vývojár databázy, to viete. Niektorí zákazníci môžu ísť do konkurenčných obchodov a už sa nevrátia.

Vy, vývojár databázy, máte 30 rokov. Majiteľ, ako váš priateľ, má tiež 30 rokov. Úradníci (zamestnanci) sú vo veku od 18 do 24 rokov. Všetky vlastnosti, ktoré potrebovali na prácu pre majiteľa, boli: byť zdravý, vedieť čítať a písať, vedieť sčítať, odčítať, násobiť a deliť a aby ste mohli používať počítač a internet.

Keď je tabuľka v 3NF, väčšina zraniteľností bola z databázy odstránená. Mnoho komerčných databáz nepresahuje rámec 3NF a firmy alebo spoločnosti sú pohodlné.

Ak teda všetci prejdú testom, požiadate úradníkov, aby išli pokračovať v práci. Tiež im poradíte, aby si ušetrili časti svojich platov, aby mohli vlastniť svoje obchody so zmiešaným tovarom. Zajtra budete pokračovať v školení iba majiteľa v 4NF a 5NF. So znalosťou 4NF a 5NF sú odstránené všetky známe zraniteľnosti.

Hodnotenie

Po hodine sa vy, vývojár databázy, vrátite. Označíte ich scenáre. Skvelá správa! Všetci, vrátane majiteľa, majú každý 100%. Hurá! To je vynikajúce!

Takže vám všetkým blahoželám: pani učiteľke aj žiakom.

V tomto návode nezostáva nič iné, len to uzavrieť.

Záver

Tabuľka je v prvej normálnej forme, ak neporušuje žiadne z nasledujúcich pravidiel:

  1. Všetky stĺpce v tabuľke by mali mať jedinečné názvy hlavičiek.
  2. Každá bunka musí mať iba jednu hodnotu.
  3. Hodnoty uložené v stĺpci by mali byť rovnakého typu.
  4. Riadky by mali byť odlišné.
  5. Na poradí stĺpcov alebo riadkov nezáleží.

Tabuľka je v druhom normálnom tvare, ak neporušuje žiadne z nasledujúcich pravidiel:

  1. Tabuľka už musí byť v prvej normálnej forme.
  2. Nesmie existovať čiastočná závislosť.

Tabuľka je v tretej normálnej forme, ak neporušuje žiadne z nasledujúcich pravidiel:

  1. Musí byť už v Druhej normálnej forme.
  2. A nesmie mať prechodnú závislosť.

Vy, vývojár databázy, povedzte úradníkom, že sa naučili dosť. Poskytnete im radu a požiadate ich, aby sa vrátili do práce a štandardne zostali na svojich staniciach.

Dohodnete si stretnutie iba s majiteľom, ktoré sa uskutoční zajtra v jeho kancelárii na školenie o 4NF a 5NF.