Treći normalni oblik

Treci Normalni Oblik



Ovo je treći dio serije, Pet normalnih oblika. Naslovi prva dva dijela (tutorijala) su Prva normalna forma, a zatim Druga normalna forma. U ovom dijelu serije objašnjena je treća normalna forma.

Objašnjenje slijedi priču: Otac je umro i ostavio nešto novca za svog sina. Sin je odlučio uložiti novac u trgovinu. Trgovina mješovitom robom, također poznata kao trgovina mješovitom robom, mala je maloprodajna tvrtka koja prima svakodnevne artikle od dobavljača i prodaje ih pojedinačnim kupcima u susjedstvu.







U ovom trenutku, trgovina je već opskrbljena, a neke prodaje su već napravljene. Sin, koji je vlasnik tvrtke, ima neke zaposlenike, koji se u ovom vodiču nazivaju službenici. Vlasnik i bilo koji zaposlenik mogu primati zalihe i vršiti prodaju nakon evidentiranja proizvoda.



Međutim, prije nego što je radnja počela s radom, ni vlasnik ni zaposlenici nisu znali ništa o normalnim oblicima. Dakle, sve su bilježili kao promet u jednu tablicu i jednu bilježnicu. Nisu imali kompjuter.



Vi, čitatelju, završili ste pet dijelova ove serije poduka; sada ste programer baze podataka. Vlasnik trgovine je vaš prijatelj. Posjetili ste trgovinu prije dva dana i obučili vlasnika i službenike za izradu stola u njegovom prvom normalnom obliku. Jučer ste također posjetili trgovinu i obučili ih kako napraviti tablicu u drugom normalnom obliku iz prvog normalnog oblika.





Danas ste upravo stigli u trgovinu u posjetu kako biste ih obučili kako proizvesti stol u trećem normalnom obliku iz drugog normalnog oblika. Sve tablice koje trenutno imaju su u drugom normalnom obliku. Tablice (prema nazivu i naslovima stupaca) su:

Proizvodi (ID proizvoda, ID kategorije, proizvod)
Kategorije (ID kategorije, kategorija)



Prodaja (ID prodaje, kupac, zaposlenik, datum)
SaleDetails(saleID, productID, numberSold, sellingPrice)

Narudžbe (ID narudžbe, dobavljač, zaposlenik, datum)
OrderDetails(orderID, productID, numberBought, costPrice)

Pojedinačne ili složene tipke su podvučene.

Nakon rezimiranja onoga što se podučavalo prethodna dva dana i prije nego što ste uspjeli bilo što učiniti, vlasnik pita:

“Što je s telefonskim brojevima, adresama itd. za kupce i zaposlenike?

Što je s količinom na zalihama, razinom ponovne narudžbe itd. za proizvode?
Trebaju li im svoje zasebne stolove ili ih treba uklopiti u sadašnje stolove?'

Vi, programer baze podataka, odgovarate:

“Čestitamo, vlasniku! Neizravno ste uveli pitanje Trećeg normalnog oblika.”

Ti nastavi.

Ostali potrebni stupci

Drugi potrebni stupci prvo se dodaju prethodnim tablicama, koje se nalaze u 1NF i 2NF. Neki od prethodnih naziva stupaca su izmijenjeni.

Kao minimum, tablica kategorija trebala bi imati sljedeće stupce:

Kategorije (ID kategorije, naziv kategorije, opis)

Opis je kratki odlomak koji opisuje kategoriju. Ova tablica kategorija već je u 1NF, 2NF i 3NF. 3NF je objašnjen u nastavku:

Kao minimum, tablica proizvoda trebala bi imati sljedeće stupce:

Proizvodi (ID proizvoda, ID kategorije, ID dobavljača, naziv proizvoda, jedinična cijena, količina na zalihama, razina reordera)

Kako se svaki proizvod prodaje, doći će do niske razine (broja) proizvoda kada se proizvod mora ponovno naručiti, tako da kupci ne bi trebali doći u trgovinu i nemaju proizvod. Takav izostanak nije dobar za posao. quantityInStock je broj određenog proizvoda na zalihi. To uključuje ono što je u trgovini i ono što je na polici.

categoryID i SupplierID su strani ključevi. Zato imaju podvučenu crticu umjesto jednostruke podcrtane. Strani ključ je objašnjen u nastavku. U prethodnom dijelu niza (Druga normalna forma), categoryID je bio dio primarnog ključa s jednom podcrtanom crtom zbog načina na koji se do njega došlo. Međutim, iz donjeg objašnjenja bilo bi jasno da bi categoryID trebao biti strani ključ (s podvučenom crticom).

