Kolmas normaalvorm

Kolmas Normaalvorm



See on sarja 'Viis tavavormi' kolmas osa. Kahe esimese osa (õpetuste) pealkirjad on esimene normaalvorm, millele järgneb teine ​​normaalvorm. Sarja selles osas selgitatakse kolmandat tavavormi.

Seletus järgib loo joont: Isa on surnud ja on jätnud oma poja jaoks raha. Poeg otsustas raha paigutada lähikauplusesse. Esmatarbekaupade pood, tuntud ka kui esmatarbekauplus, on väike jaemüügiettevõte, mis võtab tarnijatelt vastu igapäevaseid esemeid ja müüb neid naabruses asuvatele üksikklientidele.







Sel hetkel on poes juba varusid ja mõned müügid on juba tehtud. Pojal, kes on ettevõtte omanik, on mõned töötajad, keda selles õpetuses nimetatakse ametnikeks. Omanik ja iga töötaja saavad pärast toodete registreerimist tarneid vastu võtta ja müüki teha.



Kuid enne poe algust ei teadnud omanik ega töötajad tavavormidest midagi. Seega salvestasid nad kõik tehingutena ühte tabelisse ja ühte vihikusse. Neil polnud arvutit.



Teie, lugeja, olete lõpetanud selle õpetussarja viis osa; olete nüüd andmebaasi arendaja. Lähikaupluse omanik on teie sõber. Külastasite kauplust kaks päeva tagasi ja koolitasite omanikku ja ametnikke laua valmistamisel selle esimesel tavalisel kujul. Külastasite ka eile poodi ja koolitasite neid, kuidas esimesest normaalvormist teise normaalkuju tabelit luua.





Täna jõudsite just poodi külla, et koolitada neid, kuidas toota teisest normaalvormist kolmandat normaalvormi lauda. Kõik tabelid, mis neil praegu on, on teisel normaalkujul. Tabelid (nime ja veergude pealkirjade järgi) on järgmised:

Tooted (tooteID, kategooriaID, toode)
Kategooriad (kategooria ID, kategooria)



Müük (müügi ID, klient, töötaja, kuupäev)
Müügi üksikasjad (müügiID, toote ID, numberMüüdud, müügihind)

Tellimused (tellimuse ID, tarnija, töötaja, kuupäev)
Tellimuse üksikasjad (tellimuse ID, toote ID, ostetud number, omahind)

Üksik- või liitklahvid on alla joonitud.

Pärast kahe eelneva päeva jooksul õpetatu kokkuvõtmist ja enne, kui jõudsite midagi ette võtta, küsib omanik:

“Aga klientide ja töötajate telefoninumbrid, aadressid jne?

Kuidas on lood laos oleva koguse, kordustellimuste taseme jne toodetega?
Kas nad vajavad oma eraldi laudu või tuleks need sobitada praegustesse laudadesse?

Teie, andmebaasi arendaja, vastate:

„Palju õnne, omanik! Olete kaudselt tutvustanud kolmanda normaalvormi probleemi.

Sa jätkad.

Muud vajalikud veerud

Muud vajalikud veerud lisatakse esmalt eelmistesse tabelitesse, mis on 1NF ja 2NF. Mõned eelmiste veergude nimed on muudetud.

Tabelis Kategooriad peaksid olema vähemalt järgmised veerud:

Kategooriad (kategooria ID, kategooria nimi, kirjeldus)

Kirjeldus on lühike lõik, mis kirjeldab kategooriat. See kategooriatabel on juba kategooriates 1NF, 2NF ja 3NF. 3NF on selgitatud allpool:

Tabelis Tooted peaksid olema vähemalt järgmised veerud:

Tooted (tooteID, kategooria ID, tarnija ID, tootenimi, ühikuhind, laos olev kogus, uuesti tellimise tase)

Kuna iga toode on müügil, saavutatakse toodete madal tase (arv), kui toode tuleb uuesti tellida, seega ei tohiks kliendid poodi tulla ja toodet käest võtta. Selline puudumine ei ole ärile hea. mennyiségInStock on konkreetse toote arv laos. See hõlmab seda, mis on poes ja mis on riiulil.

categoryID ja tarnija ID on võõrvõtmed. Seetõttu on neil kriipskriips, mitte ühekordne allajoon. Võõrvõtit on selgitatud allpool. Sarja eelmises osas (teine ​​tavavorm) kuulus kategooriaID primaarvõtmesse ühe allajoonitud võtmega, mis tulenes selleni jõudmisest. Allolevast selgitusest oleks aga selge, et kategooria ID peaks olema võõrvõti (kriipsu allakriipsuga).

See toodete tabel on juba 1NF, 2NF ja 3NF. Vaadake, miks see on 3NF-is allpool:

Tabelis SaleDetails peaksid olema vähemalt järgmised veerud.

Müügi üksikasjad (müügiID, toote ID, ühiku müügihind, kogus, allahindlus)

Eeldatavasti on allahindluse väärtus enamasti null. Allahindlus on allahindlus, mille pood kliendile annab.

Tabelis OrderDetails peaksid olema vähemalt järgmised veerud:

Tellimuse üksikasjad (tellimuse ID, toote ID, ühiku maksumus, kogus, allahindlus)

Eeldatavasti on allahindluse väärtus enamasti null. Siin on allahindlus allahindlus, mille tarnija poele annab.

Nagu allpool näha, võib toodete tabelit käsitleda 2NF või 3NF puhul. Müügi- ja tellimustabelites on 3NF probleem. Probleemi ja lahenduse selgitamiseks kasutatakse ainult müügitabelit. 3NF tellimuste tabel ja toodete tabel järgivad sarnaseid arutluskäike ja neid lihtsalt tsiteeritakse.

Veergude lisamisel oleks müügitabel järgmine:

Müük (müügiID, müügikuupäev, kliendi nimi, telefon, aadress, linn, piirkond, sihtnumber, riik, töötaja)

Algses tabelis on kliendi veeru asendatud seitse veergu. Kuna kliendid on naabruskonnas olevad inimesed, võib linna, piirkonna (osariigi), sihtnumbri ja riigi veerud tühjaks jätta, kuigi käesolevas artiklis neid tühjaks ei jäeta.

See müügitabel on endiselt 2NF-is, kuna nii 1NF kui ka 2NF reegleid ei ole rikutud. Siiski tuleb mõista, et müügitabeli real on klient (nimi) asendatud seitsme kliendirea lahtriga.

Märkus: aadressilahtris on maja number, tänava või tee nimi ja linna nimi, mis on kõik komadega eraldatud. Linna võib pidada mitmest linnast koosnevaks. Kuigi need konkreetsed stringikomponendid eraldavad komadega, moodustavad need ühe lahtri väärtuse, mitte kolme lahtri väärtuse.

Ka töötajate veerg tuleb asendada seitsme sellise veeruga. Seda ei tehta selles õpetuses aga õppetöö aja ja ruumi säästmiseks. Seega võib andmetega müügitabel olla:

Müügitabel – 2NF – Ilma kliendi IDta

Andmetüübi SaleID veerg on täisarv või, parem, automaatne juurdekasv. Veeru dateSold andmetüüp on kuupäev, mitte number, kuna sellel on märk „/”, mis ei ole number. Ülejäänud veergude, sealhulgas telefoniveeru, andmetüüp on string (või tekst). Telefoni väärtuses on märk '-', mis ei ole number.

Pange tähele, et iga rea ​​puhul on klient (nimi), nagu seeria eelmises osas, asendatud seitsme lahtriga, millest üks on endiselt kliendi nimi. See tähendab, et kliendiandmed on üksus. Praegu identifitseerib kliendinimi tema ülejäänud kuus reas olevat andmeid. Kui see tabel on programmeeritud, on mugav identifitseerida kliendi olem igal real täisarvuga (mitte automaatne juurdekasv). Sel juhul peaks kliendi ID veerg eelnema veerule customerName. Eelmisest tabelist saab:

Müügitabel – 2NF – Kliendi ID-ga

Kliendi ID-sid on kolm: 1, 2 ja 3, kusjuures 1 esineb viis korda John Smithi puhul, 2 esineb kaks korda James Taylori puhul ja 3 kordus Susan Wrighti puhul.

Pange tähele, et mõned kliendi ID-d ja nendest sõltuvad isikud korduvad.

Kolmanda normaalvormi reeglid

Tabel on kolmandal normaalvormil, kui see järgib järgmisi reegleid:

  1. See peaks olema juba teises normaalvormis.
  2. Ja sellel ei tohiks olla transitiivset sõltuvust.

Seejärel küsib üks ametnikest (töötajatest): 'Mis on transitiivne sõltuvus?'. Ja teie, andmebaasi arendaja, vastate: 'See on hea küsimus!'

Transitiivne sõltuvus

On tõsi, et reas tuvastab SaleID kõik reas olevad väärtused; kliendi ID tuvastab siiski oma seitse andmeväärtust, kuid ei tuvasta ülejäänud SaleID-ga sellel real tuvastatud väärtusi. Teisisõnu sõltub SaleID igas reas kümnest lahtri väärtusest. Samas sõltub kliendi ID seitsmest lahtri väärtusest samas reas, kuid kliendi ID ei sõltu SaleID-st ja muudest väärtustest, millest SaleID sõltub.

Selline sõltuvus kliendi ID jaoks on transitiivne sõltuvus. Ja kliendi ID-d nimetatakse võõrvõtmeks ja see on selles õpetusesarjas Viis tavavormi kriipsuga alla joonitud.

