Duomenys tarp vieno ir daugelio duomenų bazėje įvyksta tada, kai kiekviename A lentelės įraše gali būti daug susijusių įrašų B lentelėje, tačiau kiekviename B lentelės įraše gali būti tik vienas atitinkamas įrašas A lentelėje. Tarpusavio ryšys tarp vieno duomenų bazė yra dažniausiai naudojama reliacinė duomenų bazė ir yra gero dizaino pagrindas.
Apsvarstykite santykius tarp mokytojo ir dėstomų kursų. Mokytojas gali mokyti kelis kursus, tačiau kursas neturėtų vienodo ryšio su mokytoju.
Todėl kiekvieno įrašo lentelėje "Mokytojai" kursų lentelėje gali būti daug įrašų. Tai santykis "vienas su daugybe": vienas mokytojas keliems kursams.
Kodėl svarbu nustatyti vieno ir daugelio santykius?
Norėdami atstovauti santykiui "vienas su daugeliu", reikia bent dviejų lentelių. Pažiūrėkime, kodėl.
Galbūt mes sukūrėme lentelę, kurioje norėjome įrašyti vardą ir kursus. Mes galime suprojektuoti taip:
Teacher_ID | Mokytojo vardas | Kursas |
---|---|---|
Teacher_001 | Karmenas | Biologija |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge'as | Anglų |
Ką daryti, jei Carmen moko du ar daugiau kursų? Turime dvi šio dizaino galimybes. Galėtume tik pridėti jį prie "Carmen" esamo įrašo:
Teacher_ID | Mokytojas_Vardas | Kursas |
---|---|---|
Teacher_001 | Karmenas | Biologija, matematika |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge'as | Anglų |
Tačiau aukščiau pateikta konstrukcija yra nelanksti ir gali sukelti problemų vėliau bandant įterpti, redaguoti ar ištrinti duomenis.
Dėl to sunku ieškoti duomenų. Šis dizainas pažeidžia pirmąjį duomenų bazės normalizavimo principą - "First Normal Form" (1NF), kuriame teigiama, kad kiekvienoje lentelės ląstelėje turi būti viena atskira duomenų dalis.
Kitas dizaino alternatyva gali būti paprasčiausiai pridėti antrą įrašą "Carmen":
Mokytojas_ID | Mokytojas_Vardas | Kursas |
---|---|---|
Teacher_001 | Karmenas | Biologija |
Teacher_001 | Karmenas | Matematika |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge'as | Anglų |
Tai atitinka "1NF", bet vis dar yra prasta duomenų bazių projektavimas, nes jis sukuria dubliavimą ir gali be reikalo išpūsti labai didelę duomenų bazę. Dar svarbiau, kad duomenys gali tapti nenuoseklūs. Pavyzdžiui, jei būtų pakeistas Carmeno vardas? Kažkas, kuris dirba su duomenimis, gali atnaujinti savo vardą viename įraše ir nepavyko atnaujinti antrojo įrašo. Šis dizainas pažeidžia antrąją įprastą formą (2NF), kuri laikosi 1NF, taip pat turi išvengti kelių įrašų atleidimų, atskirdami duomenų pogrupius į kelias lenteles ir kuriant tarpusavio santykius.
Kaip sukurti duomenų bazę su daugybe santykių
Norėdami įdiegti santykius "vienas su daugeliu" Mokytojų ir kursų lentelėje, mes sulaužome lenteles į dvi dalis ir susieiname juos naudodami užsienio raktą.
Čia pašalinome stulpelį "Kurso" lentelėje "Mokytojai":
Mokytojas_ID | Mokytojas_Vardas |
---|---|
Teacher_001 | Karmenas |
Teacher_002 | Veronika |
Teacher_003 | Jorge'as |
Ir čia yra Kursų stalas. Atkreipkite dėmesį, kad jo užsienio raktas, "Teacher_ID", susieja kursą su dėstytoju Mokytojų lentelėje:
Kursas_ID | Kurso pavadinimas | Teacher_ID |
---|---|---|
Kursas_001 | Biologija | Teacher_001 |
Kursas_002 | Matematika | Teacher_001 |
Kursas_003 | Anglų | Teacher_003 |
Mes sukūrėme ryšį tarp Mokytojų ir Kursų stalo naudodami užsienio raktą.
Tai sako mums, kad Karmenas mokė ir biologiją, ir matematiką, o Jorge dėsto anglų kalbą.
Mes galime pamatyti, kaip ši konstrukcija išvengia bet kokių galimų darbuotojų atleidimų, leidžia atskiriems mokytojams mokyti kelis kursus ir įgyvendina santykius "vienas su daugybe".
Duomenų bazės taip pat gali įgyvendinti santykius "vienas su vienu" ir daugelį santykių.