Ova tablica proizvoda već je u 1NF, 2NF i 3NF. U nastavku pogledajte zašto je to u 3NF:

Kao minimum, tablica SaleDetails trebala bi imati sljedeće stupce:

SaleDetails(saleID, productID, unitSellingPrice, quantity, discount)

Očekuje se da će vrijednost popusta većinu vremena biti nula. Popust je popust koji trgovina daje kupcu.

Kao minimum, tablica OrderDetails trebala bi imati sljedeće stupce:

OrderDetails(orderID, productID, unitCostPrice, količina, popust)

Očekuje se da će vrijednost popusta većinu vremena biti nula. Popust je ovdje popust koji dobavljač daje trgovini.

Kao što se vidi u nastavku, tablica proizvoda može se razmatrati u 2NF ili 3NF. Tablice Prodaja i Narudžbe imaju problem 3NF. Za objašnjenje problema i rješenja koristit će se samo tablica prodaje. 3NF za tablicu narudžbi i tablicu proizvoda slijedi slično razmišljanje i samo će se citirati.

Prilikom dodavanja stupaca, tablica Prodaja bila bi:

Prodaja (ID prodaje, datum prodaje Ime kupca, telefon, adresa, grad, regija, poštanski broj, država, zaposlenik)

Sedam stupaca zamijenilo je stupac kupaca u izvornoj tablici. Budući da su kupci ljudi u susjedstvu, ćelije za stupce grada, regije (države), poštanskog broja i zemlje mogu ostati prazne, iako u ovom članku nisu ostavljene prazne.

Ova tablica prodaje još uvijek je u 2NF jer pravila 1NF i 2NF nisu prekršena. Međutim, treba imati na umu da je u retku tablice Sales kupac (ime) zamijenjen sa sedam ćelija reda kupaca.

Napomena: ćelija za adresu sadrži kućni broj, naziv ulice ili ceste i naziv grada, a sve je odvojeno zarezima. Može se smatrati da se grad sastoji od nekoliko gradova. Iako zarezi odvajaju ove određene komponente niza, one tvore jednu vrijednost ćelije, a ne tri vrijednosti ćelije.

Stupac zaposlenika također treba zamijeniti sa sedam takvih stupaca. Međutim, to nije učinjeno u ovom vodiču kako bi se uštedjelo vrijeme i prostor za podučavanje. Dakle, tablica prodaje s podacima može biti:

Tablica prodaje – 2NF – Bez ID-a kupca

Stupac vrste podataka SaleID je cijeli broj ili, bolje rečeno, autoinkrement. Tip podataka stupca dateSold je datum, a ne broj jer ima znak “/”, koji nije znamenka. Tip podataka za ostale stupce, uključujući stupac telefona, je niz (ili tekst). Telefonska vrijednost ima znak “-”, koji nije znamenka.

Imajte na umu da je za svaki red kupac (ime), kao što je bilo u prethodnom dijelu niza, zamijenjen sa sedam ćelija, od kojih je jedna još uvijek ime kupca. To znači da su podaci o kupcima entitet. Trenutno, ime kupca identificira njegovih ostalih šest podataka u nizu. Ako je ova tablica programirana, bit će prikladno identificirati entitet kupca u svakom retku cijelim brojem (ne automatskim povećanjem). U tom slučaju stupac customerID trebao bi prethoditi customerName. Prethodna tablica postaje:

Tablica prodaje – 2NF – S ID-om kupca

Postoje tri ID-a korisnika: 1, 2 i 3, pri čemu se 1 pojavljuje pet puta za Johna Smitha, 2 se pojavljuje dva puta za Jamesa Taylora, a 3 se pojavljuje jednom za Susan Wright.

Imajte na umu da se neki korisnički ID-ovi i njihovi zavisnici ponavljaju.

Pravila za treći normalni oblik

Tablica je u trećem normalnom obliku ako se pridržava sljedećih pravila:

  1. Već bi trebao biti u drugom normalnom obliku.
  2. I ne bi trebao imati tranzitivnu ovisnost.

Onda jedan od službenika (zaposlenika) pita: “Što je tranzitivna ovisnost?”. A vi, programer baze podataka, odgovarate: 'To je dobro pitanje!'

Tranzitivna ovisnost

Istina je da u nizu SaleID identificira sve vrijednosti u redu; međutim, customerID identificira svojih sedam podatkovnih vrijednosti, ali ne identificira ostatak vrijednosti identificiranih SaleID-om u tom retku. Drugim riječima, SaleID ovisi o deset vrijednosti ćelija u svakom retku. Međutim, customerID ovisi o sedam vrijednosti ćelija u istom retku, ali customerID ne ovisi o SaleID-u i drugim vrijednostima o kojima ovisi SaleID.

