Trečioji normali forma

Trecioji Normali Forma



Tai trečia serijos dalis „Penkios normalios formos“. Pirmųjų dviejų dalių (pamokų) pavadinimai yra pirmoji normalioji forma, po to seka Antroji normalioji forma. Šioje serijos dalyje paaiškinama trečioji normalioji forma.

Paaiškinimas seka siužeto liniją: mirė tėvas ir paliko šiek tiek pinigų savo sūnui. Sūnus nusprendė pinigus investuoti į būtiniausių prekių parduotuvę. Savitarnos parduotuvė, taip pat žinoma kaip būtiniausių prekių parduotuvė, yra nedidelė mažmeninės prekybos įmonė, kuri kasdien gauna prekes iš tiekėjų ir parduoda jas individualiems klientams kaimynystėje.







Šiuo metu parduotuvėje jau yra atsargų, o kai kurie išpardavimai jau įvykdyti. Sūnus, kuris yra įmonės savininkas, turi keletą darbuotojų, kurie šioje pamokoje vadinami tarnautojais. Savininkas ir bet kuris darbuotojas gali gauti prekes ir parduoti produktus užregistravę produktus.



Tačiau iki parduotuvės pradžios nei savininkas, nei darbuotojai nieko nežinojo apie įprastas formas. Taigi, jie įrašydavo viską kaip operacijas į vieną lentelę ir vieną pratybų sąsiuvinį. Kompiuterio jie neturėjo.



Jūs, skaitytojau, baigėte penkias šios pamokų serijos dalis; dabar esate duomenų bazių kūrėjas. Savitarnos parduotuvės savininkas yra jūsų draugas. Apsilankėte parduotuvėje prieš dvi dienas ir išmokėte savininką bei tarnautojus pagaminti stalą įprastoje formoje. Jūs taip pat vakar lankėtės parduotuvėje ir apmokėte juos, kaip sukurti lentelę antroje normalioje formoje iš pirmosios normalios formos.





Šiandien ką tik atvykote į parduotuvę, kad išmokytumėte juos pagaminti trečią normalią formą iš antrosios normalios formos. Visos šiuo metu jų turimos lentelės yra antrosios normalios formos. Lentelės (pagal pavadinimą ir stulpelių antraštes) yra šios:

Produktai (produkto ID, kategorijos ID, produktas)
Kategorijos (kategorijos ID, kategorija)



Pardavimai (pardavimo ID, klientas, darbuotojas, data)
Išsami pardavimo informacija (pardavimo ID, produkto ID, numerisParduotas, pardavimo kaina)

Užsakymai (užsakymo ID, tiekėjas, darbuotojas, data)
Išsami užsakymo informacija (užsakymo ID, produkto ID, nupirktas numeris, savikaina)

Pavieniai arba sudėtiniai klavišai yra pabraukti.

Apibendrinęs, kas buvo mokoma per pastarąsias dvi dienas ir jums nespėjus nieko daryti, savininkas klausia:

„O kaip klientų ir darbuotojų telefonų numeriai, adresai ir pan.?

O kaip dėl produktų kiekio sandėlyje, pakartotinio užsakymo lygio ir pan.?
Ar jiems reikia atskirų stalų, ar jie turėtų būti montuojami į dabartines lenteles?

Jūs, duomenų bazės kūrėjas, atsakote:

„Sveikiname, savininke! Jūs netiesiogiai pristatėte trečiosios normalios formos klausimą.

Tu tęsi.

Kiti būtini stulpeliai

Kiti būtini stulpeliai pirmiausia pridedami prie ankstesnių lentelių, kurios yra 1NF ir 2NF. Kai kurie ankstesnių stulpelių pavadinimai yra pakeisti.

Lentelėje „Kategorijos“ turėtų būti bent šie stulpeliai:

Kategorijos (kategorijos ID, kategorijos pavadinimas, aprašas)

Aprašymas yra trumpa pastraipa, apibūdinanti kategoriją. Ši kategorijų lentelė jau yra 1NF, 2NF ir 3NF. 3NF paaiškinta toliau:

Lentelėje Produktai turėtų būti bent šie stulpeliai:

Produktai (produkto ID, kategorijos ID, tiekėjo ID, produkto pavadinimas, vieneto kaina, kiekis sandėlyje, pakartotinio užsakymo lygis)

