On seuraavanlainen tietorakenne:
http://dl.getdropbox.com/u/175564/1.png
Ja tehtävä on "Muunna kaavio relaatiotietokannan tauluiksi ja esitä relaatiokaavio tehtävässä 2 käytetyllä
tekniikalla". Tuo tehtävä kahden tapa näkyy seuraavassa linkissä.
Vastaus on:
http://dl.getdropbox.com/u/175564/2.png
En ymmärrä, miten vastauksen kaksi viimeistä riviä on toteutettu. En myös ymmärrä miten nuo nuolet on saatu aikaan (foreign keyt?).
Tiedän, että ongelma liittyy aputauluihin. Miten ratkaisisitte vastaavanlaisen tehtävän?
Sami
Nuo kaksi viimeistä riviä näyttävät olevat monta-moneen -liitoksen toteuttavia tauluja. Ei tuohon kai mitään muuta järkevää toteutustapaa ole.
Google: sql many-to-many table
Kiitos vinkistä!
Nuo aputaulut kirveltää vielä mieltä.
Kuinka nuo kaksi viimeistä riviä on toteutettu? Eihän ensimmäisessä kuvassa ole ohjaus ja tarkastaja tauluja. Miten voi tietää, että vain juuri edelliset taulut ovat aputauluja.
Sami
Ylimääräinen taulu tarvitaan, kun käsitekaaviossa kahden laatikon välisen viivan molemmissa päissä voi olla ykköstä suurempi luku.
Esimerkiksi samaa gradua voi ohjata kaksi opettajaa ja saman opettajan vastuulla voi olla viisi gradua. Nyt gradu-taulussa ei voi suoraan viitata opettaja-tauluun, koska viittaus kohdistuisi kahteen opettaja-taulun riviin. Samoin opettaja-taulussa ei voi suoraan viitata gradu-tauluun, koska viittaus kohdistuisi viiteen gradu-taulun riviin. Ainoa ratkaisu on luoda ylimääräinen taulu, jossa kerrotaan, kuka opettaja ohjaa mitäkin gradua.
Jos olisikin niin, että gradulla olisi aina vain yksi ohjaaja, ylimääräinen taulu olisi tarpeeton. Nyt gradu-taulussa voisi viitata suoraan opettaja-tauluun. Myöskin jos yksi opettaja ohjaisi aina korkeintaan yhtä gradua, opettaja-taulussa voisi viitata suoraan gradu-tauluun.
Tämä kaikki nojaa siihen periaatteeseen, että viittauksen täytyy kohdistua toisen taulun yksittäiseen riviin. Tietysti esimerkiksi opettaja-taulussa voisi tallentaa yhteen kenttään merkkijonona kaikki opettajan ohjaamat gradut ja ylimääräisen taulun voisi jättää pois. Tämä ei kuitenkaan olisi hyvä toteutustapa, koska merkkijonosta olisi vaivalloista kaivella yksittäisiä tietoja tauluista hakevissa kyselyissä.
Erinomainen vastaus!
Muutama kohta jäi hämäräksi vielä.
1. Mistä ja miten tiedät, että saman opettajan vastuulla voi olla viisi gradua? Eikö yhden opettajan vastuulla voi olla korkeintaan 10 gradua, koska kahdella opettajalla voi olla korkeintaan 20 gradua?
2. Millä periaatteella tuo aputaulu "ohjaus" on tehty? Eli kuinka voi päätellä, että juuri gradu_tunnus viittaa graduuun ja juuri ohjaaja viittaa opettajaan?
Voisihan kysymys olla abstraktimpi, jolloin tarkkoja viittauksen kohteen nimiä ei tiedettäisi. Eli onko aputaulussa aina kaksi kohtaa, joissa viittaukset muualle?
Sami
1. Jos niitä on korkeintaan kymmenen, niin eikö niitä silloin voi olla myös viisi? Nyt kyselet jo ihan kummia. Kuitenkin kaavion mukaan siis joka opettajalla voisi olla 20 gradua ja joka gradulla kaksi opettajaa.
2. Tämähän on aivan sopimuskysymys. Yhtä hyvin voitaisiin käyttää niminä perunaa ja porkkanaa. On kuitenkin järkevintä käyttää nimiä, joista voi päätellä, mistä on kysymys.
Tulkitsen kaaviota niin, että tiettyä gradua ohjaa 1–2 opettajaa ja tietty opettaja ohjaa 0–20 gradua.
Tällaisessa tilanteessa lisätaulussa on aina kaksi kenttää, joista toinen viittaa yhteen tauluun ja toinen toiseen.
Nyt selkeni. On kaksi taulua, joissa on molemmissa ykköstä suurempi luku. Näin aputauluun tulee aina kaksi kenttää, joista toinen viittaa yhteen tauluun ja toinen toiseen.
Yksi kohta pulpahti vielä esiin tuosta vastauksesta (kuva 2).
Miten gradun taulussa tekijä viittaa opiskelijaan? Eihän gradu taulussa ole tekijä kenttää, eikä kyseessä ole aputaulu.
Viiteavain (tekijä) viittaa isätaulun (opiskelija) pääavaimeen (opiskelijanumero). Eli yksinkertaisesti siinä kentässä on tekijän opiskelijanumero...
Toki siinä voi myös olla ihan oikea FOREIGN KEY viite, jolloin on mahdollista muunmuassa "vyöryttää" poistaminen isätaulusta lapsitauluhin ( http://appro.mit.jyu.fi/doc/tiedonhallinta/sql/
Muok:
lainaus:
Eihän gradu taulussa ole tekijä kenttää, eikä kyseessä ole aputaulu.
Tulkitsenko nyt ihan väärin mainitsemaasi 2.png -kuvaa, siinähän on "tekijä" kenttä? Käsitekaaviossa niitä viiteavaimia/viitekenttiä sensijaan ei ole, vaan ne lisätään vasta relaatiokaaviossa.
Kiitos JTS!
Tuo selvensi. Mutta miksi tuo tekijä->opiskelija on gradu taulussa, mutta ei opiskelija taulussa? (kuva 2)
Gradulla on tekijä, opiskelijalla ei ole tekijää.
1. Eli ratkaiseeko konteksti sen, mihin tauluun kentät laitetaan? Tässä tapauskessa tekijä on opiskelija taulun vieressä (kuva 1), mutta se menee kontekstin perusteella silti tauluun gradu.
2. Miksi tekijä ei ole esimerkiksi gradu taulun vieressä? Onko syy se, että tekijä toimii viiteavaimena taululle opiskelija (tekijä -> opiskelija)? Ja tämä relaatio sijoitetaan sitten logiikan perusteella tauluun gradu.
Minun vastauksessani on suurehko ero tuohon vastaukseen kuvassa 2.
Minun vastaus:
tarkastus(PK: tarkastusnro, alkoipvm, päättyipvm, tulos, tarkastaja -> opettaja, kohde -> vaihe)
Oikea vastaus
tarkastus(PK: tarkastusnro, alkoipvm, päättyipvm, tulos, (gradu_tunnus, vaihenro) -> vaihe)
*PK = Primary Key
En ymmärrä, miksi gradu_tunnus sekä vaihenro viittaavat "vaihe" tauluun. Gradu_tunnus sarakehan on gradu taulussa.
Kaaviota täytyy tulkita hieman käänteisesti. Gradulla on yksi tekijä, mikä on ilmoitettu opiskelija-taulun vieressä. Opiskelija tekee korkeintaan yhtä gradua, mikä on ilmoitettu gradu-taulun vieressä. Vastaava logiikka pätee muissakin kohdissa.
Tietysti käytännössä viittauksen suunta selviää myös käyttämällä omaa järkeä – ellei sitten tentin laatija viritä ansaa ja laita kaavioon epäloogista viittausta.
Taulun vaihe avain muodostuu kahdesta osasta: gradun tunnuksesta ja vaiheen numerosta (huom. alleviivaus kuvassa). Kun tähän tauluun viitataan taulussa tarkastus, molemmat avaimet täytyy mainita. Taulussa tarkastus ei voida viitata suoraan tauluun opettaja, koska tarkastajia voi olla useampia.
Kertooko tuo nuoli taulusta tarkastus tauluun vaihe, että tarkastus taulu viittaa tauluun vaihe? Samoin kuin vaihe taulu viittaa gradu tauluun.
Löysinpä ratkaisun edelliseen kysymykseeni. Eli jos on A -> B, niin se tarkoittaa, että sarake A on tauluun B viittaava viiteavain.
Aihe on jo aika vanha, joten et voi enää vastata siihen.