Odnos jedan-prema-više u bazi podataka nastaje kada svaki zapis u tabeli A može imati mnogo povezanih zapisa u tabeli B, ali svaki zapis u tabeli B može imati samo jedan odgovarajući zapis u tabeli A.
Odnos jedan-prema-više u bazi podataka je najčešći dizajn relacijske baze podataka i u srcu je dobrog dizajna.
Baze podataka također mogu implementirati odnos jedan-na-jedan i odnos više-prema-više.
Primjer odnosa jedan-prema-više
Razmotrite odnos između nastavnika i kurseva koje predaju. Nastavnik može predavati više časova, ali kurs ne bi imao isti odnos sa nastavnikom.
Stoga, za svaki zapis u tabeli Nastavnici, može postojati mnogo zapisa u tabeli Kursevi. Ovaj primjer ilustruje odnos jedan-prema-više: jedan nastavnik na više kurseva.
Zašto je važno uspostavljanje veze jedan-prema-više
Za predstavljanje odnosa jedan-prema-više, potrebne su vam najmanje dvije tabele. Da vidimo zašto.
Pridržavanje prvog normalnog dizajna
Možda smo kreirali tabelu u koju želimo da zapišemo naziv i kurseve koji se predaju. Mogli bismo dizajnirati tabelu nastavnika i kurseva ovako:
Teacher_ID | Ime_učitelja | Kurs |
---|---|---|
Teacher_001 | Carmen | Biologija |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge | engleski |
Šta ako Carmen predaje dva ili više kurseva? Imamo dvije opcije sa ovim dizajnom. Mogli bismo ga dodati Carmeninom postojećem zapisu, ovako:
Teacher_ID | Učitelj_Ime | Kurs |
---|---|---|
Teacher_001 | Carmen | biologija, matematika |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge | engleski |
Međutim, gornji dizajn je nefleksibilan i može dovesti do problema kasnije kada umetnete, uredite ili izbrišete podatke. To otežava traženje podataka.
Ovaj dizajn takođe krši prvi princip normalizacije baze podataka, First Normal Form (1NF), koji kaže da svaka ćelija tabele treba da sadrži jedan, diskretni deo podataka.
Pravilo drugog normalnog oblika
Druga alternativa dizajnu bi mogla biti dodavanje drugog zapisa za Carmen:
Učitelj_ID | Učitelj_Ime | Kurs |
---|---|---|
Teacher_001 | Carmen | Biologija |
Teacher_001 | Carmen | Matematika |
Teacher_002 | Veronika | Matematika |
Teacher_003 | Jorge | engleski |
Ovaj pristup se pridržava 1NF-a, ali je i dalje loš dizajn baze podataka jer uvodi redundanciju i može nepotrebno naduti veliku bazu podataka. Što je još važnije, podaci bi mogli postati nedosljedni.
Na primjer, šta ako se Karmenino ime promijeni? Neko ko radi s podacima može ažurirati svoje ime u jednom zapisu i ne uspjeti ga ažurirati u drugom zapisu.
Ovaj dizajn krši standard drugog normalnog oblika (2NF), koji se pridržava 1NF i takođe mora izbjeći redundanciju višestrukih zapisa. 2NF pravilo to postiže razdvajanjem podskupova podataka u više tabela i stvaranjem odnosa između njih.
Kako dizajnirati bazu podataka sa vezama jedan-prema-više
Da implementirate odnos jedan-prema-više u tabeli Nastavnici i Kursevi, razbijte tabele na dva dela i povežite ih pomoću stranog ključa.
Ovdje smo uklonili kolonu Kurs u tabeli Nastavnici:
Učitelj_ID | Učitelj_Ime |
---|---|
Teacher_001 | Carmen |
Teacher_002 | Veronika |
Teacher_003 | Jorge |
A evo tabele sa kursevima. Imajte na umu da njegov strani ključ, Teacher_ID, povezuje kurs sa nastavnikom u tabeli Nastavnici:
Course_ID | Naziv_kursa | Teacher_ID |
---|---|---|
Course_001 | Biologija | Teacher_001 |
Course_002 | Matematika | Teacher_001 |
Course_003 | engleski | Teacher_003 |
Razvili smo odnos između nastavnika i tabele kurseva koristeći strani ključ. Ovaj aranžman nam govori da Carmen predaje i biologiju i matematiku i da Jorge predaje engleski.
Možemo vidjeti kako ovaj dizajn izbjegava sve moguće redundancije, omogućava pojedinim nastavnicima da predaju više kurseva i implementira odnos jedan-prema više.