Kadangi kiekviena prekė parduodama, bus pasiektas žemas prekių lygis (skaičius), kai prekę reikės užsakyti iš naujo, todėl pirkėjai neturėtų ateiti į parduotuvę ir neturėti prekės. Toks nebuvimas nėra naudingas verslui. mennyiségInStock yra tam tikros prekės sandėlyje skaičius. Tai apima tai, kas yra parduotuvėje ir kas yra lentynoje.

Kategorijos ID ir tiekėjo ID yra išoriniai raktai. Štai kodėl jie turi brūkšninį pabraukimą, o ne vieną pabraukimą. Užsienio raktas paaiškintas toliau. Ankstesnėje serijos dalyje (antroji normalioji forma) Kategorija ID buvo pirminio rakto dalis su vienu pabraukimu dėl to, kaip jis buvo pasiektas. Tačiau iš toliau pateikto paaiškinimo būtų aišku, kad categoryID turėtų būti išorinis raktas (su brūkšneliu pabraukti).

Ši produktų lentelė jau yra 1NF, 2NF ir 3NF. Pažiūrėkite, kodėl tai yra 3NF toliau:

Lentelėje „SaleDetails“ turėtų būti bent šie stulpeliai:

Išsami pardavimo informacija (pardavimo ID, produkto ID, vieneto pardavimo kaina, kiekis, nuolaida)

Tikimasi, kad nuolaidos vertė dažniausiai bus lygi nuliui. Nuolaida yra nuolaida, kurią parduotuvė suteikia klientui.

Lentelėje OrderDetails turėtų būti bent šie stulpeliai:

Užsakymo detalės (užsakymo ID, produkto ID, vieneto kaina, kiekis, nuolaida)

Tikimasi, kad nuolaidos vertė dažniausiai bus lygi nuliui. Nuolaida čia yra nuolaida, kurią tiekėjas suteikia parduotuvei.

Kaip matyti toliau, produktų lentelė gali būti nagrinėjama 2NF arba 3NF. Pardavimo ir užsakymų lentelėse yra 3NF problema. Problemai ir sprendimui paaiškinti bus naudojama tik pardavimo lentelė. 3NF užsakymų lentelė ir produktų lentelė remiasi panašiais argumentais ir būtų tik cituojamos.

Pridedant stulpelius pardavimo lentelė būtų tokia:

Pardavimas (pardavimo ID, dataPardavimo kliento vardas, telefonas, adresas, miestas, regionas, pašto kodas, šalis, darbuotojas)

Pirminėje lentelėje klientų stulpelį pakeitė septyni stulpeliai. Kadangi klientai yra kaimynystėje esantys žmonės, miesto, regiono (valstybės), pašto kodo ir šalies stulpelių langeliai gali būti palikti tušti, nors šiame straipsnyje jie nepalikti tušti.

Ši pardavimo lentelė vis dar yra 2NF, nes 1NF ir 2NF taisyklės nebuvo pažeistos. Tačiau reikia suprasti, kad pardavimo lentelės eilutėje klientas (vardas) buvo pakeistas septyniais klientų eilutės langeliais.

Pastaba: adreso langelyje yra namo numeris, gatvės arba kelio pavadinimas ir miesto pavadinimas, visi atskirti kableliais. Miestas gali būti laikomas sudarytu iš kelių miestų. Nors šie konkretūs eilutės komponentai atskiria kablelius, jie sudaro vieną langelio reikšmę, o ne tris langelio reikšmes.

Darbuotojų stulpelis taip pat turi būti pakeistas septyniais tokiais stulpeliais. Tačiau tai nedaroma šioje mokymo programoje siekiant sutaupyti mokymo laiko ir vietos. Taigi pardavimo lentelė su duomenimis gali būti:

Pardavimų lentelė – 2NF – Be kliento ID

Duomenų tipo SaleID stulpelis yra sveikasis skaičius arba, geriau, automatiškai didėja. Stulpelio dataSold duomenų tipas yra data, o ne skaičius, nes jame yra simbolis „/“, kuris nėra skaitmuo. Likusių stulpelių, įskaitant telefono stulpelį, duomenų tipas yra eilutė (arba tekstas). Telefono reikšmė turi simbolį „-“, kuris nėra skaitmuo.

