Helsingin yliopisto Tietojenkäsittelytieteen laitos (H.Laine) Tietokantojen perusteet. Liitteenä: Tiivistelmä SQL-syntaksista

Samankaltaiset tiedostot
Kirjoita jokaiseen erilliseen vastauspaperiin kurssin nimi, tenttipäivä, oma nimesi (selkeästi), opiskelijanumerosi ja nimikirjoituksesi

Helsingin yliopisto, Tietojenkäsittelytieteen laitos Tietokantojen perusteet, , H.Laine

Insert lauseella on kaksi muotoa: insert into taulu [(sarakenimet)] values (arvot)

Kirjoita kuhunkin erilliseen vastauspaperiin kurssin nimi, tentin päiväys, oma nimesi, syntymäaikasi ja nimikirjoituksesi.

SQL-perusteet, SELECT-, INSERT-, CREATE-lauseet

TIEDONHALLINTA - SYKSY Luento 11. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Liitokset - haut useaan tauluun

Kyselyn yleisrakenne:

FROM-lausekkeessa voidaan määritellä useampi kuin yksi taulu, josta tietoja haetaan: Tuloksena on taululistassa lueteltujen taulujen rivien

SQL - STRUCTURED QUERY LANGUAGE

select tulostietomäärittely from taulukkeet [where valintaehdot] [group by ryhmitystekijät] [having ryhmärajoitteet] [order by järjestysperusta]

HAAGA-HELIA Heti-09 1 (12) ICT05 Tiedonhallinta ja Tietokannat O.Virkki Näkymät

TIEDONHALLINNAN PERUSTEET - SYKSY 2013

SELECT-lauseen perusmuoto

TIEDONHALLINTA - SYKSY Luento 10. Hannu Markkanen /10/12 Helsinki Metropolia University of Applied Sciences

Tietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

Tällä viikolla. Kotitehtävien läpikäynti Aloitetaan Pelifirman tietovaraston suunnittelu Jatketaan SQL-harjoituksia

Tietokantojen perusteet, syksy 1999 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto. Opettajien nimet: Opiskelijoiden pääaineet

Helsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 SQL- osa Harri Laine 1. SQL-valintaehto. SQL-valintaehto.

OUTER JOIN se vanha kunnon kaveri

CSE-A1200 Tietokannat

Majoittuminen? X.= 2p muut vaihtoehdot 0 p. e) Montako riviä on taulussa Hotelli. tunnus=hotelli

Helsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

HELIA 1 (12) Outi Virkki Tiedonhallinta

Helsingin yliopisto, tktl DO Tietokantojen perusteet, kevät 2000 SQL- osa Harri Laine 1. SQL-yhteenvetofunktiot. SQL-yhteenvetofunktiot

Relaatiotietokantojen perusteista. Harri Laine Helsingin yliopisto

HELIA TIKO-05 1 (17) ICT03D Tieto ja tiedon varastointi Räty, Virkki

HELIA 1 (14) Outi Virkki Tiedonhallinta

Tällä viikolla. Kotitehtävien tarkistus Upotettu SQL Indeksi-harjoitus täydennetään pelifirman tietokantamallia SQL-tehtäviä

TIEDONHALLINTA - SYKSY Luento 8. Saapumisryhmä: Pasi Ranne /9/13 Helsinki Metropolia University of Applied Sciences

SQL. ! nykystandardi SQL3 eli SQL'99. ! CREATE TABLE, ALTER TABLE ja DROP TABLE. ! CREATE VIEW ja DROP VIEW. ! CREATE INDEX ja DROP INDEX

Tietokantasuunnittelun pääperiaatteena on tiedon toiston välttäminen. Tiedon toistumiseen liittyy monenlaisia ongelmia.

Tietokannat II -kurssin harjoitustyö

HELIA TIKO-05 1 (15) ICT03D Tieto ja tiedon varastointi Räty, Virkki

Hakukyselyt: SELECT * FROM taulu WHERE sarake1 = Malli Nimi [WHERE sarake1 LIKE M% ] [WHERE BETWEEN ehto1 AND ehto2] [WHERE sarake1 IN/= (alikysely)]

