Kolmas normaalimuoto

Kolmas Normaalimuoto



Tämä on sarjan kolmas osa, Five Normal Forms. Kahden ensimmäisen osan (opetusohjelmien) otsikot ovat First Normal Form, jota seuraa Second Normal Form. Tässä osassa sarjaa selitetään kolmas normaalimuoto.

Selitys seuraa tarinaa: Isä on kuollut ja on jättänyt rahaa pojalleen. Poika päätti sijoittaa rahat lähikauppaan. Lähikauppa, joka tunnetaan myös lähikauppana, on pieni vähittäiskauppa, joka vastaanottaa päivittäisiä tavaroita toimittajilta ja myy niitä naapuruston yksittäisille asiakkaille.







Tässä vaiheessa myymälä on jo täynnä ja myyntiä on jo tehty. Pojalla, joka on yrityksen omistaja, on työntekijöitä, joita kutsutaan tässä opetusohjelmassa virkailijoiksi. Omistaja ja kuka tahansa työntekijä voivat vastaanottaa tarvikkeita ja tehdä myyntiä tuotteiden kirjaamisen jälkeen.



Omistaja tai työntekijät eivät kuitenkaan ennen liikkeen aloittamista tienneet mitään normaalimuodoista. Joten he kirjasivat kaiken tapahtumina yhteen taulukkoon ja yhteen harjoituskirjaan. Heillä ei ollut tietokonetta.



Sinä, lukija, olet suorittanut tämän opetusohjelmasarjan viisi osaa; olet nyt tietokannan kehittäjä. Lähikaupan omistaja on ystäväsi. Vierailit kaupassa kaksi päivää sitten ja koulutit omistajaa ja virkailijoita valmistamaan pöytä sen ensimmäisessä normaalissa muodossa. Vierailit myös eilen kaupassa ja koulutit heitä kuinka luoda pöytä toiseen normaalimuotoon ensimmäisestä normaalimuodosta.





Tänään olet juuri saapunut myymälään käymään kouluttamassa heitä kuinka valmistaa pöytä kolmannessa normaalimuodossa toisesta normaalimuodosta. Kaikki heillä tällä hetkellä olevat taulukot ovat toisessa normaalimuodossa. Taulukot (nimen ja sarakeotsikoiden mukaan) ovat:

Tuotteet (tuotetunnus, kategoriatunnus, tuote)
Luokat (luokkatunnus, luokka)



Myynti (myyntitunnus, asiakas, työntekijä, päivämäärä)
Myyntitiedot (alennustunnus, tuotetunnus, numeroMyyty, myyntihinta)

Tilaukset (tilaustunnus, toimittaja, työntekijä, päivämäärä)
Tilaustiedot (tilaustunnus, tuotetunnus, numeroostettu, kustannushinta)

Yksittäiset tai yhdistelmänäppäimet on alleviivattu.

Tehtyään yhteenvedon siitä, mitä opetettiin kahden edellisen päivän aikana ja ennen kuin ehdit tehdä mitään, omistaja kysyy:

'Entä asiakkaiden ja työntekijöiden puhelinnumerot, osoitteet jne.?

Entä tuotteiden määrä varastossa, uudelleentilausaste jne.?
Tarvitsevatko he omat erilliset pöydät vai pitäisikö ne sovittaa nykyisiin pöytiin?'

Sinä, tietokannan kehittäjä, vastaa:

'Onnittelut, omistaja! Olet epäsuorasti esitellyt kolmannen normaalimuodon ongelman.'

Sinä jatkat.

Muut tarpeelliset sarakkeet

Muut tarvittavat sarakkeet lisätään ensin edellisiin taulukoihin, jotka ovat 1NF- ja 2NF-taulukoissa. Joitakin aiempia sarakkeiden nimiä on muutettu.

Luokat-taulukossa tulee olla vähintään seuraavat sarakkeet:

Luokat (kategorian tunnus, kategorian nimi, kuvaus)

Kuvaus on lyhyt kappale, joka kuvaa luokkaa. Tämä luokkataulukko on jo luokissa 1NF, 2NF ja 3NF. 3NF selitetään alla:

Tuotteet-taulukossa tulee olla vähintään seuraavat sarakkeet:

Tuotteet (tuotetunnus, luokkatunnus, toimittajatunnus, tuotteen nimi, yksikköhinta, määrä varastossa, tilaustaso)