Atminkite, kad kiekvienoje eilutėje klientas (vardas), kaip ir ankstesnėje serijos dalyje, buvo pakeistas septyniais langeliais, iš kurių vienas vis dar yra kliento vardas. Tai reiškia, kad kliento duomenys yra subjektas. Šiuo metu kliento vardas identifikuoja kitus šešis duomenis iš eilės. Jei ši lentelė yra užprogramuota, kiekvienoje eilutėje bus patogu identifikuoti kliento objektą sveikuoju skaičiumi (ne automatiškai didinti). Tokiu atveju kliento ID stulpelis turėtų būti prieš kliento pavadinimą. Ankstesnė lentelė tampa tokia:

Pardavimų lentelė – 2NF – Su kliento ID

Yra trys klientų ID: 1, 2 ir 3, iš kurių 1 pasitaiko penkis kartus John Smith, 2 - du kartus James Taylor, o 3 - vieną kartą Susan Wright.

Atminkite, kad kai kurie klientų ID ir jų priklausomi asmenys kartojasi.

Trečiosios normalios formos taisyklės

Lentelė yra trečiosios normalios formos, jei ji atitinka šias taisykles:

  1. Ji jau turėtų būti antrosios normalios formos.
  2. Ir ji neturėtų turėti pereinamosios priklausomybės.

Tada vienas iš tarnautojų (darbuotojų) klausia: 'Kas yra pereinamoji priklausomybė?'. Ir jūs, duomenų bazės kūrėjas, atsakote: „Tai geras klausimas!

Pereinamoji priklausomybė

Tiesa, iš eilės SaleID identifikuoja visas eilutės reikšmes; tačiau kliento ID nustato septynias savo duomenų reikšmes, bet neidentifikuoja likusių verčių, nurodytų SaleID toje eilutėje. Kitaip tariant, pardavimo ID priklauso nuo dešimties langelių reikšmių kiekvienoje eilutėje. Tačiau kliento ID priklauso nuo septynių langelių reikšmių toje pačioje eilutėje, bet kliento ID nepriklauso nuo SaleID ir kitų reikšmių, nuo kurių priklauso SaleID.

Tokia kliento ID priklausomybė yra pereinamoji priklausomybė. O kliento ID vadinamas išoriniu raktu ir yra pabrauktas brūkšneliu šioje mokymo serijoje „Penkios normalios formos“.

Tarkime, kad ne pagrindinis atributas (ne pirminio langelio reikšmė) priklauso nuo kitų ne pirminių atributų, o aptariamas ne pirminis atributas (pvz., kliento ID ir jo priklausomi asmenys) nepriklauso nuo pirminio rakto ir likusios ląstelės dalies. reikšmės eilutėje. Tada tai yra pereinamoji priklausomybė.

Ankstesnė pardavimo lentelė su išoriniu raktu ir jo priklausomybėmis sukeltų apskaitos problemų (anomalijų).

Pardavimo lentelė nuo 2NF iki 3NF

Norėdami išspręsti pašalinio rakto ir jo priklausomų objektų problemą, pašalinkite išorinį raktą ir jo priklausomus objektus, suformuokite naują lentelę be pasikartojimų. Tačiau net jei išorinis raktas nepriklauso nuo pirminio rakto, pirminis raktas priklauso nuo išorinio rakto. Taigi, išorinio rakto kopija turi likti pirminėje lentelėje. Šiuo metu nauja pardavimo lentelė yra suderinama su 1NF, 2NF ir 3NF; tai yra tėvų lentelė. Nauja antrinė lentelė iš ankstesnės pardavimo lentelės taip pat yra suderinama su 1NF, 2NF ir 3NF. Antrinės lentelės su išoriniu raktu ir jo priklausomybių pavadinimas yra Klientai. Jei nepavyksta rasti tinkamo pavadinimo, vadinasi, atliekant analizę įvyko klaida. Naujoji pardavimo lentelė 3NF yra:

Galutinė pardavimo lentelė 3NF

Šioje 3NF lentelėje yra tiek pat eilučių, kiek ir 2NF, bet mažiau stulpelių.

Šios galutinės pardavimo lentelės 3NF lentelės žymėjimas yra:

Pardavimas (pardavimo ID, pardavimo data, kliento ID, darbuotojo ID)

