Ryšys „vienas su daugeliu“duomenų bazėje atsiranda, kai kiekvienas A lentelės įrašas gali turėti daug susietų įrašų B lentelėje, bet kiekvienas įrašas B lentelėje gali turėti tik vieną atitinkamą įrašą A lentelėje.
Ryšys „vienas su daugeliu“duomenų bazėje yra labiausiai paplitęs reliacinės duomenų bazės dizainas ir yra gero dizaino pagrindas.
Duomenų bazės taip pat gali įdiegti „vienas su vienu“ir „daugelis su daugeliu“ryšį.
Vienas su daugeliu santykių pavyzdys
Apsvarstykite mokytojo ir jo dėstomų kursų santykį. Mokytojas gali dėstyti kelias klases, bet kurso santykis su mokytoju nebus toks pat.
Todėl kiekviename Mokytojų lentelės įraše gali būti daug įrašų lentelėje Kursai. Šis pavyzdys iliustruoja „vienas su daugeliu“ryšį: vienas mokytojas į kelis kursus.
Kodėl svarbu užmegzti ryšį vienas su daugeliu
Norėdami parodyti ryšį vienas su daugeliu, jums reikia bent dviejų lentelių. Pažiūrėkime kodėl.
Pirmosios normalios formos dizaino laikymasis
Galbūt sukūrėme lentelę, kurioje norime įrašyti pavadinimą ir dėstomus kursus. Mokytojų ir kursų lentelę galime sukurti taip:
Mokytojo_ID | Mokytojo_vardas | Kursas |
---|---|---|
Teacher_001 | Karmen | Biologija |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge | Anglų k. |
O jei Karmen dėsto du ar daugiau kursų? Su šiuo dizainu turime dvi galimybes. Galėtume pridėti jį prie esamo Carmen įrašo, pavyzdžiui:
Mokytojo_ID | Mokytojas_Vardas | Kursas |
---|---|---|
Teacher_001 | Karmen | Biologija, matematika |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge | Anglų k. |
Tačiau aukščiau pateiktas dizainas yra nelankstus ir vėliau gali kilti problemų įterpiant, redaguojant arba ištrinant duomenis. Dėl to sunku ieškoti duomenų.
Šis dizainas taip pat pažeidžia pirmąjį duomenų bazės normalizavimo principą – Pirmąją normaliąją formą (1NF), kuris teigia, kad kiekvienoje lentelės langelyje turi būti vienas atskiras duomenų fragmentas.
Antroji normalios formos taisyklė
Kita dizaino alternatyva galėtų būti pridėti antrąjį Carmen įrašą:
Mokytojas_ID | Mokytojas_Vardas | Kursas |
---|---|---|
Teacher_001 | Karmen | Biologija |
Teacher_001 | Karmen | Matematika |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge | Anglų k. |
Šis metodas atitinka 1NF, bet vis tiek yra prastas duomenų bazės dizainas, nes atsiranda perteklius ir gali be reikalo išpūsti didelę duomenų bazę. Dar svarbiau, kad duomenys gali tapti nenuoseklūs.
Pavyzdžiui, kas būtų, jei pasikeistų Karmen vardas? Kažkas, dirbantis su duomenimis, gali atnaujinti savo vardą viename įraše, o neatnaujinti antrame įraše.
Ši konstrukcija pažeidžia antrosios normalios formos (2NF) standartą, kuris atitinka 1NF, ir taip pat turi vengti kelių įrašų pertekliaus. 2NF taisykle tai pasiekiama atskiriant duomenų poaibius į kelias lenteles ir sukuriant ryšį tarp jų.
Kaip sukurti duomenų bazę naudojant „vienas su daugeliu“ryšius
Norėdami įdiegti „vienas su daugeliu“ryšį lentelėje „Mokytojai ir kursai“, suskaidykite lenteles į dvi dalis ir susiekite jas naudodami išorinį raktą.
Čia pašalinome stulpelį Kursas iš lentelės Mokytojai:
Mokytojas_ID | Mokytojas_Vardas |
---|---|
Teacher_001 | Karmen |
Teacher_002 | Veronika |
Teacher_003 | Jorge |
Ir čia yra kursų lentelė. Atminkite, kad jo išorinis raktas Teacher_ID susieja kursą su mokytoju lentelėje Mokytojai:
Kurso_ID | Kurso_pavadinimas | Mokytojo_ID |
---|---|---|
Kursas_001 | Biologija | Teacher_001 |
Kursas_002 | Matematika | Teacher_001 |
Kursas_003 | Anglų k. | Teacher_003 |
Sukūrėme ryšį tarp Mokytojų ir Kursų lentelės naudodami užsienio raktą. Šis susitarimas mums sako, kad Karmen moko ir biologiją, ir matematiką, o Jorge moko anglų kalbos.
Matome, kaip naudojant šį dizainą išvengiama bet kokių galimų pertekliaus, atskiriems mokytojams leidžiama dėstyti kelis kursus ir įgyvendinamas ryšys „vienas su daugeliu“.