Oletame, et atribuut, mis ei ole esmane atribuut (mitte-prime lahtri väärtus) sõltub muudest mitte-algalistest atribuutidest ja kõnealune mittealgne atribuut (nt kliendi ID ja sellest sõltuvad isikud) ei sõltu primaarvõtmest ja ülejäänud lahtrist väärtused reas. Siis on see transitiivne sõltuvus.

Eelmine Müügitabel välisvõtme ja selle sõltujatega tekitaks raamatupidamisprobleeme (anomaaliaid).

Müügitabel 2NF kuni 3NF

Välisvõtme ja sellest sõltuvate isikute tekitatud probleemi lahendamiseks eemaldage võõrvõti ja sellest sõltuvad isikud, et moodustada uus kordusteta tabel. Kuid isegi kui võõrvõti ei sõltu primaarvõtmest, sõltub primaarvõti võõrvõtmest. Seega peab võõrvõtme koopia jääma ematabelisse. Uus müügitabel on praegusel hetkel 1NF, 2NF ja 3NF ühilduv; see on vanemtabel. Uus alamtabel eelmisest müügitabelist on samuti ühilduv 1NF, 2NF ja 3NF-iga. Välisvõtmega alamtabeli nimi ja sellest sõltuvad isikud on Kliendid. Kui sobivat nime ei leita, siis on analüüsiga midagi valesti läinud. Uus müügitabel 3NF-is on:

Lõplik müügitabel 3NF-is

Sellel 3NF-i tabelis on sama arv ridu kui 2NF-i tabelis, kuid vähem veerge.

Selle lõpliku müügitabeli tähistus 3NF-is on järgmine:

Müük (müügiID, müügikuupäev, kliendi ID, töötaja ID)

SaleID on primaarvõti, millel on üks allajoon. customerID on võõrvõti, kriipsuga alla joonitud. töötaja ID on ka sidekriipsuga allajoonitud võõrvõti. Pange tähele, et töötajate olukord müügitabelis 2NF-is on sama, mis kliendi olukord. Teise tabeli moodustamiseks tuleb töötaja ID ja tema enda ülalpeetavad välja tõmmata; töötaja ID koopia jääb alles.

Märkus: müügiID, kliendi ID ja töötaja ID ei moodusta liitvõtit. müügiID sõltub kliendi ID-st ja töötaja ID-st.

Müügi-ID ja kliendi ID suhe on mitmekülgne.

Kliendilaud 3NF-is

Selles tabelis on 2NF müügi tabelis 9 rea asemel kolm rida. Selles tabelis on kliendi ID esmane võti. See on sama mis välisvõti tabelis Müük, kuid ilma kordusteta. Võõrvõti tabelis Müük ja primaarvõti tabelis Klient seovad mõlemad tabelid.

Klientide tabelist on korduvad read eemaldatud, et mitte rikkuda 1NF-i.

Nagu lugeja näeb, lahendaks tabeli 3NF-i panemine ka korduvate ridade probleemi (liigne).

Klientide tabeli tabeli tähistus on järgmine:

Kliendid (kliendi ID, kliendinimi, telefon, aadress, linn, piirkond, sihtnumber, riik)

Toodete tabel uuesti läbi vaadatud

Ülaltoodud toodete tabel märgistuse kujul on järgmine:

Tooted (tooteID, kategooria ID, tarnija ID, tootenimi, ühikuhind, laos olev kogus, uuesti tellimise tase)

Esmane võti on siin productID. categoryID ja tarnija ID on võõrvõtmed. Sarnaselt kliendi tabeliga on ka tabel Kategooriad, kus kategooria ID on primaarvõti, ja tarnija tabel, kus tarnija ID on primaarvõti.

Kui lahtrite väärtused unitPrice, kvantitatiivselt laos ja reorderLevel jäävad fikseerituks, on tabel Tooted, nagu see on, tõesti 3NF-s. Kui need väärtused muutuvad, on tabel Tooted, nagu see on, 2NF-s. Õpetuste seeria selles osas eeldatakse, et need väärtused jäävad aja jooksul fikseerituks.

Kõik lauad

Kõik lauad on nüüd 3NF-is. Neid näidatakse järgmiselt:

Töötajad (töötaja ID, nimi, telefon, aadress, linn, piirkond, sihtnumber, riik, sünnikuupäev, töölevõtmise kuupäev, vabastamise kuupäev)

Tarnijad (tarnija ID, nimi, telefon, aadress, linn, piirkond, sihtnumber, riik)

Tooted (tooteID, kategooria ID, tarnija ID, tootenimi, ühikuhind, laos olev kogus, uuesti tellimise tase)
Kategooriad (kategooria ID, kategooria nimi, kirjeldus)