Kun jokaista tuotetta myydään, tuotteiden alhainen taso (määrä) saavutetaan, kun tuote on tilattava uudelleen, joten asiakkaiden ei tule tulla myymälään ilman tuotetta. Tällainen poissaolo ei ole hyväksi liiketoiminnalle. määräInStock on tietyn varastossa olevan tuotteen numero. Tämä sisältää mitä on kaupassa ja mitä on hyllyssä.

kategoriatunnus ja toimittajatunnus ovat vieraita avaimia. Siksi niissä on katkoviiva alleviivauksen sijasta. Vieras avain selitetään alla. Sarjan edellisessä osassa (Second Normal Form) categoryID oli osa ensisijaista avainta yhdellä alleviivauksella, johtuen siitä, miten se saavutettiin. Alla olevasta selityksestä käy kuitenkin selväksi, että kategoriatunnuksen tulisi olla vierasavain (jossa on viiva alleviivauksella).

Tämä tuotetaulukko on jo muodoissa 1NF, 2NF ja 3NF. Katso, miksi se on 3NF:ssä alta:

SaleDetails-taulukossa tulee olla vähintään seuraavat sarakkeet:

Myyntitiedot (alennustunnus, tuotetunnus, yksikkömyyntihinta, määrä, alennus)

Alennusarvon odotetaan olevan nolla suurimman osan ajasta. Alennus on alennus, jonka kauppa antaa asiakkaalle.

OrderDetails-taulukossa tulee olla vähintään seuraavat sarakkeet:

Tilaustiedot (tilaustunnus, tuotetunnus, yksikköhinta, määrä, alennus)

Alennusarvon odotetaan olevan nolla suurimman osan ajasta. Alennus tässä on alennus, jonka toimittaja antaa kaupalle.

Kuten alla näkyy, tuotetaulukkoa voidaan tarkastella 2NF- tai 3NF-muodossa. Myynti- ja tilaustaulukoissa on 3NF-ongelma. Vain myyntitaulukkoa käytetään ongelman ja ratkaisun selittämiseen. Tilaustaulukon ja tuotetaulukon 3NF noudattaa samanlaista päättelyä, ja se vain lainataan.

Sarakkeita lisättäessä myyntitaulukko olisi seuraava:

Myynti(myyntitunnus, päivämäärä MyyntiasiakkaanNimi, puhelin, osoite, kaupunki, alue, postinumero, maa, työntekijä)

Seitsemän saraketta on korvannut alkuperäisen taulukon asiakassarakkeen. Koska asiakkaat ovat naapuruston ihmisiä, kaupunki-, alue-, postinumero- ja maasarakkeiden solut voidaan jättää tyhjiksi, vaikka niitä ei jätetä tyhjiksi tässä artikkelissa.

Tämä myyntitaulukko on edelleen 2NF:ssä, koska 1NF- ja 2NF-sääntöjä ei ole rikottu. On kuitenkin ymmärrettävä, että myyntitaulukon rivillä asiakas (nimi) on korvattu seitsemällä asiakasrivin solulla.

Huomautus: osoitesolussa on talon numero, kadun tai tien nimi ja kaupungin nimi pilkuilla erotettuna. Kaupungin voidaan katsoa koostuvan useista kaupungeista. Vaikka nämä tietyt merkkijonokomponentit erottelevat pilkuilla, ne muodostavat yhden soluarvon eivätkä kolmea soluarvoa.

Työntekijäsarake on myös korvattava seitsemällä tällaisella sarakkeella. Tätä ei kuitenkaan tehdä tässä opetusohjelmassa opetusajan ja tilan säästämiseksi. Tietojen sisältävä myyntitaulukko voi siis olla:

Myyntitaulukko – 2NF – Ilman asiakastunnusta

Tietotyypin SaleID-sarake on kokonaisluku tai, parempi, automaattinen lisäys. DateSold-sarakkeen tietotyyppi on päivämäärä eikä numero, koska siinä on merkki '/', joka ei ole numero. Muiden sarakkeiden tietotyyppi, mukaan lukien puhelinsarake, on merkkijono (tai teksti). Puhelinarvossa on merkki '-', joka ei ole numero.