Išpardavimo ID yra pagrindinis raktas su vienu pabraukimu. kliento ID yra išorinis raktas su brūkšneliu pabraukti. darbuotojo ID taip pat yra išorinis raktas su brūkšneliu pabraukti. Atkreipkite dėmesį, kad darbuotojo situacija pardavimo lentelėje 2NF yra tokia pati kaip kliento situacija. Darbuotojo ID ir jo priklausomi asmenys turi būti ištraukti, kad būtų sudaryta kita lentelė; lieka darbuotojo ID kopija.

Pastaba: pardavimo ID, kliento ID ir darbuotojo ID nesudaro sudėtinio rakto. saleID priklauso nuo kliento ID ir darbuotojo ID.

Ryšys tarp saleID ir kliento ID yra daug su vienu.

Klientų lentelė 3NF

Šioje lentelėje yra trys eilutės, o ne 9 eilutės 2NF pardavimo lentelėje. Šioje lentelėje kliento ID yra pagrindinis raktas. Jis yra toks pat kaip užsienio raktas pardavimo lentelėje, bet be pasikartojimų. Išorinis raktas lentelėje Pardavimas ir pirminis raktas lentelėje Klientas susieja abi lenteles.

Pasikartojančios klientų lentelės eilutės buvo pašalintos, kad nebūtų pažeistas 1NF.

Kaip mato skaitytojas, lentelės įdėjimas į 3NF taip pat išspręstų pasikartojančių eilučių (pertekliaus) problemą.

Klientų lentelės lentelės žymėjimas yra:

Klientai (kliento ID, kliento vardas, telefonas, adresas, miestas, regionas, pašto kodas, šalis)

Peržiūrėta produktų lentelė

Aukščiau pateikta produktų lentelė žymėjimo forma yra tokia:

Produktai (produkto ID, kategorijos ID, tiekėjo ID, produkto pavadinimas, vieneto kaina, kiekis sandėlyje, pakartotinio užsakymo lygis)

Pagrindinis raktas čia yra produkto ID. Kategorijos ID ir tiekėjo ID yra išoriniai raktai. Panašiai kaip ir klientų lentelėje, yra lentelė Kategorijos, kur kategorijas ID yra pagrindinis raktas, ir tiekėjų lentelė, kur tiekėjo ID yra pagrindinis raktas.

Jei langelių reikšmės unitPrice, mennyiség yra sandėlyje ir reorderLevel išliks fiksuotos, tada produktų lentelė, kokia ji yra, tikrai yra 3NF. Jei šios reikšmės keisis, tada produktų lentelė tokia, kokia yra, yra 2NF. Šioje pamokų serijos dalyje daroma prielaida, kad šios vertės laikui bėgant išlieka fiksuotos.

Visos lentelės

Visos lentelės dabar yra 3NF. Jie rodomi kaip:

Darbuotojai (darbuotojo ID, vardas, pavardė, telefonas, adresas, miestas, regionas, pašto kodas, šalis, gimimo data, nuomos data, išleidimo data)

Tiekėjai (tiekėjo ID, pavadinimas, telefonas, adresas, miestas, regionas, pašto kodas, šalis)

Produktai (produkto ID, kategorijos ID, tiekėjo ID, produkto pavadinimas, vieneto kaina, kiekis sandėlyje, pakartotinio užsakymo lygis)
Kategorijos (kategorijos ID, kategorijos pavadinimas, aprašas)

Pardavimas (pardavimo ID, pardavimo data, kliento ID, darbuotojo ID)
Išsami pardavimo informacija (pardavimo ID, produkto ID, numerisParduotas, pardavimo kaina)
Klientai (kliento ID, kliento vardas, telefonas, adresas, miestas, regionas, pašto kodas, šalis)

Užsakymai (užsakymo ID, pardavimo data, tiekėjo ID, darbuotojo ID)
Išsami užsakymo informacija (užsakymo ID, produkto ID, nupirktas numeris, savikaina)

Iš vienos naujokų pagamintos lentelės buvo pagaminta iki devynių profesionalių lentelių, kad būtų išvengta perteklinių ir apskaitos problemų (įterpimo, ištrynimo ir atnaujinimo anomalijų). Vien pradedantysis stalas privestų prie finansinių nuostolių.

Personalo testavimas

