Yksi-moneen-suhde tietokannassa tapahtuu, kun jokaisella taulukon A tietueella voi olla useita linkittyjä tietueita taulukossa B, mutta jokaisella taulukon B tietueella voi olla vain yksi vastaava tietue taulukossa A.
Yksi-moneen-suhde tietokannassa on yleisin relaatiotietokantasuunnittelu, ja se on hyvän suunnittelun ydin.
Tietokannot voivat toteuttaa myös yksi-yhteen- ja useista moneen -suhteen.
Esimerkki kahdenvälisestä suhteesta
Mieti opettajan ja hänen opettamiensa kurssien välistä suhdetta. Opettaja voi opettaa useita luokkia, mutta kurssilla ei olisi samaa suhdetta opettajaan.
Siksi opettajat-taulukon jokaisessa tietueessa voi olla useita tietueita Kurssit-taulukossa. Tämä esimerkki havainnollistaa yksi-moneen-suhdetta: yksi opettaja useille kursseille.
Miksi kahdenkeskisen suhteen luominen on tärkeää
Yksi moneen -suhteen edustamiseksi tarvitset vähintään kaksi taulukkoa. Katsotaanpa miksi.
Ensimmäisen normaalin muodon suunnittelun noudattaminen
Ehkä teimme taulukon, johon haluamme tallentaa nimen ja opetetut kurssit. Voimme suunnitella opettajat ja kurssit -taulukon seuraavasti:
Teacher_ID | Opettajan_nimi | Kurssi |
---|---|---|
Opettaja_001 | Carmen | Biologia |
Opettaja_002 | Veronica | Math |
Opettaja_003 | Jorge | Englanti |
Entä jos Carmen opettaa kahta tai useampaa kurssia? Meillä on kaksi vaihtoehtoa tälle mallille. Voisimme lisätä sen Carmenin olemassa olevaan ennätykseen näin:
Teacher_ID | Opettaja_Nimi | Kurssi |
---|---|---|
Opettaja_001 | Carmen | Biologia, matematiikka |
Opettaja_002 | Veronica | Math |
Opettaja_003 | Jorge | Englanti |
Yllä oleva rakenne on kuitenkin joustamaton ja voi aiheuttaa ongelmia myöhemmin, kun lisäät, muokkaat tai poistat tietoja. Se vaikeuttaa tietojen etsimistä.
Tämä rakenne rikkoo myös tietokannan normalisoinnin ensimmäistä periaatetta, First Normal Form (1NF), jonka mukaan jokaisen taulukon solun tulee sisältää yksittäinen erillinen tieto.
Toinen normaalimuotosääntö
Toinen suunnitteluvaihtoehto voisi olla lisätä Carmenille toinen ennätys:
Opettaja_ID | Opettaja_Nimi | Kurssi |
---|---|---|
Opettaja_001 | Carmen | Biologia |
Opettaja_001 | Carmen | Math |
Opettaja_002 | Veronica | Math |
Opettaja_003 | Jorge | Englanti |
Tämä lähestymistapa noudattaa 1NF:ää, mutta on silti huono tietokantasuunnittelu, koska se aiheuttaa redundanssia ja voi turvottaa suurta tietokantaa tarpeettomasti. Vielä tärkeämpää on, että tiedoista voi tulla epäjohdonmukaisia.
Esimerkiksi mitä jos Carmenin nimi muuttuisi? Joku tietojen parissa työskentelevä saattaa päivittää nimensä yhdessä tietueessa ja epäonnistua toisessa tietueessa.
Tämä rakenne rikkoo 2NF (Second Normal Form) -standardia, joka noudattaa 1NF:ää, ja sen on myös vältettävä useiden tietueiden redundanssia. 2NF-sääntö saavuttaa tämän erottamalla tietojen osajoukot useiksi taulukoiksi ja luomalla niiden välille suhteen.
Kuinka suunnitella tietokanta, jossa on yksi-moneen-suhteita
Ota yksi moneen -suhteen käyttöön Opettajat ja kurssit -taulukossa jakamalla taulukot kahteen osaan ja linkittämällä ne vieraalla avaimella.
Tässä poistimme Kurssi-sarakkeen Opettajat-taulukosta:
Opettaja_ID | Opettaja_Nimi |
---|---|
Opettaja_001 | Carmen |
Opettaja_002 | Veronica |
Opettaja_003 | Jorge |
Ja tässä on Kurssit-taulukko. Huomaa, että sen vierasavain, Teacher_ID, linkittää kurssin opettajaan opettajataulukossa:
Kurssin_tunnus | Kurssin_nimi | Teacher_ID |
---|---|---|
Kurssi_001 | Biologia | Opettaja_001 |
Kurssi_002 | Math | Opettaja_001 |
Kurssi_003 | Englanti | Opettaja_003 |
Olemme kehittäneet suhteen Opettajat- ja Kurssit-taulukon välille vieraalla avaimella. Tämä järjestely kertoo meille, että Carmen opettaa sekä biologiaa että matematiikkaa ja että Jorge opettaa englantia.
Näemme, kuinka tämä suunnittelu välttää mahdolliset irtisanomiset, antaa yksittäisille opettajille mahdollisuuden opettaa useita kursseja ja toteuttaa yksi-moneen-suhteen.