Huomaa, että jokaisella rivillä asiakas (nimi), kuten sarjan edellisessä osassa, on korvattu seitsemällä solulla, joista yksi on edelleen asiakkaan nimi. Tämä tarkoittaa, että asiakastiedot ovat kokonaisuus. Tällä hetkellä asiakkaan nimi tunnistaa sen kuusi muuta dataa peräkkäin. Jos tämä taulukko on ohjelmoitu, on kätevää tunnistaa jokaisella rivillä oleva asiakaskokonaisuus kokonaisluvulla (ei automaattinen lisäys). Siinä tapauksessa customerID-sarakkeen tulee edeltää CustomerName. Edellisestä taulukosta tulee:

Myyntitaulukko – 2NF – Asiakastunnuksella

Asiakastunnuksia on kolme: 1, 2 ja 3, joista 1 esiintyy viisi kertaa John Smithille, 2 esiintyy kahdesti James Taylorille ja 3 esiintyy kerran Susan Wrightille.

Huomaa, että jotkin asiakastunnukset ja heidän riippuvaiset henkilöt toistuvat.

Kolmannen normaalilomakkeen säännöt

Taulukko on kolmannessa normaalimuodossa, jos se noudattaa seuraavia sääntöjä:

  1. Sen pitäisi olla jo toisessa normaalimuodossa.
  2. Ja sillä ei pitäisi olla transitiivista riippuvuutta.

Sitten yksi virkailijoista (työntekijöistä) kysyy: 'Mikä on transitiivinen riippuvuus?'. Ja sinä, tietokannan kehittäjä, vastaat: 'Se on hyvä kysymys!'

Transitiivinen riippuvuus

On totta, että rivissä SaleID tunnistaa kaikki rivin arvot; Asiakastunnus kuitenkin tunnistaa seitsemän data-arvoaan, mutta ei identifioi muita SaleID:n kyseisellä rivillä tunnistamia arvoja. Toisin sanoen SaleID riippuu kymmenestä solun arvosta kullakin rivillä. Asiakastunnus riippuu kuitenkin seitsemästä soluarvosta samalla rivillä, mutta asiakastunnus ei riipu SaleID:stä ja muista arvoista, joista SaleID riippuu.

Tällainen asiakastunnuksen riippuvuus on transitiivinen riippuvuus. Ja asiakastunnusta kutsutaan viiteavaimeksi ja se on alleviivattu tässä opetusohjelmasarjassa, Viisi normaalia muotoa.

Oletetaan, että ei-prime-attribuutti (ei-ensisijainen soluarvo) riippuu muista ei-prime-attribuuteista, ja kyseinen ei-prime-attribuutti (esim. customerID ja sen riippuvat) ei riipu ensisijaisesta avaimesta ja muusta solusta arvot rivillä. Sitten se on transitiivinen riippuvuus.

Edellinen Sales-taulukko, jossa on vierasavain ja sen riippuvaiset, aiheuttaisi kirjanpitoongelmia (poikkeavuuksia).

Myyntitaulukko 2NF - 3NF

Ratkaise viiteavaimen ja sen riippuvaisten aiheuttama ongelma poistamalla vierasavain ja sen riippuvaiset muodostamalla uusi taulukko ilman toistoja. Vaikka vierasavain ei kuitenkaan riippuisi ensisijaisesta avaimesta, ensisijainen avain riippuu viiteavaimesta. Vierasavaimen kopion on siis jäätävä päätaulukkoon. Uusi myyntitaulukko on tässä vaiheessa 1NF-, 2NF- ja 3NF-yhteensopiva; se on emotaulukko. Uusi alitaulukko edellisestä myyntitaulukosta on myös 1NF-, 2NF- ja 3NF-yhteensopiva. Vierasavaimen ja sen riippuvien alitaulukon nimi on Asiakkaat. Jos sopivaa nimeä ei löydy, analyysissä on jotain mennyt pieleen. Uusi myyntitaulukko 3NF:ssä on:

Lopullinen myyntitaulukko 3NF:ssä

Tässä 3NF:n taulukossa on sama määrä rivejä kuin 2NF:n taulukossa, mutta siinä on vähemmän sarakkeita.

Tämän lopullisen myyntitaulukon taulukkomerkintä 3NF:ssä on:

Myynti(myyntitunnus, myyntipäivämäärä, asiakastunnus, työntekijätunnus)