Helsingin yliopisto, TKTL Tietokantojen perusteet, k 2000 Tietokannan suunnittelusta Harri Laine 1

Harjoitustehtävä 1. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. Harjoitustehtävä 2. SQL kysely

1. Tarkastellaan seuraavaa kaaviota

Tietokantojen suunnittelu, relaatiokantojen perusteita

Tietokantasuunnittelun pääperiaatteena on tiedon toiston välttäminen. Tiedon toistumiseen liittyy monenlaisia ongelmia.

2. Haet työntekijöiden tiedot etunimen mukaan nousevasti järjestettyinä. (ORDER BY) SELECT * FROM employees ORDER BY firstname ASC;

HELIA 1 (17) Outi Virkki Tiedonhallinta

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Tietokantojen perusteet k2004helsingin yliopisto/tktl Tietokantojen perusteet, k 2006 relaatioalgebra. Harri Laine 1

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

2. Käsiteanalyysi ja relaatiomalli

Tietokantasuunnittelun pääperiaatteena on tiedon toiston välttäminen. Tiedon toistumiseen liittyy monenlaisia ongelmia

Tietokannat. CREATE TABLE table(col1,col2,... ); Luo uuden taulun. CREATE TABLE opiskelijat(opnumero,etunimi,sukunimi);

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

CSE-A1200 Tietokannat

HAAGA-HELIA TIKO-05 1 (19) ICT23a Tietokannan suunnittelu ja toteutus O.Virkki

Relaation tyhjyyden testaaminen

HELIA 1 (11) Outi Virkki Tiedonhallinta

CS-A1150 Tietokannat CSE-A1150 Tietokannat / 29

Koostefunktiot. Viisi standardifunktiota: Esim. montako henkilöä on henkilo-taulussa:

Opettajana Mika Sorsa, HAMK:n ammatillisen opettajakoulutuksen opetusharjoittelija

Makrojen mystinen maailma lyhyt oppimäärä

Helsingin yliopisto, TKTL Tietokantojen perusteet, k 2004 Tietokannan suunnittelusta. Harri Laine 1