Takva ovisnost za ID kupca je tranzitivna ovisnost. A customerID se naziva stranim ključem i podcrtan je crticom u ovoj seriji vodiča, Pet normalnih oblika.

Pretpostavimo da atribut koji nije primarni (vrijednost ćelije koja nije primarna) ovisi o drugim atributima koji nisu primarni, a dotični atribut koji nije primarni (npr. CustomerID i njegovi zavisnici) ne ovisi o primarnom ključu i ostatku ćelije vrijednosti u redu. Onda je to tranzitivna ovisnost.

Prethodna tablica prodaje sa stranim ključem i njegovim ovisnicima uzrokovala bi računovodstvene probleme (anomalije).

Tablica prodaje od 2NF do 3NF

Kako biste riješili problem koji postavljaju strani ključ i njegovi zavisnici, uklonite strani ključ i njegove zavisnike, kako biste formirali novu tablicu bez ponavljanja. Međutim, čak i ako strani ključ ne ovisi o primarnom ključu, primarni ključ ovisi o stranom ključu. Dakle, kopija stranog ključa mora ostati u nadređenoj tablici. Nova tablica prodaje, u ovom trenutku, usklađena je s 1NF, 2NF i 3NF; to je roditeljska tablica. Nova podređena tablica iz prethodne tablice Prodaja također je usklađena s 1NF, 2NF i 3NF. Ime podređene tablice sa stranim ključem i njegovim ovisnicima je Kupci. Ako se ne može pronaći odgovarajuće ime, nešto nije u redu s analizom. Nova tablica prodaje u 3NF je:

Konačna tablica prodaje u 3NF

Ova tablica u 3NF ima isti broj redaka kao ona u 2NF, ali s manje stupaca.

Oznaka tablice za ovu konačnu tablicu prodaje u 3NF je:

Prodaja (ID prodaje, datum prodaje, ID kupca, ID zaposlenika)

SaleID je primarni ključ s jednom podcrtanom crtom. customerID je strani ključ, s podvučenom crticom. employeeID je također strani ključ s podvučenom crticom. Imajte na umu da je situacija zaposlenika u tablici Prodaja u 2NF ista kao i situacija kupaca. EmploeeID i njegove vlastite ovisne osobe moraju se izvući da bi se formirala druga tablica; ostaje kopija iskaznice zaposlenika.

Napomena: saleID, customerID i EmploeeID ne čine složeni ključ. saleID ovisi o customerID-u i EmploeeID-u.

Odnos između saleID-a i customerID-a je više prema jedan.

Tablica kupaca u 3NF

Ova tablica ima tri retka umjesto 9 redaka u tablici 2NF Sales. U ovoj tablici CustomerID je primarni ključ. Isti je kao strani ključ u tablici Prodaja, ali bez ponavljanja. Strani ključ u tablici Prodaja i primarni ključ u tablici Kupac povezuju obje tablice.

Redci koji se ponavljaju u tablici kupaca uklonjeni su kako se ne bi prekršio 1NF.

Kao što čitatelj može vidjeti, stavljanje tablice u 3NF također bi riješilo problem ponovljenih redaka (redundancije).

Oznaka tablice za tablicu kupaca je:

Kupci (ID kupca, Ime kupca, telefon, adresa, grad, regija, poštanski broj, država)

Pregled tablice proizvoda

Gore navedena tablica proizvoda u notnom obliku je:

Proizvodi (ID proizvoda, ID kategorije, ID dobavljača, naziv proizvoda, jedinična cijena, količina na zalihama, razina reordera)

Primarni ključ ovdje je productID. categoryID i SupplierID su strani ključevi. Slično tablici Customer, postoji tablica Categories, gdje je categoryID primarni ključ, i postoji tablica Supplier, gdje je SupplierID primarni ključ.

Ako će vrijednosti za ćelije za unitPrice, quantityInStock i reorderLevel ostati fiksne, tada je tablica Products, takva kakva jest, doista u 3NF. Ako će se ove vrijednosti mijenjati, tada je tablica proizvoda, kakva jest, u 2NF. U ovom dijelu serije tutorijala pretpostavlja se da te vrijednosti ostaju nepromijenjene tijekom vremena.

Svi stolovi

Sve su tablice sada u 3NF. Oni su prikazani kao:

Zaposlenici (ID zaposlenika, ime, telefon, adresa, grad, regija, poštanski broj, država, datum rođenja, datum zapošljavanja, datum otpuštanja)

Dobavljači (ID dobavljača, naziv, telefon, adresa, grad, regija, poštanski broj, država)

Proizvodi (ID proizvoda, ID kategorije, ID dobavljača, naziv proizvoda, jedinična cijena, količina na zalihama, razina reordera)
Kategorije (ID kategorije, naziv kategorije, opis)