Müük (müügiID, müügikuupäev, kliendi ID, töötaja ID)
Müügi üksikasjad (müügiID, toote ID, numberMüüdud, müügihind)
Kliendid (kliendi ID, kliendinimi, telefon, aadress, linn, piirkond, sihtnumber, riik)

Tellimused (tellimuse ID, müügikuupäev, tarnija ID, töötaja ID)
Tellimuse üksikasjad (tellimuse ID, toote ID, ostetud number, omahind)

Ühest algajate toodetud tabelist on toodetud kuni üheksa professionaalset tabelit, et vältida koondamis- ja raamatupidamisprobleeme (anomaaliaid sisestamisel, kustutamisel ja värskendamisel). Ainuüksi algajate laud tooks kaasa rahalise kahju.

Personali testimine

Sel hetkel peaksid kõik töötajad, sealhulgas omanik, mõistma 1NF, 2NF ja 3NF. Neid tuleb siiski testida. Kõik nad, sealhulgas omanik, istuvad erinevates kohtades ja sooritavad testi. Ühest küsimusest koosnev test kestab ühe tunni ja on järgmine:

Küsimus: Kasutades reegleid 1NF, 2NF ja 3NF jaoks, tõestage, et kõik ülaltoodud üheksa tabelit on juba esimesel normaalvormil, teisel normaalvormil ja kolmandal normaalvormil. Kliendid ja tarnijad ei pea olema tegelikud üksused. Tabelite andmed peaksid varundama tabeli tähistusi.

Testi täitmise ajal lähete teie kui andmebaasi arendaja välja suupisteid ja õlut jooma, et naasta ühe tunni pärast.

Lähi- ja kauge tulevik

Kui teie, andmebaasi arendaja, olete väljas, kaalute ka, millist nõu anda neile, kui nad kõik testi läbivad.

Samal ajal, kui te neid koolitasite ja nüüd, mil nad testi sooritavad, on kliendid tulnud ja lahkunud ilma teenindamata. See ei ole ärile hea ja teie, andmebaasi arendaja, teate seda. Mõned kliendid võivad minna konkureerivate kaupluste juurde ega tule enam tagasi.

Teie, andmebaasi arendaja, olete 30-aastane. Omanik kui teie sõber on samuti 30-aastane. Asjapidajad (töötajad) on vanuses 18–24. Kõik omadused, mida nad omaniku heaks töötamiseks vajasid, olid järgmised: olla terve, osata lugeda ja kirjutada, osata liita, lahutada, korrutada ja jagada. ning arvuti ja Interneti kasutamise oskus.

Kui tabel on 3NF-is, on enamik turvaauke andmebaasist eemaldatud. Paljud kommertsandmebaasid ei ületa 3NF-i ja ettevõtted või ettevõtted on mugavad.

Seega, kui nad kõik testi läbivad, palute ametnikel minna ja jätkata tööd. Samuti soovitate neil säästa osa oma palgast, et nad saaksid oma esmatarbekaupu omada. Jätkate homme, et koolitada ainult omanikku 4NF ja 5NF. 4NF ja 5NF teadmisel eemaldatakse kõik teadaolevad haavatavused.

Hindamine

Ühe tunni pärast tulete tagasi teie, andmebaasi arendaja. Sa märgid nende skriptid. Üks suurepärane uudis! Neil kõigil, sealhulgas omanikul, on igaühel 100%. Hurraa! See on suurepärane!

Nii et palju õnne teile kõigile: õpetajale ja õpilastele.

Selles õpetuses ei jää muud üle, kui teha järeldusi.

Järeldus

Tabel on esimesel normaalvormil, kui see ei riku ühtki järgmistest reeglitest:

  1. Kõigil tabeli veergudel peavad olema kordumatud päisenimed.
  2. Igal lahtril peab olema ainult üks väärtus.
  3. Veerus salvestatud väärtused peavad olema sama tüüpi.
  4. Ridad peaksid olema eristatavad.
  5. Veergude või ridade järjekord ei oma tähtsust.

Tabel on teisel normaalvormil, kui see ei riku ühtki järgmistest reeglitest:

  1. Tabel peab juba olema esimeses normaalvormis.
  2. Osalist sõltuvust ei tohi olla.

Tabel on kolmandal normaalvormil, kui see ei riku ühtki järgmistest reeglitest:

  1. See peab olema juba teises normaalvormis.
  2. Ja sellel ei tohi olla transitiivset sõltuvust.

Teie, andmebaasi arendaja, ütlete ametnikele, et nad on piisavalt õppinud. Annate nõu ja palute neil naasta tööle ja jääda vaikimisi oma jaamadesse.

Leppisite kokku kohtumise ainult omanikuga, mis toimub homme tema kontoris 4NF ja 5NF koolituseks.