Tietokanta projektin alussa: create table kurssin_tila ( NOT NULL VARCHAR2(60) create table kurssin_tyyppi ( create table opintojakson_tyyppi (

Relaatiomalli ja -tietokanta

CSE-A1200 Tietokannat

TIEDONHALLINTA - SYKSY Luento 2. Pasi Ranne /8/17 Helsinki Metropolia University of Applied Sciences

Tietokannan suunnittelu

HELIA 1 (19) Outi Virkki Tietokantasuunnittelu

Tietokantakurssit / TKTL

HAAGA-HELIA heti09 1 (27) ICT05 Tiedonhallinta ja tietokannat O.Virkki Relaatiomalli

Harjoitustyö. CSE-A1200 Tietokannat! Jasse Lahdenperä! ! Henri Nurmi! !

TIETOKANNAN NORMALISOINTI JA NORMAALIMUODOT

Helsingin yliopisto/tktl Tietokantojen perusteet, s 2007 SQL:n perusteet. Harri Laine 1. SQL tietokantakieli. SQL tietokantakieli

HELIA SQL-harjoituksia 1(1) atk72d Versiopvm:

Esimerkki. pankkien talletus- ja lainatietokanta: Yhdiste, leikkaus, erotus ym. Leikkaus (intersect) Yhdiste (Union) Erotus (except/minus) Leikkaus

Haaga-Helia / TIKO-05 1 (12) Tietokannan suunnittelu ja Toteutus Outi Virkki

TIETOKANTOJEN PERUSTEET MARKKU SUNI

HELIA 1 (11) Outi Virkki Tiedonhallinta

Yhdiste, leikkaus, erotus ym.

HELIA 1 (14) Outi Virkki Tiedonhallinta

SQL:N PERUSTEET MARKKU SUNI

Kuva 7.2 vastaustaulu harjoitukseen 7.2

Samanaikaisuuden hallinta. Optiot transaktionaalisissa työnkuluissa

HELIA 1 (15) Outi Virkki Tiedonhallinta

Tietokantojen perusteet k2004helsingin yliopisto/tktl Tietokantojen perusteet, s 2005 SQL-perusteet. Harri Laine 1. SQL tietokantakieli

Opintopiiritehtävä 3: Verkkohuutokauppa

Nimi: Henkilötunnus: {id} {+id}

Opiskeluoikeuksien maaran tiedonkeruu

HELIA 1 (21) Outi Virkki Tietokantasuunnittelu

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

Relaatioista TIETOJENKÄSITTELYTIETEIDEN LAITOS, JUHA IISAKKA 11-14

Helsingin yliopisto/tktl DO Tietokantojen perusteet, s 2000 Relaatiomallin peruskäsitteet Harri Laine 1. Relaatiotietokannat DONOTP

CS-A1150 Tietokannat CS-A1150 Tietokannat / 39

Lisätään avainarvo 6, joka mahtuu lehtitasolle:

NORMALISOINTI TIETOJEN MALLINNUS JOUNI HUOTARI & ARI HOVI

Myyntitilaus -tiedoston kuvaus

HELIA 1 (17) Outi Virkki Tiedonhallinta

määritellä ja muokata tietokantaa ja sen käyttöoikeuksia virittää tietokannan talletusrakenteita hakea tietoa tietokannasta

Kyselyt: Lähtökohtana joukko lukuja Laskukaava kertoo miten luvuista lasketaan tulos soveltamalla laskentaoperaatioita

Muita tietokantaobjekteja. Näkymät, synonyymit, indeksointi, valtuudet ja systeemihakemisto

Näkymät ja tiedon suojaus

MUITA TIETOKANTAOBJEKTEJA NÄKYMÄT, SYNONYYMIT, INDEKSOINTI, VALTUUDET JA SYSTEEMIHAKEMISTO

Helsingin yliopisto/tktl Kyselykielet, s 2006 Optimointi Harri Laine 1. Kyselyn optimointi. Kyselyn optimointi

D B. Tietokannan hallinta - kurssin tavoite. Kurssilla opitaan periaatteet. Edellytyksenä osallistumiselle on Tietokantojen perusteiden hallinta

Transkriptio:

Helsingin yliopisto Tietojenkäsittelytieteen laitos 26.2.2014 (H.Laine) Tietokantojen perusteet Liitteenä: Tiivistelmä SQL-syntaksista Kirjoita jokaiseen erilliseen vastausarkkiin kurssin nimi, tenttipäivä, oma nimesi selvästi, opiskelijanumerosi, ja nimikirjoituksesi. Kaikki vastaukset voi kirjoittaa samalle arkille. Teatterin lipunvarausjärjestelmässä on seuraavat taulut: Näytelmä(NäytelmäID, Nimi, Kuvaus) [8 riviä] Näytös(NäytösID, NäytösPvm, Alkamisaika, NäytelmäID Näytelmä, SaliTunnus Sali) [280 riviä] Sali (SaliTunnus, Kuvaus) [2 riviä] Hinnasto(NäytösID Näytös, Hintaryhmä,Hinta) [800 riviä] Paikka(PaikkaID, SaliTunnus Sali,Rivi,PaikkaNro,Hintaryhmä) [360 riviä] Varaustilanne(NäytösID Näytös, PaikkaID Paikka,OnkoVapaa) [56800 riviä] Lippu((NäytösID,PaikkaID) Varaustilanne, VarausPvm, VaraajanNimi, VaraajanEmail, LippuNro) [23400 riviä] IsoinLippuNro(Isonumero) [1 rivi] Taulussa Näytelmä on tietoja esitettävistä näytelmistä. Taulu Näytös määrittelee esitettävät näytökset noin puolen vuoden ajalle. Taulussa Sali on nimetty teatterin salit. Lippuja on tarjolla eri hintaryhmissä. Taulussa Hinnasto määritellään näytösten lippuhinnat. Taulussa Paikka esitellään teatterin istumapaikat ja luokitellaan ne hintaryhmiin. Taulussa Varaustilanne kuvataan näytösten paikkojen varaustilanne. Sarake OnkoVapaa ilmoittaa onko paikka vapaa (arvo Y) vai varattu (arvo N). Taulu Lippu sisältää tiedot kirjoitetuista lipuista. Taulu IsoinLippuNro sisältää suurimman käytössä olevan lippunumeron. Liput numeroidaan juoksevasti. 1. Anna kuhunkin seuraavista kohdista myös lyhyt lauseen mittainen perustelu. a) Kumpi on rivimäärältään suurempi NäytösID (Lippu) vai NäytösID (Näytös)? NäytösID (Näytös). Kaikkiin näytöksiin ei ole välttämättä myyty lippuja. Arvostelusta: Oikein 2p, väärinpäin 0p. b) Kumpi on rivimäärältään suurempi NäytösID (Lippu) vai NäytösID,VarausPvm (Lippu). Näytökseen voi olla varattu lippuja useana päivänä. Arvostelusta: Oikein 2p, väärinpäin 0p. c) Montako riviä sisältyy liitostulokseen Lippu Lippu.NäytösID=Näytös.NäytösID Näytös 23400, Jokaiselle lipulle löytyy näytös. Arvostelusta: Oikein 2p, muut 0p. d) Mitä muita avaimia taululla Näytös on kuin pääavaimeksi merkitty NäytösID? NäytösPvm,Alkamisaika,SaliTunnus yhdistelmä Arvostelusta: Oikein 2p, joistakin muista yhdistelmistä + sopivista oletuksista 1-2p) e) Mitä muutoksia tauluihin pitää tehdä, jos EXIT-näytelmän näytös 25.5.2014 peruutetaan? (10p) poistetaan Lippu taulusta ko. näytökseen myydyt liput (näiden suhteen toki pitää tehdä jotain muutakin ennen poistoa) poistetaan varaustilanne taulusta ko. näytökseen liittyvät paikkamääritykset. poistetaan hinnastosta ko. näytöksen hintatiedot poistetaan näytös taulusta ko. näytös.

