Attiecības viens pret vairākiem datu bāzē rodas, ja katram ierakstam tabulā A var būt daudz saistītu ierakstu tabulā B, bet katram ierakstam tabulā B var būt tikai viens atbilstošs ieraksts A tabulā.
Attiecības viens pret daudziem datu bāzē ir visizplatītākais relāciju datu bāzes dizains, un tas ir laba dizaina pamatā.
Datu bāzes var arī ieviest attiecības viens pret vienu un attiecības daudzi pret daudziem.
Attiecību viens pret daudziem piemērs
Apsveriet attiecības starp skolotāju un viņu pasniegtajiem kursiem. Skolotājs var pasniegt vairākas nodarbības, taču kursam nebūtu tādas pašas attiecības ar skolotāju.
Tādēļ katram ierakstam skolotāju tabulā var būt daudz ierakstu tabulā Kursi. Šis piemērs ilustrē attiecības viens pret daudziem: viens skolotājs vairākiem kursiem.
Kāpēc ir svarīgi izveidot attiecības viens pret daudziem
Lai attēlotu attiecības viens pret daudziem, ir nepieciešamas vismaz divas tabulas. Redzēsim, kāpēc.
Pirmās parastās formas dizaina ievērošana
Varbūt izveidojām tabulu, kurā vēlamies ierakstīt nosaukumu un pasniegtos kursus. Mēs varētu izveidot skolotāju un kursu tabulu šādi:
Skolotāja_ID | Skolotāja_vārds | Kurss |
---|---|---|
Skolotājs_001 | Karmena | Bioloģija |
Skolotājs_002 | Veronika | Math |
Skolotājs_003 | Jorge | angļu valoda |
Ko darīt, ja Karmena māca divus vai vairākus kursus? Ar šo dizainu mums ir divas iespējas. Mēs varētu to pievienot Karmenas esošajam ierakstam, piemēram:
Skolotāja_ID | Skolotājs_Vārds | Kurss |
---|---|---|
Skolotājs_001 | Karmena | Bioloģija, matemātika |
Skolotājs_002 | Veronika | Math |
Skolotājs_003 | Jorge | angļu valoda |
Tomēr iepriekš minētais dizains ir neelastīgs un var radīt problēmas vēlāk, ievietojot, rediģējot vai dzēšot datus. Tas apgrūtina datu meklēšanu.
Šis dizains pārkāpj arī pirmo datu bāzes normalizācijas principu - pirmo normālo formu (1NF), kas nosaka, ka katrā tabulas šūnā ir jāietver viens, diskrēts datu fragments.
Otrais parastās formas noteikums
Cita dizaina alternatīva varētu būt pievienot otru Karmenas ierakstu:
Skolotājs_ID | Skolotājs_Vārds | Kurss |
---|---|---|
Skolotājs_001 | Karmena | Bioloģija |
Skolotājs_001 | Karmena | Math |
Skolotājs_002 | Veronika | Math |
Skolotājs_003 | Jorge | angļu valoda |
Šī pieeja atbilst 1NF, taču joprojām ir vājš datu bāzes dizains, jo tas rada dublēšanos un var nevajadzīgi uzpūst lielu datu bāzi. Vēl svarīgāk ir tas, ka dati var kļūt nekonsekventi.
Piemēram, kā būtu, ja mainītos Karmenas vārds? Kāds, kas strādā ar datiem, var atjaunināt viņas vārdu vienā ierakstā, bet neizdosies to atjaunināt otrajā ierakstā.
Šis dizains pārkāpj otrās parastās formas (2NF) standartu, kas atbilst 1NF, un tam ir arī jāizvairās no vairāku ierakstu dublēšanas. 2NF kārtula to panāk, atdalot datu apakškopas vairākās tabulās un izveidojot starp tām attiecības.
Kā izveidot datu bāzi ar vienlīdzīgām attiecībām
Lai tabulā Skolotāji un kursi ieviestu attiecību viens pret daudziem, sadaliet tabulas divās daļās un saistiet tās, izmantojot ārējo atslēgu.
Šeit mēs noņēmām sleju Kurss no tabulas Skolotāji:
Skolotājs_ID | Skolotājs_Vārds |
---|---|
Skolotājs_001 | Karmena |
Skolotājs_002 | Veronika |
Skolotājs_003 | Jorge |
Un šeit ir kursu tabula. Ņemiet vērā, ka tās ārējā atslēga Teacher_ID saista kursu ar skolotāju tabulā Teachers:
Kursa_ID | Kursa_nosaukums | Skolotāja_ID |
---|---|---|
Kurss_001 | Bioloģija | Skolotājs_001 |
Kurss_002 | Math | Skolotājs_001 |
Kurss_003 | angļu valoda | Skolotājs_003 |
Mēs esam izveidojuši attiecības starp skolotāju un kursu tabulu, izmantojot ārējo atslēgu. Šis izkārtojums mums parāda, ka Karmena māca gan bioloģiju, gan matemātiku un ka Horhe māca angļu valodu.
Mēs varam redzēt, kā šis dizains ļauj izvairīties no iespējamās atlaišanas, ļauj atsevišķiem skolotājiem mācīt vairākus kursus un ievieš attiecības viens pret daudziem.