Viena daugybe santykių duomenų bazėje

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-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 Mokytojų lentelę, kurioje norėjome įrašyti vardą ir kursus. Mes galime suprojektuoti taip:

Mokytojai ir kursai
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:

Mokytojai ir kursai
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":

Mokytojai ir kursai
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 sukonfigūruoti 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":

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:

Kursai
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ų.