Arvostelusta: Ei mitään 0p, vain näytöstaulu 1p, muutetaan alkamisaika yms. 1-2p riiippuen perusteluista. 2. Laadi yllä kuvattuun tietokantaan perustuen SQL kyselyt seuraaviin tilanteisiin: a) Listaa näytelmän nimi, esityspäivä ja alkamisaika 14.4.2014 alkavalla viikolla esitettävistä näytöksistä esityspäivän ja alkamisajan mukaan järjestettynä. select nimi, näytöspvm, alkamisaika from näytös, näytelmä where näytös.näytelmäid=näytelmä.näytelmäid and näytöspvm between date 2014-04-14 and date 2014-04-14 + interval 7 day order by näytöspvm, alkamisaika Arvostelusta: Liitos puuttuu -2p, Päiväyksen yläraja puuttuu -1p Päiväysten virheellisistä esitystavoista ei ole sakotettu. Päiväysrajoitteen voi esittää usealla tavalla. b) Selvitä montako paikkaa kussakin hintaryhmässä on vapaana 19.4.2014 esitettävään EXIT - näytelmään. select hintaryhmä, count(*) vapaita from varaustilanne, paikka, näytös, näytelmä where varaustilanne.paikkaid=paikka.paikkaid and onkovapaana= Y and varaustilanne.näytösid=näytös. näytösid and näytös.näytelmäid=näytelmä.näytelmäid and näytös.näytöspvm = date 2014-04-19 group by hintaryhmä Arvostelusta: Jos tehtävässä käytetään hinnasto-taulua hintaryhmien selvitykseen paikka-taulun asemasta jäävät varaustilanne rivit irti hintaryhmistä ja käytännössä jokaiselle hintaryhmälle saadaan sama määrä. group by puuttuu -2p. Tietoja puuttuu tai vääriä tauluja -(1..2)p, group by mukana mutta ryhmittelyperusta puuttuu tulostietoluettelosta -1p c) Selvitä mikä on ollut EXIT -näytelmän tammikuun 2014 esitysten täyttöaste. Lyhyesti ehtolauseella: select näytöspvm, alkamisaika, sum(case onkovapaana when N then 1 else 0) / sum(1) as tayttoaste from varaustilanne v, näytös ns, näytelmä nm where v.näytösid=ns.näytösid and nm.näytelmäid=ns.näytelmäid and nm.nimi= EXIT and ns.näytöspvm between date 2014-01-01 and date 2014-01-31 group by näytöspvm,alkamisaika