Šiuo metu visi darbuotojai, įskaitant savininką, turėjo suprasti 1NF, 2NF ir 3NF. Tačiau jie turi būti išbandyti. Visi jie, įskaitant savininką, sėdės skirtingose ​​vietose ir atliks testą. Testas, kurį sudaro vienas klausimas, užtruks vieną valandą ir yra toks:

Klausimas: Naudodami 1NF, 2NF ir 3NF taisykles, įrodykite, kad visos pirmiau nurodytos devynios lentelės jau yra pirmosios normalios formos, antrosios normalios formos ir trečiosios normalios formos. Klientai ir tiekėjai nebūtinai turi būti tikri subjektai. Lentelių duomenys turėtų būti atsarginės lentelės užrašų kopijos.

Kol jie baigia testą, jūs, kaip duomenų bazės kūrėjas, išeinate užkąsti ir išgerti alaus, kad grįžtumėte po valandos.

Artimoji ir Tolimoji ateitis

Kol jūs, duomenų bazės kūrėjas, išeinate, taip pat svarstote, ką patarti jiems, jei jie visi išlaikys testą.

Be to, kol mokėte juos ir dabar, kai jie laiko testą, klientai ateidavo ir išeidavo neaptarnaujami. Tai nėra naudinga verslui, ir jūs, duomenų bazių kūrėjas, tai žinote. Kai kurie klientai gali eiti į konkurentų parduotuves ir niekada nebegrįžti.

Jums, duomenų bazių kūrėjui, yra 30 metų. Savininkui, kaip jūsų draugui, taip pat 30 metų. Tarnautojų (darbuotojų) amžius yra nuo 18 iki 24 metų. Visos savybės, kurių jiems reikėjo norint dirbti savininkui, buvo šios: būti sveikam, mokėti skaityti ir rašyti, mokėti sudėti, atimti, dauginti ir dalyti , ir mokėti naudotis kompiuteriu bei internetu.

Kai lentelė yra 3NF, dauguma pažeidžiamumų buvo pašalinta iš duomenų bazės. Daugelis komercinių duomenų bazių neviršija 3NF, o įmonės ar įmonės yra patogios.

Taigi, jei visi jie išlaikys testą, paprašysite tarnautojų eiti ir toliau dirbti. Taip pat patarsite jiems sutaupyti dalį savo atlyginimų, kad galėtų turėti savo parduotuves. Rytoj ir toliau mokysite tik savininką 4NF ir 5NF. Žinant 4NF ir 5NF, visi žinomi pažeidžiamumai pašalinami.

Įvertinimas

Po valandos jūs, duomenų bazės kūrėjas, grįžtate. Jūs pažymite jų scenarijus. Puikios naujienos! Jie visi, įskaitant savininką, turi 100 proc. Hurray! Tai puiku!

Taigi sveikinu jus visus: mokytoją ir mokinius.

Šioje pamokoje nebeliko nieko kito, kaip tik baigti.

Išvada

Lentelė yra pirmosios normalios formos, jei ji nepažeidžia nė vienos iš šių taisyklių:

  1. Visi lentelės stulpeliai turi turėti unikalius antraštės pavadinimus.
  2. Kiekviename langelyje turi būti tik viena reikšmė.
  3. Stulpelyje saugomos reikšmės turi būti to paties tipo.
  4. Eilutės turi būti skirtingos.
  5. Stulpelių ar eilučių tvarka nesvarbi.

Lentelė yra antrosios normalios formos, jei ji nepažeidžia nė vienos iš šių taisyklių:

  1. Lentelė jau turi būti pirmosios normalios formos.
  2. Neturi būti dalinės priklausomybės.

Lentelė yra trečiosios normalios formos, jei ji nepažeidžia nė vienos iš šių taisyklių:

  1. Ji jau turi būti antrosios normalios formos.
  2. Ir ji neturi turėti pereinamosios priklausomybės.

Jūs, duomenų bazės kūrėjas, pranešate tarnautojams, kad jie pakankamai išmoko. Jūs teikiate patarimus ir paprašote jų grįžti į darbą ir likti savo stotyse pagal numatytuosius nustatymus.

Jūs nustatote susitikimą tik su savininku, kuris rytoj vyks jo biure, kur bus rengiami mokymai apie 4NF ir 5NF.