Prodaja (ID prodaje, datum prodaje, ID kupca, ID zaposlenika)
SaleDetails(saleID, productID, numberSold, sellingPrice)
Kupci (ID kupca, Ime kupca, telefon, adresa, grad, regija, poštanski broj, država)

Narudžbe (ID narudžbe, datum prodaje, ID dobavljača, ID zaposlenika)
OrderDetails(orderID, productID, numberBought, costPrice)

Do devet profesionalnih tablica proizvedeno je iz samo jedne tablice koju su izradili početnici kako bi se spriječili problemi redundantnosti i računovodstva (anomalije od umetanja, brisanja i ažuriranja). Sam stol početnika doveo bi do financijskih gubitaka.

Testiranje osoblja

U ovom trenutku, svi zaposlenici, uključujući vlasnika, trebali su razumjeti 1NF, 2NF i 3NF. Međutim, moraju se testirati. Svi će oni, uključujući i vlasnika, sjediti na različitim mjestima i ispuniti test. Test koji se sastoji od jednog pitanja trajat će jedan sat, a sastoji se od sljedećeg:

Pitanje: Koristeći pravila za 1NF, 2NF i 3NF, dokažite da je svih gornjih devet tablica već u prvom normalnom obliku, drugom normalnom obliku i trećem normalnom obliku. Kupci i dobavljači ne moraju biti stvarni entiteti. Podaci za tablice trebaju poduprijeti tablične zapise.

Dok oni završavaju test, vi kao programer baze podataka odlazite nešto prigristi i popiti pivo, da biste se vratili nakon sat vremena.

Bliska i daleka budućnost

Dok ste vi, razvojni programer baze podataka, vani, također razmislite koji ćete im savjet dati ako svi prođu test.

Također, dok ste ih obučavali, a sada kada polažu test, kupci su dolazili i odlazili a da nisu bili usluženi. To nije dobro za posao, a vi, programer baze podataka, to znate. Neki kupci mogu otići u konkurentske trgovine i više se nikada ne vratiti.

Vi, programer baze podataka, imate 30 godina. Vlasnik, kao vaš prijatelj, također ima 30 godina. Činovnici (namještenici) su u dobi od 18 do 24 godine. Sve osobine koje su im bile potrebne za rad kod posjednika bile su: da su zdravi, da znaju čitati i pisati, da znaju zbrajati, oduzimati, množiti i dijeliti. , te da se zna koristiti računalom i internetom.

Kada je tablica u 3NF-u, većina ranjivosti je uklonjena iz baze podataka. Mnoge komercijalne baze podataka ne idu dalje od 3NF, a tvrtke ili tvrtke su udobne.

Dakle, ako svi prođu test, zamolit ćete službenike da idu i nastave raditi. Također ćete ih savjetovati da štede dio svojih plaća kako bi mogli posjedovati svoje trgovine. Sutra ćete nastaviti trenirati samo vlasnika u 4NF i 5NF. Uz poznavanje 4NF i 5NF, sve poznate ranjivosti su uklonjene.

Evaluacija

Nakon jednog sata vraćate se vi, programer baze podataka. Vi označite njihove skripte. Izvrsna vijest! Svi oni, uključujući i vlasnika, imaju 100% svaki. Hura! To je izvrsno!

Stoga čestitamo svima vama: učitelju i učenicima.

U ovom vodiču ne preostaje ništa osim zaključiti.

Zaključak

Tablica je u prvom normalnom obliku ako ne krši nijedno od sljedećih pravila:

  1. Svi stupci u tablici trebaju imati jedinstvena imena zaglavlja.
  2. Svaka ćelija mora imati samo jednu vrijednost.
  3. Vrijednosti pohranjene u stupcu trebaju biti iste vrste.
  4. Redovi bi trebali biti odvojeni.
  5. Redoslijed stupaca ili redaka nije bitan.

Tablica je u drugom normalnom obliku ako ne krši nijedno od sljedećih pravila:

  1. Tablica već mora biti u prvom normalnom obliku.
  2. Ne smije postojati djelomična ovisnost.

Tablica je u trećem normalnom obliku ako ne krši nijedno od sljedećih pravila:

  1. Mora već biti u drugom normalnom obliku.
  2. I ne smije imati tranzitivnu ovisnost.

Vi, programer baze podataka, kažete službenicima da su dovoljno naučili. Vi dajete savjete i tražite od njih da se vrate na posao i ostanu na svojim radnim mjestima prema zadanim postavkama.

Zakazujete termin samo s vlasnikom, koji će se sutra održati u njegovom uredu za obuku o 4NF i 5NF.