Arvoja Y ja N ei voi summata eikä niistä voi laskea keskiarvoa (-1p). Tässä hyväksyttiin myös ratkaisu, jossa annettiin vain kokonaistäyttöaste eikä eritelty sitä näytöksittäin. Tauluja puuttui -1p, liitosehtoja puuttui -1p, vääriä tauluja -1p. Kyselyn voi esittää hieman pidemmin ulkoliitoksella count(lippunro) laskee muut kuin null-arvot: select näytöspvm, alkamisaika, count(lippunro)/count(*) as tayttoaste from näytös. näytelmä, varaustilanne left outer join lippu on varaustilanne.näytösid=lippu.näytösid and varaustilanne.paikkaid=lippu.paikkaid where varaustilanne.näytösid=näytös.näytösid and group by näytöspvm,alkamisaika tai vielä pidemmin erillisillä alikyselyillä: select yht.näytöspvm, yht.alkamisaika, myyty/kaikki from (select näytöspvm, alkamisaika, count(*) as myyty from varaustilanne, näytös, näytelmä where onkovapaana= N and varaustilanne.näytösid=näytös.näytösid and group by näytöspvm, alkamisaika ) as myydyt (select näytöspvm, alkamisaika count(*) as kaikki from varaustilanne, näytös, näytelmä where varaustilanne.näytösid=näytös.näytösid and group by näytöspvm, alkamisaika ) yht where yht.alkamisaika=myydyt.alkamisaika and yht.näytöspvm=myydyt.näytöspvm. Tätä tapaa yritettiin eniten. Joissakin sql-murteissa sallitaan yhden arvon palauttava alikysely myös tulostietolistassa. Seuraava voisi siis toimia näissä sql-murteissa:

select näytöspvm, alkamisaika, ((select count(*) from varaustilanne where varaustilanne.näytösid=näytös.näytösid and onkovapaana= N ) / (select count(*) from varaustilanne where varaustilanne.näytösid=näytös.näytösid)) as tayttoaste from näytös, näytelmä where d) Asiakas Taavi Tossavainen (taavi.tossavainen@meili.moc) varaa tänään riviltä 7 paikan 9 (paikka on vapaa) EXIT-näytökseen 19.4.2014 klo 19. Mitä muutoksia pitää tehdä tietokantaan varauksen kirjaamiseksi. Esitä muutokset myös SQL:llä. (16p) insert into lippu select näytös.näytösid, paikka.paikkaid, current_date, Taavi Tossavainen taavi.tossavainen@meili.moc, isonumero+1) from näytös, näytelmä, paikka, isoinlippunro, where paikka.rivi=7 and paikka.paikkanro=9 and paikka.salitunnus=näytös.salitunnus and näytös.näytöspvm = 2014-04-19 and alkamisaika=19; Update varaustilanne set onkovapaana= N where paikkaid in (select paikkaid from paikka,näytelmä,näytös where paikka.rivi=7 and paikka.paikkanro=9 and paikka.salitunnus=näytös.salitunnus and näytös.näytöspvm = 2014-04-19 and alkamisaika=19); update isoinlippunro set isonumero=isonumero+1;

