Tinkamai sukurta duomenų bazė suteikia prieigą prie atnaujintos ir tikslios informacijos. Kadangi siekiant numatytų tikslų vienas iš esminių veiksnių yra tinkama duomenų bazės struktūra, verta skirti laiko ir susipažinti su svarbiausiais duomenų bazių kūrimo principais. Jie padės sukurti duomenų bazę, kuri atitinka jūsų poreikius ir kurią galima lengvai keisti.
Šiame straipsnyje pateikiamos rekomendacijos, kaip suplanuoti duomenų bazės kompiuteriui kūrimą. Sužinosite, kaip nuspręsti, kokios informacijos jums reikia, kaip padalyti informaciją į atitinkamas lenteles ir stulpelius ir kaip lentelės yra susijusios vien su kita. Prieš kurdami pirmąją savo kompiuterio duomenų bazę turėtumėte perskaityti šį straipsnį.
Šiame straipsnyje
Keletas duomenų bazių terminų
„Access“ suskirsto informaciją į lenteles: eilučių ir stulpelių sąrašus, primenančius buhalterio bloknotą ar skaičiuoklę. Paprastoje duomenų bazėje gali būti tik viena lentelė. Tačiau daugumoje duomenų bazių jų yra daugiau nei viena. Pavyzdžiui, galite turėti lentelę, kurioje saugoma informacija apie produktus, kitoje lentelėje bus informacija apie užsakymus, o dar viena – su informacija apie klientus.
Kiekvieną eilutę tiksliau būtų vadinti įrašu, o stulpelį – lauku. Įrašas yra prasmingas ir nuoseklus būdas sujungti informaciją apie kokį nors dalyką. Laukas yra atskiras informacijos elementas (tokio tipo elementai yra kiekviename įraše). Pavyzdžiui, kiekvienoje lentelės Produktai eilutėje arba įraše bus saugoma informacija apie vieną produktą. Kiekviename stulpelyje arba lauke yra tam tikro tipo informacijos apie tą produktą, pavyzdžiui, jo pavadinimas arba kaina.
Kaip tinkamai kurti duomenų bazę?
Duomenų bazės kūrimas paremtas tam tikrais principais. Pirmasis principas – pasikartojanti informacija (dar vadinama pertekliniais duomenimis) yra nereikalinga, nes užima vietą ir padidina klaidų ir neatitikimų tikimybę. Antras principas pabrėžia informacijos tikslumo ir išsamumo svarbą. Jei jūsų duomenų bazėje laikoma neteisinga informacija, tai visos ataskaitos, kurios grindžiamos iš duomenų bazės gauta informacija, taip pat bus neteisingos. Todėl visi sprendimai, kuriuos priimsite remdamiesi šiomis ataskaitomis, bus klaidingi.
Duomenų bazė sukurta tinkamai, kai:
-
Jūsų informacija suskirstoma į temines lenteles, kad sumažėtų perteklinių duomenų kiekis.
-
Suteikia „Access“ informaciją, reikalingą norint sujungti informaciją į lenteles.
-
Padeda palaikyti ir užtikrinti informacijos tikslumą ir vientisumą.
-
Atitinka jūsų duomenų apdorojimo ir ataskaitų rengimo poreikius.
Kūrimo procesas
Kūrimo procesas apima šiuos veiksmus:
-
Duomenų bazės tikslo nustatymas
Padeda pasirengti kitiems veiksmams.
-
Reikiamos informacijos radimas ir tvarkymas
Surinkite visų tipų informaciją, kuri norėtumėte įrašyti į duomenų bazę, pavyzdžiui, produkto pavadinimą ir užsakymo informaciją.
-
Informacijos skirstymas į lenteles
Suskirstykite savo informaciją į pagrindines kategorijas ar temas, pavyzdžiui, produktai arba užsakymai. Kiekviena tema taps lentele.
-
Informacijos elementų vertimas stulpeliais
Nuspręskite, kokia informacija turi būti saugoma kiekvienoje lentelėje. Kiekvienas elementas tampa lauku ir rodomas kaip lentelės stulpelis. Pavyzdžiui, lentelėje Darbuotojai gali būti tokie laukai kaip Pavardė ir Priėmimo į darbą data.
-
Pirminių raktų nurodymas
Pasirinkite kiekvienos lentelės pirminį raktą. Pirminis raktas yra stulpelis, kuris unikaliai identifikuoja kiekvieną eilutę. Pavyzdžiui, produkto ID arba užsakymo ID.
-
Lentelių ryšių kūrimas
Išanalizuokite kiekvieną lentelę ir nuspręskite, kaip vienos lentelės duomenys susiję su duomenimis kitose lentelėse. Įtraukite į lenteles laukų arba prireikus formuoti ryšius sukurkite naujų lentelių.
-
Struktūros tikslinimas
Patikrinkite, ar struktūroje nėra klaidų. Sukurkite lenteles ir pridėkite kelis įrašus su duomenų pavyzdžiais. Pažiūrėkite, ar iš lentelių pavyksta gauti norimus rezultatus. Jei reikia, pakoreguokite struktūrą.
-
Normalizavimo taisyklių taikymas
Pritaikykite duomenų normalizavimas taisykles, kad pamatytumėte, ar jūsų lentelių struktūra tinkama. Jei reikia, pakoreguokite lenteles.
Duomenų bazės tikslo nustatymas
Patartina užrašyti duomenų bazės paskirtį popieriuje – jos paskirtį, kaip tikitės ją naudoti ir kas ją naudos. Pavyzdžiui, jei naudojate nedidelę namams skirtos įmonės duomenų bazę, galite parašyti kažką paprasto, pvz., "Klientų duomenų bazėje yra klientų informacijos sąrašas, skirtas laiškams ir ataskaitoms kurti". Jei duomenų bazė yra sudėtingesnė arba ją naudoja daug žmonių, kaip dažnai būna įmonės parametre, tikslas gali būti pastraipa ar daugiau, taip pat turėtų būti nurodyta, kada ir kaip kiekvienas asmuo naudos duomenų bazę. Idėja yra turėti gerai išplėtotą misijos pareiškimą, kurį galima nurodyti visame kūrimo procese. Tokį teiginį gavę, galėsite sutelkti dėmesį į savo tikslus, kai priimate sprendimus.
Reikiamos informacijos paieška ir tvarkymas
Norėdami rasti ir tvarkyti reikiamą informaciją, pradėkite nuo esamos informacijos. Pavyzdžiui, galite įrašyti pirkimo užsakymus DK arba saugoti kliento informaciją popierinėse formose failų pakete. Surinkite šiuos dokumentus ir pateikite kiekvieno rodomo informacijos tipo sąrašą (pvz., kiekvieną lauką, kurį užpildote formoje). Jei neturite esamų formų, įsivaizduokite, kad turite sukurti formą, kad įrašytumėte kliento informaciją. Kokią informaciją įtrauktumėte į formą? Kokius užpildo laukus sukurtumėte? Nustatykite ir išvardykite kiekvieną iš šių elementų. Tarkime, kad šiuo metu klientų sąrašą laikote indekso kortelėse. Patikrinus šias korteles gali būti rodoma, kad kiekvienoje kortelėje yra kliento vardas, adresas, miestas, valstija, pašto kodas ir telefono numeris. Kiekvienas iš šių elementų atitinka galimą lentelės stulpelį.
Rengdami šį sąrašą, nesistenkite, kad jau nuo pat pradžių jis būtų išbaigtas. Užsirašykite kiekvieną elementą, kuris ateina į galvą. Jei duomenų bazę naudos ir kiti asmenys, paprašykite taip pat pateikti savo idėjas. Sąrašą galėsite patobulinti vėliau.
Tada pagalvokite, kokių tipų ataskaitas arba el laiškus siųsite remdamiesi duomenų bazės informacija. Pavyzdžiui, tai gali būti produkto pardavimo pagal regioną ataskaita arba atsargų suvestinė, kurioje rodomas produktų atsargų lygis. Taip pat galite būti, kad klientams siųsite standartinius laiškus, informuojančius apie tam tikrus įvykius ar specialiuosius pasiūlymus. Apgalvokite ataskaitos struktūrą ir įsivaizduokite, kaip ji atrodys. Kokią informaciją norėtumėte įtraukti į ataskaitą? Sudarykite visų elementų sąrašą. Apgalvokite standartizuotų laiškų ir kitų ataskaitų, kurias norėtumėte kurti, struktūrą.
Galvodami apie laiškus ir ataskaitas, kuriuos galbūt norėsite sukurti, galėsite nustatyti elementus, kurie turėtų būti duomenų bazėje. Tarkime, kad klientai suteikiate galimybę el. paštu užsiprenumeruoti periodiškai siunčiamą naujienlaiškį, o jūs norite išspausdinti prenumeratorių sąrašą. Norėdami įrašyti šią informaciją, į klientų lentelę įtraukite stulpelį Siųsti el. paštą. Šiame lauke kiekvienam klientui galima pasirinkti Taip ar Ne.
Norint siųsti el. laiškus klientams reikia įrašyti dar vieną elementą. Kai jau žinote, kad klientas nori gauti el. laiškus, reikės ir el. pašto adresų, kuriais siųsti tuos laiškus. Todėl reikia įrašyti kiekvieno kliento el. pašto adresą.
Būtų protinga sukurti kiekvienos ataskaitos ar išvesties sąrašo prototipą ir apsvarstyti, kokių elementų reikės ataskaitai sukurti. Pavyzdžiui, išnagrinėjus laiško blanką, gali kilti keletas dalykų. Jei norite įtraukti tinkamą pasveikinimą, pvz., eilutę "Ponas", "Ponia" arba "Ms", kuri pradeda pasisveikinimą, turėsite sukurti pasveikinimo elementą. Be to, paprastai galite pradėti laišką "Gerb. P. Smith", o ne "Gerb. P. Sylvester Smith". Tai reiškia, kad paprastai norėsite saugoti pavardę atskirai nuo vardo.
Svarbiausia prisiminti, kad bet kokia informacija turi būti suskaidyta į mažiausias įmanomas naudingas dalis. Šiuo atveju, kad būtų patogiau naudoti, vardą ir pavardę reikėtų atskirti. Pavyzdžiui, norint surikiuoti ataskaitą pagal pavardes, klientų pavardės turi būti saugomos atskirai. Dažniausiai, jei norite rikiuoti, ieškoti, suskaičiuoti ar sukurti ataskaitą pagal konkrečią informaciją, tas informacijos elementas turi būti atskirame lauke.
Pagalvokite apie klausimus, į kuriuos turi atsakyti duomenų bazė. Pavyzdžiui, kiek praėjusį mėnesį parduota tam tikro produkto? Kur gyvena geriausi klientai ? Kas yra geriausiai parduodamų produktų tiekėjas? Numačius šiuos klausimus, bus paprasčiau nustatyti, kokius papildomus elementus įrašyti.
Surinkę šią informaciją esate pasiruošę kitam veiksmui.
Informacijos skirstymas į lenteles
Norėdami suskirstyti informaciją į lenteles, pasirinkite pagrindines kategorijas, arba temas. Pavyzdžiui, suradus ir sutvarkius produktų pardavimo duomenų bazės informaciją, pirminis sąrašas gali atrodyti maždaug taip:
Pagrindinės temos yra produktai, tiekėjai, klientai ir užsakymai. Todėl būtų prasminga naudoti keturias lenteles: vieną informacijai apie produktus, kitą – apie tiekėjus ir po vieną informacijai apie klientus ir užsakymus. Tai nėra baigtinis sąrašas, tačiau nebloga pradžia. Galite toliau tikslinti šį sąraše tol, kol sukursite efektyvią struktūrą.
Pirmą kartą peržiūrint pradinį elementų sąrašą, gali kilti idėja perkelti juos visus į vieną lentelę, vietoj keturių, rodomų ankstesniame paveikslėlyje. Dabar suprasite, kodėl tai nėra gera idėja. Pažvelkite į čia rodomą lentelę:
Šiuo atveju kiekvienoje eilutėje yra informacijos apie produktą ir jo tiekėją. Kadangi galite turite daug produktų iš to paties tiekėjo, tiekėjo pavadinimo ir adreso informacija bus kartojama daug kartų. Taip eikvojama disko vieta. Žymiai geriau įrašyti tiekėjo informaciją vieną kartą į atskirą lentelę Tiekėjai ir susieti tą lentelę su lentele Produktai.
Antroji tokios struktūros problema paaiškėja, kai reikia modifikuoti informaciją apie tiekėją. Tarkime, turite pakeisti tiekėjo adresą. Kadangi jis rodomas daugelyje vietų, galite pakeisti adresą vienoje, bet pamiršti jį pakeisti kitur. Šią problemą galima išspręsti įrašius tiekėjo adresas įrašomas tik vienoje vietoje.
Kai kuriate duomenų bazę, visada stenkitės įrašyti visus faktus tik vieną kartą. Jei pastebėsite, kad kartojate tą pačią informaciją, pavyzdžiui, konkretaus tiekėjo adresą, daugiau nei vienoje vietoje, perkelkite šią informaciją į atskirą lentelę.
Galiausiai, tarkime, yra tik vienas produktas, kurį tiekia "Coho" vyninė, ir norite panaikinti produktą, bet išsaugoti tiekėjo pavadinimą ir adreso informaciją. Kaip panaikintumėte produkto įrašą neprarasdami tiekėjo informacijos? Negalite. Kiekviename įraše yra faktų apie produktą ir faktų apie tiekėją, todėl negalite jo panaikinti nepanaikindami kito. Norėdami atskirti šiuos faktus, turite suskaidyti vieną lentelę į dvi: vieną lentelę produkto informacijai, o kitą – tiekėjo informacijai. Naikinant produkto įrašą turėtų būti panaikinti tik produkto faktai, o ne tiekėjo faktai.
Kai pasirinksite lentelės temą, tos lentelės stulpeliuose turi būti tik informacija apie tą temą. Pavyzdžiui, produktų lentelėje turi būti tik informacija apie produktus. Kadangi tiekėjo adresas yra informacija apie tiekėją, o ne apie produktą, todėl jis turi būti tiekėjų lentelėje.
Informacijos elementų vertimas stulpeliais
Norėdami nustatyti lentelės stulpelius, turite nuspręsti, kokia su lentelės tema susijusi informacija jums reikalinga. Pavyzdžiui, į lentelę Klientai naudinga įtraukti tokius stulpelius kaip Pavadinimas, Adresas, Miestas, valstybė, pašto kodas, Siųsti el. paštą, Pasveikinimas ir El. pašto adresas. Visiems lentelės įrašams bus priskirtas toks pat stulpelių rinkinys, todėl stulpelių Pavadinimas, Adresas, Miestas, valstybė, pašto kodas, Siųsti el. paštą, Pasveikinimas ir El. pašto adresas informaciją galite saugoti kiekvienam įrašui. Pavyzdžiui, adreso stulpelyje yra klientų adresai. Kiekviename įraše yra vieno kliento duomenys, o adreso lauke yra to kliento adresas.
Nustatę pradinį kiekvienos lentelės stulpelių rinkinį, galite dar patikslinti stulpelius. Pavyzdžiui, gali būti naudinga saugoti kliento vardą dviejuose atskiruose stulpeliuose: vardas ir pavardė, kad galėtumėte rikiuoti, ieškoti ir indeksuoti tik tuos stulpelius. Be to, adresą iš tikrųjų sudaro keletas atskirų komponentų: adresas, miestas, pašto kodas ir šalis / regionas, todėl geriau ir juos saugoti atskiruose stulpeliuose. Jei norite atlikti jei norite ieškoti, filtruoti arba rikiuoti pagal, pavyzdžiui, miestą, informacija apie miestą turi būti saugoma atskirame stulpelyje.
Taip pat reikėtų atsižvelgti į tai, kokio tipo informacija bus saugoma duomenų bazėje – vietinė ar tarptautinė. Pavyzdžiui, jei ketinate saugoti tarptautinius adresus, geriau turėti stulpelį Regionas vietoje stulpelio, tarkime, Apskritis, nes tokiame stulpelyje būtų galima saugoti tiek informaciją apie apskritis, tiek apie kitų šalių / regionų administracinius vienetus. Taip pat universaliame lauke Pašto kodas galima saugoti tiek pašto kodų, tiek indeksų informaciją.
Toliau pateikiame kelis patarimus, kaip nustatyti stulpelius.
-
Neįtraukite apskaičiuojamųjų duomenų
Lentelėse nereikėtų saugoti skaičiavimų rezultatų. Geriau tegul prireikus duomenų „Access“ kaskart atlieka skaičiavimus. Tarkime, turite užsakytų produktų ataskaitą, kurioje rodomos atskirų kategorijų užsakytų produktų tarpinės sumos. Tačiau nė vienoje lentelėje nėra stulpelio su vienetų užsakyme tarpinėmis sumomis. Vietoje to lentelėje Produktai yra stulpelis Vienetai užsakyme, kuriame nurodyta, kiek kiekvieno produkto vienetų yra užsakyta. Naudodama tuos duomenis, „Access“ apskaičiuoja tarpines sumas kiekvieną kartą, kai spausdinate ataskaitą. Pačių tarpinių sumų nereikėtų laikyti lentelėje.
-
Saugokite informaciją suskaidę į mažiausias logines dalis
Jums gali pasirodyti, kad geriau turėti vieną lauką vardams ir pavardėms arba produktų pavadinimams kartu su aprašymais. Jei lauke sujungsite daugiau nei vieno tipo informaciją, vėliau bus sunku gauti atskirus faktus. Pabandykite suskaidyti informaciją į logines dalis, pavyzdžiui, kurti atskirus laukus vardui ir pavardei arba produkto pavadinimui, kategorijai ir aprašui.
Kai patikslinsite kiekviename lentelės stulpelyje esančią informaciją, būsite pasirengę pasirinkti kiekvienos lentelės pirminį raktą.
Pirminių raktų nurodymas
Kiekvienoje lentelėje turėtų būti stulpelis arba stulpelių rinkinys, kuris unikaliai identifikuoja kiekvieną eilutę, saugomą lentelėje. Tam dažnai naudojamas unikalus identifikacinis numeris, pavyzdžiui, darbuotojo ID numeris arba serijos numeris. Duomenų bazių terminais ši informacija vadinama lentelės pirminiu raktu. „Access“ naudoja pirminių raktų laukus, kad greitai susietų duomenis iš kelių lentelių ir pateiktų jums.
Jei jau turite unikalų lentelės identifikatorių,pavyzdžiui, produkto numerį, kuris unikaliai identifikuoja kiekvieną kataloge esantį produktą, galite naudoti tą identifikatorių kaip lentelės pirminį raktą, bet tik tuo atveju, jei kiekvienam įrašui skirtos šio stulpelio reikšmės visada bus skirtingos. Pirminiame rakte negali būti reikšmių dublikatų. Pavyzdžiui, kaip pirminių raktų nenaudokite žmonių vardų, nes jie nėra unikalūs. Labai tikėtina, kad toje pačioje lentelėje gali būti du žmonės, turintys tokį patį vardą.
Pirminis raktas visuomet turi būti reikšmė. Jei kokiu nors metu stulpelio reikšmė gali tapti nepriskirta arba nežinoma (reikšmės nėra), jos negalima naudoti kaip pirminės reikšmės komponento.
Visada reikia rinktis tokį pirminį raktą, kurio reikšmė nepasikeis. Duomenų bazėje, kurioje naudojama daugiau nei viena lentelė, lentelės pirminis raktas gali būti naudojamas kaip nuoroda į kitas lenteles. Pakeitus pirminį raktą keitimas taip pat turi būti pritaikytas visur, kur naudojama nuorodą į šį raktą. Naudojant nekeičiamą pirminį raktą, sumažėja tikimybė, kad bus sutrikdyta sinchronizacija su kitomis lentelėmis, kuriose jis nurodomas kaip pirminis raktas.
Dažnai kaip pirminis raktas naudojama pasirenkama unikali reikšmė. Pavyzdžiui, kiekvienam užsakymui galite priskirti unikalų eilės numerį. Vienintelė užsakymo numerio paskirties yra identifikuoti užsakymą. Kartą priskirtas, jis niekada nesikeičia.
Jei neturite omenyje stulpelio ar stulpelių rinkinio, kuris galėtų būti geras pirminis raktas, apsvarstykite galimybę naudoti stulpelį, kurio duomenų tipas yra "AutoNumber". Kai naudojate automatinio numeravimo duomenų tipą, "Access" automatiškai priskiria jums reikšmę. Toks identifikatorius yra be faktų; jame nėra faktinės informacijos, apibūdinančios jos atstovaujamą eilutę. Faktiniai identifikatoriai puikiai tinka naudoti kaip pirminis raktas, nes jie nesikeičia. Labiau tikėtina, kad pasikeis pirminis raktas, kuriame yra faktų apie eilutę , pvz., telefono numeris arba kliento vardas, nes gali pasikeisti pati faktinė informacija.
1. Stulpelis, kurio duomenų tipas yra „AutoNumber“ dažnai yra geras pirminis raktas. Produktų ID niekuomet nesutampa.
Kai kuriais atvejais lentelės pirminį raktą galima sudaryti iš dviejų ar daugiau laukų. Pavyzdžiui, lentelėje Užsakymų išsami informacija, kurioje saugomi užsakymų eilučių elementai, pirminis raktas gali būti sudarytas iš dviejų stulpelių: Užsakymo ID ir produkto ID. Kai pirminis raktas sudaromas iš daugiau nei vieno stulpelio, jis vadinamas sudėtiniu raktu.
Produktų pardavimo duomenų bazėje kiekvienai lentelei galite sukurti stulpelį, kurio duomenų tipas „AutoNumber“, ir naudoti šį stulpelį kaip pirminį raktą: Produkto ID bus skirtas lentelei Produktai, Užsakymo ID – lentelei Užsakymai, o Tiekėjo ID – lentelei Tiekėjai.
Lentelių ryšių kūrimas
Dabar, suskirsčius informaciją į lenteles, reikia vėl ją prasmingu būdu sujungti. Pavyzdžiui, žemiau pateiktoje formoje yra informacijos iš kelių lentelių.
1. Šioje formoje pateikta informacija yra iš lentelės Klientai...
2. ...lentelės Darbuotojai...
3. ...lentelės Užsakymai...
4. ...lentelės Produktai...
5. ...ir lentelės Užsakymų išsami informacija.
„Access“ yra sąryšinių duomenų bazių valdymo sistema. Sąryšinėje duomenų bazėje galite suskirstyti informaciją į atskiras temines lenteles. Tuomet, norėdami sujungti informaciją, naudokite lentelių ryšius.
Ryšio „vienas su daugeliu“ kūrimas
Panagrinėkime tokį pavyzdį: duomenų bazėje yra lentelės Tiekėjai ir Produktai. Tiekėjas gali tiekti bet kokį produktų skaičių. Todėl lentelėje Produktai gali būti daug produktų, kuriuos tiekia kuris tiekėjas, įtrauktas į lentelę Tiekėjai. Ryšys tarp lentelės Tiekėjai ir lentelės Produktai vadinamas ryšiu „vienas su daugeliu“.
Norėdami, kad ryšys „vienas su daugeliu“ būtų įtrauktas į duomenų bazės struktūrą, pirminį raktą, esantį ryšio pusėje „vienas“, įtraukite į lentelės ryšio pusę „daugelis“ kaip papildomą stulpelį arba stulpelius. Šiuo atveju lentelės Tiekėjai stulpelį Tiekėjo ID reikia įtraukti į lentelę Užsakymai. Tuomet „Access“, naudodama lentelėje Produktai esantį tiekėjo ID, gali rasti kiekvieno produkto tiekėją.
Lentelėje Produktai esantis stulpelis Tiekėjo ID vadinamas išoriniu raktu. Išorinis raktas yra kitos lentelės pirminis raktas. Lentelėje Produktai esantis stulpelis Tiekėjo ID yra išorinis raktas todėl, kad jis yra ir lentelės Tiekėjai pirminis raktas.
Kurdami susijusių lentelių pirminių ir išorinių raktų poras sukuriate pagrindą, kuriuo remiantis galima sujungti lentelių informaciją. Jei nesate tikri, kuriose lentelėse reikia naudoti bendrą stulpelį, nustačius ryšį „vienas su daugeliu“ galima būti tikriems, kad dviem susijusioms lentelėms išties reikės bendro stulpelio.
Ryšio „daugelis su daugeliu“ kūrimas
Panagrinėkime ryšį tarp lentelės Tiekėjai ir lentelės Produktai.
Į vieną užsakymą gali būti įtrauktas daugiau nei vienas produktas. Kita vertus, vienas produktas gali būti nurodytas keliuose užsakymuose. Todėl lentelėje Produktai gali būti po kelis kiekvieną lentelės Užsakymai įrašą atitinkančius įrašus. Taip pat lentelėje Užsakymai gali būti po kelis kiekvieną lentelės Produktai įrašą atitinkančius įrašus. Toks ryšys vadinamas „daugelis su daugeliu“, nes gali būti daug kiekvieno produkto užsakymų, ir atvirkščiai – kiekviename užsakyme gali būti daug produktų. Nepamirškite, kad norint aptikti lentelių ryšį „daugelis su daugeliu“, svarbu atsižvelgti į abi ryšio puses.
Dviejų lentelių temos – užsakymai ir produktai – yra susietos ryšiu „daugelis su daugeliu“. Tai yra problema. Įsivaizduokite, kas nutiktų, jei bandydami sukurti ryšį tarp dviejų lentelių, įtrauktumėte lauką Produkto ID į lentelę Užsakymai. Kad viename užsakyme būtų daugiau nei vienas produktas, lentelėje Užsakymai kiekvienas užsakymas turi turėti daugiau nei vieną įrašą. Tokiu atveju užsakymo informaciją reikės kartoti kiekvienoje užsakymo eilutėje, todėl lentelės struktūra bus neefektyvi ir duomenys gali tapti netikslūs. Su tokia pačia problema susidursite, jei lentelėje Produktai įtrauksite lauką Užsakymo ID – tokiu atveju lentelėje Produktai kiekvienam produktui bus skirta daugiau nei vienas įrašas. Kaip išspręsti šią problemą?
Reikia sukurti trečią lentelę, dažnai vadinamą jungiamąja lentele, kuri ryšį „daugelis su daugeliu“ suskaido į du ryšius „vienas su daugeliu“. Abiejų lentelių pirminius raktus įterpsite į trečią lentelę. Todėl trečioje lentelę bus įrašyti visi ryšio atvejai ir egzemplioriai.
Kiekvienas įrašas lentelėje Užsakymų išsami informacija atitinka vieną užsakymo eilutės elementą. Lentelės Užsakymų išsami informacija pirminis raktas sudarytas iš dviejų laukų – lentelių Užsakymai ir Produktai išorinių raktų. Kaip pirminį šios lentelės raktą naudoti tik lauką Užsakymo ID negalima, nes viename užsakyme gali būti daug eilutės elementų. Užsakymo ID kartojamas kiekvienam užsakymo eilutės elementui, todėl lauko reikšmės nėra unikalios. Taip pat negalima naudoti tik lauko Produkto ID, nes produktas gali būti įtrauktas į daug skirtingų užsakymų. Tačiau naudojami kartu abu laukai visuomet sukuria unikalią kiekvieno įrašo reikšmę.
Produktų pardavimo duomenų bazėje lentelės Užsakymai ir Produktai nėra viena su kita susietos tiesiogiai. Tačiau jos yra netiesiogiai susietos per lentelę Užsakymų išsami informacija. Ryšys „daugelis su daugeliu“ tarp užsakymų ir produktų duomenų bazėje sukurtas naudojant du ryšius „vienas su daugeliu“.
-
Lentelės Užsakymai ir Užsakymų išsami informacija susietos ryšiu „vienas su daugeliu“. Kiekviename užsakyme gali būti daugiau nei vienas eilutės elementas, bet kiekvienas eilutės elementas sujungtas tik su vienu užsakymu.
-
Lentelės Produktai ir Užsakymų išsami informacija susietos ryšiu „vienas su daugeliu“. Kiekvienas produktas gali turėti daug su juo susietų eilutės elementų, bet kiekvienas eilutės elementas nurodo tik vieną produktą.
Lentelėje Užsakymų išsami informacija galite nustatyti visus į tam tikrą užsakymą įtrauktus produktus. Taip pat galite nustatyti visus tam tikro produkto užsakymus.
Įtraukus lentelę Užsakymų išsami informacija, lentelių ir laukų sąrašas gali atrodyti maždaug taip:
Ryšio „vienas su vienu“ kūrimas
Dar galimas ryšys „vienas su vienu“. Tarkime, jums reikia įrašyti specialią papildomą informaciją apie produktą, kurios reikės retai arba ji bus taikoma tik keliems produktams. Kadangi šios informacijos reikės nedažnai, o saugant informaciją lentelėje Produktai atsirastų tuščių kiekvieno produkto, kuriam ši informacija netaikoma, laukų, šiai informacijai reikia sukurti atskirą lentelę. Pavyzdžiui, lentelėje Produktai naudojamas pirminis raktas produkto ID. Ryšys tarp šios papildomos lentelės ir lentelės Produktai „vienas su vienu“. Kiekvienas lentelėje Produktai esantis įrašas turi po vieną įrašą papildomos lentelėje. Nustačius tokį ryšį, abiejose lentelės turi būti bendras laukas.
Jei paaiškės, kad duomenų bazėje reikia sukurti ryšį „vienas su vienu“, pagalvokite, ar nebūtų galima sujungti informaciją iš abiejų lentelių į vieną. Jei dėl kažkokių priežasčių nenorite to daryti, pavyzdžiui, kad atsiras daug tuščios vietos, toliau tolesniame sąraše parodyta, kaip pateikti ryšį duomenų bazės struktūroje:
-
Jei abiejų lentelių tema ta pati, nustatyti ryšį galima naudojant abiem lentelėms vieną pirminį raktą.
-
Jei abiejų lentelių temos ir pirminiai raktai skiriasi, pasirinkite vieną iš lentelių (bet kurią) ir jos pirminį raktą įterpkite į kitą lentelę kaip išorinį.
Ryšiai tarp lentelių padeda užtikrinti, kad lentelės ir stulpeliai bus tinkami. Jei nustatyti „vienas su vienu“ arba „vienas su daugeliu“ ryšiai, lentelėse turi būti vienas arba keli bendri stulpeliai. Jei nustatytas ryšys „vienas su daugeliu“, reikalinga trečia ryšiui skirta lentelė.
Struktūros tikslinimas
Sukūrus reikiamas lenteles, laukus ir ryšius, reikia užpildyti lenteles duomenų pavyzdžiais ir pabandyti atlikti su jais įvairius veiksmus: kurti užklausas, įtraukti naujus įrašus ir t. t. Taip galėsite aptikti potencialias problemas, pavyzdžiui, gali paaiškėti, kad kurdami pamiršote įtraukti kokį nors stulpelį arba reikia išskaidyti vieną lentelę į dvi, kad pašalintumėte dublikatus.
Patikrinkite, ar galima iš duomenų bazės gauti norimus atsakymus. Sukurkite formų ir ataskaitų juodraščius ir patikrinkite, ar juose yra duomenys, kurių tikitės. Paieškokite nereikalingų duomenų dublikatų, ir jei tokių rastumėte, pakeiskite duomenų bazės struktūrą.
Bandydami pradinę duomenų bazę tikriausiai atrasite tobulintinų dalykų. Štai keletas dalykų, kuriuos reikėtų patikrinti:
-
Ar nepamiršote kokių nors stulpelių? Jei taip, ar ši informacija susijusi su esamomis lentelėmis? Jei tai su kita tema susijusi informacija, reikės sukurti kitą lentelę. Sukurkite stulpelį kiekvienam informacijos elementui, kurį reikia sekti. Jei informacijos negalima apskaičiuoti remiantis kitais stulpeliais, greičiausiai reikės naujo stulpelio.
-
Ar nėra nebūtinų stulpelių, kuriuos galima apskaičiuoti pagal esamus laukus? Jei informacijos elementą galima apskaičiuoti pagal kitus esamus stulpelius, tarkime, kaina su nuolaida pagal mažmeninę kainą, geriau nekurti naujų stulpelių.
-
Ar tenka keletą kartų įvesti pasikartojančią informaciją į vieną iš lentelių? Jei taip, tikriausiai turite lentelę suskaidyti į dvi lenteles, kuriose yra ryšys „viensa su daugeliu“.
-
Ar turite lentelių su daugeliu laukų, nedideliu kiekiu įrašų ir daug tuščių laukų atskiruose įrašuose? Jei taip, pagalvokite apie lentelės pertvarkymą, kad joje būtų mažiau laukų ir daugiau įrašų.
-
Ar kiekvienas informacijos elementas suskirstytas į mažiausias įmanomas naudingas dalis? Informacijos elementus, kuriuos reikia naudoti kuriant ataskaitas, rikiuojant, ieškant arba apskaičiuojant, reikia įtraukti atskirame stulpelyje.
-
Ar kiekviename stulpelyje esantys duomenys susiję su lentelės tema? Jei stulpelyje nėra informacijos, susijusios su lentelės temą, ji turi būti kitoje lentelėje.
-
Ar visiems ryšiams tarp lentelių yra sukurti bendri laukai arba trečia lentelė? Jei naudojami ryšiai „vienas su vienu“ ir „vienas su daugeliu“, reikia daugiau bendrų laukų. Jei ryšys yra „daugelis su daugeliu“, reikalinga trečia lentelė.
Lentelės Produktai tikslinimas
Tarkime, kad kiekvieną produktų pardavimo duomenų bazėje esantį produktą galima priskirti bendrajai kategorijai, pavyzdžiui, gėrimai, prieskoniai arba jūros gėrybės. Lentelėje Produktai gali būti laukas, kuriame rodoma kiekvieno produkto kategorija.
Tarkime, kad išanalizavę ir patikslinę duomenų bazės struktūrą galite nuspręsti, kad kategorijos aprašas būtų saugomas kartu su jos pavadinimu. Jei įtrauksite lauką Kategorijos aprašas į lentelę Produktai, kiekvienos kategorijos aprašą turėsite pakartoti kiekvienam produktui, priskirtam tai kategorijai – tai nėra geras sprendimas.
Vertėtų kategorijas paversti nauja duomenų bazės tema ir sukurti joms lentelę ir atskirą pirminį raktą. Tada galėsite įtraukti pirminį raktą iš lentelės Kategorijos į lentelę Produktai kaip išorinį raktą.
Lentelės Kategorijos ir Produktai susietos ryšiu „vienas su daugeliu“: kategorija gali apimti daugiau nei vieną produktą, tačiau produktas gali priklausyti tik vienai kategorijai.
Peržiūrėdami lentelių struktūrą, atkreipkite dėmesį, ar nėra pasikartojančių grupių. Išanalizuokime lentelę, kurioje yra šie stulpeliai:
-
Produkto ID
-
Pavadinimas
-
1 produkto ID
-
1 pavadinimas
-
2 produkto ID
-
2 pavadinimas
-
3 produkto ID
-
3 pavadinimas
Čia kiekvienas produktas yra pasikartojanti grupė stulpelių, kurie skiriasi tik tuo, kad pavadinimo pradžioje įtraukiamas skaičius. Jei stulpeliai sunumeruoti tokiu būdu, turėtumėte peržiūrėti struktūrą.
Tokia struktūra turi kelis trūkumus. Pirmiausia reikės nustatyti viršutinę produktų skaičiaus ribą. Kuo viršysite šią ribą, turėsite į lentelės struktūrą įtraukti naują stulpelių grupę, o tai nėra paprasta administravimo užduotis.
Kita problema, kad tų tiekėjų, kurie turi mažiau prekių nei didžiausias leidžiamas produktų skaičius, papildomi stulpeliai bus tušti ir užims vietą. Tačiau didžiausias tokios struktūros trūkumas, kad daug užduočių tampa sunku atlikti, pavyzdžiui, rikiuoti ar indeksuoti lentelę pagal produkto ID arba pavadinimą.
Aptikę pasikartojančių grupių, patikrinkite, ar nebūtų galima vieną lentelę suskaidyti į dvi. Anksčiau pateiktame pavyzdyje būtų parankiau naudoti dvi lenteles, vieną tiekėjams, kitą produktams, susietiems naudojant tiekėjo ID.
Normalizavimo taisyklių taikymas
Kitas duomenų bazės kūrimo veiksmas galėtų būti duomenų normalizavimo taisyklių (kartais vadinamų tiesiog normalizavimo taisyklėmis) pritaikymas. Šios taisyklės naudojamos tikrinant, ar jūsų lentelių struktūra tinkama. Taisyklių taikymas duomenų bazės struktūrai vadinamas duomenų bazės normalizavimu arba tiesiog normalizavimu.
Normalizavimą naudingiausia atlikti turint visus informacijos elementus ir sukūrus pradinę struktūrą. Šio proceso tikslas – patikrinti, ar informacijos elementus suskirstėte į tinkamas lenteles. Pačių duomenų elementų teisingumas normalizavimo proceso metu nėra tikrinamas.
Normalizavimo taisykles reikia taikyti nuosekliai, kiekviename etape tikrinant, ar duomenų bazės struktūra atitinka vadinamąsias normalines formas. Dažniausiai naudojamos penkios normalinės formos – nuo pirmos iki penktos. Šiame straipsnyje aptariamos trys pirmosios, nes paprastai jų užtenka daugumai duomenų bazių.
Pirmoji normalinė forma
Pirmoji normalinė forma nurodo, kad kiekvienos eilutės ir stulpelio susikirtime lentelėje turi būti viena reikšmė ir niekada reikšmių sąrašas. Pavyzdžiui, negali būti lauko, pavadinto Kaina, kuriame nurodyta daugiau nei viena kaina. Jei įsivaizduotumėte kiekvieną eilutes ir stulpelio sankirtą kaip langelį, kiekviename langelyje gali būti tik viena reikšmė.
Antroji normalinė forma
Antroji normalinė forma reikalauja, kad kiekvienas neraktinis stulpelis būtų visiškai priklausomas nuo viso pirminio rakto, o ne tik jo dalies. Ši taisyklė taikoma, kai turite pirminį raktą, kurį sudaro daugiau nei vienas stulpelis. Tarkime, turite lentelę, kurioje yra šie stulpeliai, be to, stulpeliai Užsakymo ID ir Produkto ID sudaro pirminį raktą:
-
Užsakymo ID (pirminis raktas)
-
Produkto ID (pirminis raktas)
-
Produkto pavadinimas
Tokia struktūra pažeidžia antrosios normalinės formos reikalavimus, nes Produkto pavadinimas priklauso nuo Produkto ID, bet ne nuo Užsakymo ID, todėl jis nepriklauso nuo viso pirminio rakto. Turite pašalinti stulpelį Produkto pavadinimas iš lentelės. Ji turi būti kitoje lentelėje (Produktai).
Trečioji normalinė forma
Trečioji normalinė forma reikalauja, kad ne tik kiekvienas stulpelis, kuris nėra raktinis, priklausytų nuo viso pirminio rakto, bet taip pat kad neraktiniai stulpeliai būtų nepriklausomi vienas nuo kito.
Kitaip tariant, kiekvienas stulpelis, kuris nėra raktinis, turi būti priklausyti tik nuo pirminio rakto. Tarkime, turime lentelę, kurioje yra šie stulpeliai:
-
Produkto ID (pirminis raktas)
-
Pavadinimas
-
Rekomenduojama mažmeninė kaina
-
Nuolaida
Nuolaida priklauso nuo rekomenduojamos mažmeninės kainos. Ši lentelė neatitinka trečios normalizuotos formos, nes stulpelis Nuolaida, kuris nėra raktinis, priklauso nuo kito neraktinio stulpelio Rekomenduojama mažmeninė kaina. Stulpelio nepriklausomumas reiškia, kad jį galėsite pakeisti bet kuriuo stulpeliu, kuris nėra raktinis, ir šis pakeitimas neturės įtakos jokiam kitam stulpeliui. Jei pakeisite lauko Rekomenduojama mažmeninė kaina reikšmę, atitinkamai pasikeis ir Nuolaida, todėl bus pažeista taisyklė. Šiuo atveju stulpelį Nuolaida reikia perkelti į kitą lentelę, kur stulpelis Rekomenduojama mažmeninė kaina būtų raktinis.