Myyntitunnus on ensisijainen avain yhdellä alleviivauksella. customerID on vierasavain, jossa on viiva alleviivauksella. työntekijätunnus on myös vierasavain, jossa on viiva alleviivauksella. Huomaa, että työntekijän tilanne myyntitaulukossa 2NF:ssä on sama kuin asiakkaan tilanne. Työntekijätunnus ja sen omat riippuvaiset on vedettävä pois toisen taulukon muodostamiseksi; jäljelle jää kopio työntekijätunnuksesta.

Huomautus: myyntitunnus, asiakastunnus ja työntekijätunnus eivät muodosta yhdistelmäavainta. saleID riippuu asiakastunnuksesta ja työntekijätunnuksesta.

Myyntitunnuksen ja asiakastunnuksen välinen suhde on monien välinen.

Asiakaspöytä 3NF:ssä

Tässä taulukossa on kolme riviä 2NF-myyntitaulukon 9 rivin sijaan. Tässä taulukossa asiakastunnus on ensisijainen avain. Se on sama kuin Sales-taulukon vierasavain, mutta ilman toistoja. Myynti-taulukon vierasavain ja Asiakastaulukon ensisijainen avain linkittävät molemmat taulukot.

Asiakastaulukon toistuvat rivit on poistettu, jotta ne eivät riko 1NF:ää.

Kuten lukija näkee, taulukon sijoittaminen 3NF:ään ratkaisee myös toistuvien rivien ongelman (redundanssi).

Asiakastaulukon taulukon merkintä on:

Asiakkaat (asiakastunnus, asiakkaan nimi, puhelin, osoite, kaupunki, alue, postinumero, maa)

Tuotetaulukkoa tarkistettu

Yllä oleva tuotetaulukko merkintämuodossa on:

Tuotteet (tuotetunnus, luokkatunnus, toimittajatunnus, tuotteen nimi, yksikköhinta, määrä varastossa, tilaustaso)

Ensisijainen avain tässä on productID. kategoriatunnus ja toimittajatunnus ovat vieraita avaimia. Kuten Asiakas-taulukossa, on myös Kategoriat-taulukko, jossa kategoriatunnus on ensisijainen avain, ja Toimittaja-taulukko, jossa toimittajatunnus on ensisijainen avain.

Jos solujen arvot unitPrice-, mennyiséginStock- ja reorderLevel-arvoille pysyvät kiinteinä, Tuotteet-taulukko sellaisenaan on todella 3NF-muodossa. Jos nämä arvot muuttuvat, Tuotteet-taulukko sellaisenaan on muodossa 2NF. Tässä opetusohjelmasarjan osassa oletetaan, että nämä arvot pysyvät kiinteinä ajan mittaan.

Kaikki pöydät

Kaikki pöydät ovat nyt 3NF:ssä. Ne näytetään seuraavasti:

Työntekijät (työntekijän tunnus, nimi, puhelin, osoite, kaupunki, alue, postinumero, maa, syntymäpäivä, palkkauspäivä, vapautuspäivä)

Toimittajat (toimittajatunnus, nimi, puhelin, osoite, kaupunki, alue, postinumero, maa)

Tuotteet (tuotetunnus, luokkatunnus, toimittajatunnus, tuotteen nimi, yksikköhinta, määrä varastossa, tilaustaso)
Luokat (kategorian tunnus, kategorian nimi, kuvaus)

Myynti(myyntitunnus, myyntipäivämäärä, asiakastunnus, työntekijätunnus)
Myyntitiedot (alennustunnus, tuotetunnus, numeroMyyty, myyntihinta)
Asiakkaat (asiakastunnus, asiakkaan nimi, puhelin, osoite, kaupunki, alue, postinumero, maa)

Tilaukset (tilaustunnus, myyntipäivämäärä, toimittajatunnus, työntekijätunnus)
Tilaustiedot (tilaustunnus, tuotetunnus, numeroostettu, kustannushinta)

Yhdestä aloittelijoiden valmistamasta taulukosta on valmistettu jopa yhdeksän ammattitaulukkoa redundanssi- ja kirjanpitoongelmien (lisäyksen, poistamisen ja päivityksen poikkeamat) estämiseksi. Noviisipöytä yksinään johtaisi taloudellisiin tappioihin.

Testaa henkilökuntaa

Tässä vaiheessa kaikkien työntekijöiden, mukaan lukien omistajan, olisi pitänyt ymmärtää 1NF, 2NF ja 3NF. Ne on kuitenkin testattava. He kaikki, mukaan lukien omistaja, istuvat eri paikoissa ja suorittavat testin. Yhdestä kysymyksestä koostuva testi kestää tunnin ja se on seuraava:

Kysymys: Todista 1NF:n, 2NF:n ja 3NF:n sääntöjen avulla, että kaikki yllä olevat yhdeksän taulukkoa ovat jo ensimmäisessä normaalimuodossa, toisessa normaalimuodossa ja kolmannessa normaalimuodossa. Asiakkaiden ja toimittajien ei tarvitse olla todellisia kokonaisuuksia. Taulukkotietojen tulee varmuuskopioida taulukon merkinnät.

Kun he suorittavat testiä, sinä tietokannan kehittäjänä menet ulos syömään välipalaa ja oluen palataksesi tunnin kuluttua.

Lähi- ja kaukainen tulevaisuus

Kun sinä, tietokannan kehittäjä, olet poissa, harkitset myös, mitä neuvoja annat heille, jos he kaikki läpäisevät testin.

Lisäksi, kun koulutit heitä ja nyt kun he tekevät testin, asiakkaat ovat tulleet ja lähteneet ilman palvelua. Se ei ole hyväksi yrityksille, ja sinä, tietokannan kehittäjä, tiedät sen. Jotkut asiakkaat saattavat käydä kilpailijoiden liikkeissä eivätkä koskaan palaa takaisin.

Sinä, tietokannan kehittäjä, olet 30-vuotias. Omistaja, ystäväsi, on myös 30-vuotias. Virkailijat (työntekijät) ovat 18-24-vuotiaita. Kaikki ominaisuudet, joita he tarvitsivat työskennelläkseen omistajan palveluksessa, olivat: olla terve, osata lukea ja kirjoittaa, osata lisätä, vähentää, kertoa ja jakaa ja pystyä käyttämään tietokonetta ja Internetiä.

Kun taulukko on 3NF:ssä, useimmat haavoittuvuudet on poistettu tietokannasta. Monet kaupalliset tietokannat eivät ylitä 3NF:ää, ja yritykset tai yritykset ovat mukavia.

Joten jos kaikki läpäisevät kokeen, pyydät virkailijoita menemään jatkamaan työskentelyä. Neuvot heitä myös säästämään osan palkoistaan, jotta he voivat omistaa lähikauppansa. Jatkat huomenna vain haltijan kouluttamiseen 4NF- ja 5NF-lajeissa. 4NF:n ja 5NF:n tuntemalla kaikki tunnetut haavoittuvuudet poistetaan.

Arviointi

Tunnin kuluttua sinä, tietokannan kehittäjä, tulet takaisin. Merkitset heidän käsikirjoituksensa. Hieno uutinen! Heillä kaikilla, mukaan lukien omistajalla, on kullakin 100 %. Hurraa! Se on erinomaista!

Onnittelut siis teille kaikille: opettajalle ja oppilaille.

Tässä opetusohjelmassa ei ole muuta tehtävää kuin päättäminen.

Johtopäätös

Taulukko on ensimmäisessä normaalimuodossa, jos se ei riko mitään seuraavista säännöistä:

  1. Kaikilla taulukon sarakkeilla tulee olla yksilölliset otsikonimet.
  2. Jokaisella solulla saa olla vain yksi arvo.
  3. Sarakkeeseen tallennettujen arvojen tulee olla samaa tyyppiä.
  4. Rivien tulee olla erillisiä.
  5. Sarakkeiden tai rivien järjestyksellä ei ole väliä.

Taulukko on toisessa normaalimuodossa, jos se ei riko mitään seuraavista säännöistä:

  1. Taulukon on oltava jo ensimmäisessä normaalimuodossa.
  2. Osittaista riippuvuutta ei saa olla.

Taulukko on kolmannessa normaalimuodossa, jos se ei riko mitään seuraavista säännöistä:

  1. Sen on oltava jo toisessa normaalimuodossa.
  2. Eikä sillä saa olla transitiivista riippuvuutta.

Sinä, tietokannan kehittäjä, kerro virkailijoille, että he ovat oppineet tarpeeksi. Annat neuvoja ja pyydät heitä palaamaan töihin ja pysymään oletuksena asemilla.

Varaat tapaamisen vain omistajan kanssa, joka järjestetään huomenna hänen toimistossaan 4NF- ja 5NF-koulutukseen.