3. Selitä lyhyesti (enintään ½ sivua) käsite tietokantatransaktio (database transaction). (4p) Täysiin pisteisiin riittäisi esim.: Tietokantatransaktio muodostuu yhtenä atomisena kokonaisuutena suoritettavasta joukosta tietokannan ylläpito-operaatioita. Kokonaisuutena suorittaminen tarkoittaa sitä, että tehdään kaikki operaatioiden määrittelemät muutokset tai ei tehdä mitään. Transaktion suoritus tulisi tapahtua eristyneesti siten, etteivät muut samanaikaiset operaatiot pääse sotkemaan operaatioiden toimintaa eivätkä operaatiot itse sotke muiden operaatioiden toimintaa, esimerkiksi muuttamalla operaatioissa tarvittavia tietoja tai hävittämällä kesken olevan transaktion tekemiä muutoksia. Transaktiot näkevät vain valmiiden transaktioiden tuottaman tietokannan tilan. Transaktion tulee pitää voimassa tietokantaan liittyvät eheysehdot, kuten viite-eheyden. 4. Seuraava käsitekaavio kuvaa yksinkertaisen kurssihallintasysteemin tietosisältöä. Määrittele relaatiotietokannan taulut tietosisällön talletukseen. Esitä taulut tehtäväpaperin alussa käytetyllä merkintätavalla. Ilmaise pääavaimet ja viiteavaimet. (7p) Aihepiiri(aihepiirinnimi,selitys) Opettaja(OpeTunnus, Nimi, Email) Kurssi(Kurssitunnus, Nimi, Kuvaus, Alkamispvm, Päättymispvm) Oppikirja(kirjatunnus,Nimi,Kustantaja, Painovuosi) Opetustehtävä(kurssitunnus kurssi, tehtävänro, tehtäväntyyppi, selitys) Opetustehtävänhoito(Opetunnus opettaja, (kurssitunnus, tehtävänro) Opetustehtävä, tuntimäärä) Kurssinkirja(kurssitunnus kurssi, kirjatunnus oppikirja) Kurssinaihe(kurssitunnus kurssi, aihepiirinimi aihepiiri) Kirjantekijä(kirjatunnus oppikirja, tekijä)

Arvostelusta: monen suhde moneen muunnos väärin: -2p moniarvoinen attribuutti väärin: -1p yhden suhde moneen yhteyksien toteutuksia puuttuu 1-2p viiteavaimet eivät ole yhteensopivat kohdetaulun avaimen kanssa -1p viiteavainten esitystekniikka virheellinen -1p tunnistavien yhteyksien käsittelyssä ongelmia: -1p muita kuin viiteavaimiin liittyviä attribuutteja sijoitettu väärin -1p 5. Tarkastellaan yrityksen tilaukset sisältävää relaatiota tilaus (henkilönumero, henkilönnimi, henkilönosoite, tilausnumero, toimitusosoite, tilausrivinnumero, tuotetunnus, tilattumäärä). a) Mitä tarkoittaa riippuvuushenkilönumero -> tuotetunnus henkilö voi tilata vain yhtä tuotetta Arvostelusta: henkilönumero määrää tuotetunnuksen, tai tuotetunnus riippuu henkilönumerosta eivät selitä (1p) b) Millaisia olisivat yrityksen tilaukset, jostuotetunnus olisi tämän taulun avain? Kullakin tuotteella voisi olla vain yksi tilaus siis yksilöllisiä tuotteita Arvostelusta: tilauksessa on vain yksi tuote (1p) pitää edellisen seurauksena paikkansa. c) Miten esität riippuvuutena säännön: tuote esiintyy vain kertaalleen samassa tilauksessa. tuotetunnus, tilausnumero tilausrivinnumero Arvostelusta: tuotetunnus tilattumäärä: tuotetta tilataan aina sama määrä, tilauksesta riippumatta (0p) tilausnumero tuotetunnus: kussakin tilauksessa on tilattu vain yhtä tuotetta(0p) tilausnumero, tilausrivinnumero tuotetunnus: Kullakin tilausrivillä tilataan vain yhtä tuotetta (tästä sai 1 pisteen) d) Relaatiossa ovat voimassa riippuvuudet henkilönumero -> henkilönnimi, henkilönumero -> henkilönosoite tilausnumero -> henkilönumero, tilausnumero -> toimitusosoite tilausnumero, tilausrivinnumero -> tuotetunnus tilausnumero, tilausrivinnumero -> tilattumäärä Minkä sarake tai sarakeyhdistelmä on taulun avain? Onko taulu Boyce-Codd normaalimuodossa? (8p) avain: tilausnumero, tilausrivinnumero ei ole: 4 ensimmäistä riippuvuutta rikkoo BCNF-säännön: jokaisessa riippuvuudessa määräjä sisältää avaimen. Arvostelusta: Kumpikin osa 1 piste.