Rättningsmall tenta 090608

9 uppgifter, G=14p, VG=21, max=27. Bästa student, en statistiker, hade 25p, grattis!


1. 

a) De tre nivåerna: Konceptuell/begreppsmässig; Logisk/implementations; fysisk 1p för alla, 1-2 rätt=0.5p.

b) ER konceptuell, Relation Logisk. 0.5p/rätt.


2. 

Fysiskt och logiskt dataoberoende. Se boken. 0.5p per rätt ord, 0.5p per rätt beskrivning.


3. 

Select lärareNamn, Tid, ElevNamn, Plan from lektioner where dag=090608 and lärareAnstNr=1. Fnuttar kring värdena spelar ingen roll. Rätt värden på villkor men felaktig struktur på select-satsen=1p.


4. 

a) Blockfaktor=blockstorlek/poststorlek, avrundat nedåt: 2048/500=>4

Antal block=antal poster/antal block, avrundat uppåt: 500/4=125 (Exakt).

Blockfaktor 0.5p, antal block 0.5p

b) Indexpostens storlek: 45+5=50 byte. (värt 0.5p)

Antal poster i indexfilen=125 (pga glest index, som primärindex är pga sorterad huvudfil) (värt 0.5p) 

blockfaktor indexfilen: 2048/50=40 (korrekt uppställt=0.5p)

Antal block i indexfilen: 125/40 avrundat uppåt: 4st (korrekt avrundning 0.5p). Vanligt fel: 500 indexposter ger -0.5. Felräkning ger ej avdrag om inte grovt.


5. 

Man bör hitta ett funktionellt beroende LärarAnstNr => LärarTel, LärarNamn, LärarMobil. Andra rimliga funktionella beroenden är ElevNamn=>ElevTel (men vissa vill inte ha det pga texten, och det spelar ingen roll). Man bör hitta LärarAnstNr, Dag, ElevNamn som kandidatnyckel, man kan ocks hitta LärarAnstNr, Dag, Tid samt ElevNamn, Dag, Tid. Om man inte anser att elevens namn är unikt tycker jag det är rimligt att anta att ElevNamn, ElevTel identifierar eleven och därmed är ElevNamn, ElevTel, Dag, Tid en kandidatnyckel, men det har ingen hittat.

Man bör bryta ut LärarAnstNr, LärarTel, LärarNamn, LärarMobil till en egen relation med LärarAnstNr kvar i ursprungliga relationen, eftersom detta beroende bryter mot 2nf. Om man ritar ut beroendet ElevNamn=>ElevTel ska man också bryta ut det.

Andra mindre rimliga beroenden är olika konstruktioner där Plan, Resultat och FortsPlan beror av eleven på olika sätt. Dessa har inte fått fel eller poängavdrag, trots att det i texten står att man vill lagra information om de olika lektionerna.

Korrekt genomförd normalisering utan motivation=2.5p. Felaktig motivation lite sämre än så. Bara "uppfyller BCNF" svag 3p Motsägelsefulla funktionella beroenden ger avdrag 0.5p. Borttappad info avdrag 0.5p


6. 

a) Rätt svar kräver en sekvens av operationer från de båda transaktionerna som visar att schemaläggningen börjar läsa ur databasen och ändringstransaktionen sticker emellan med sin ändring innan schemats eftermiddagstimmar skrivits ut. Om sekvensen visar att ändringen skedde efter utskrift av schemarad 9 och före schemarad 16 = 1p. Korrekt beskrivning utan operationer = 0.5p

b) algoritmer av typ tvåfaslåsning är korrekt: alla lås innan någon unlock. Ingen upplåsning mellan momenten. Båda transaktionerna måste skrivas ut för fulla 2p. Om bara ändringstransaktionen beskrivs =0.5p (schematransaktionen är viktigast). Bara beskrivning, utan operationer - 0-1p (om korrekt)

c) Termen korrekt 1p (tvåfaslåsning, låsningsalgoritm räcker inte. Konservativ, Strikt eller rigorös tvåfaslåsning godkänns (låser man hela tabellen blir det ingen skillnad mellan varianterna).


7. 

Det luriga är lektionerna. De bör vara en egen entitetstyp, för de har väldigt mycket information kopplad till sig. Men rimligen går det inte identifiera en lektion utan att veta läraren eller eleven, så det blir en svag entitetstyp, med antingen lärare eller elev som ägande entitetstyp. Alternativt kan man införa ett lektions-ID, men om detta görs utan motivation är det avdrag (0.5p). Lektion som vanlig entitetstyp med bara dag och tid som nyckel betyder att man inte kan undervisa parallellt och ger 0.5p avdrag.  Att lägga lektionerna som sambandstyp betyder att man bara kan representera en lektion per par av elev/lärare och ger 0.5p avdrag (detta är egentligen lite, men de flesta gör följdfel i upg 8 pga detta, och det drar av resten). Uppkörningen blir rimligen också en svag entitetstyp med dag som partiell nyckel. Även här kan man införa ID, motivation krävs. Kan man bara lagra en uppkörning avdrag 0.5p Väljer man att lagra antal uppkörningar här har man dubbellagring av information, 0.5p avdrag. I vissa lösningar är det inte tydligt vad det är som lagras, då har jag inte dragit.

Har man infört andra ID utan motivation 0.5p/st. Attribut på entitetstyper som representerar andra entitetstyper, som man också har samband till ger avdrag 1p


8.

Korrekt konverterat enligt kokboken=3p. Avdrag för felaktigt konverterade sambandsrelationer 0.5p/st dock max 1p per typ av fel. Om man ritar främmande nycklar "åt fel håll" avdrag 0.5p om konsekvent.


9 

SQl-kommandona ser ju lite olika ut beroende på vilka tabeller man har, men givet en bra lösning på databasdesignen (som innebär att man inte lagrar antalet uppkörnigar explicit i databasen blir lösningarna som följer:

a) Select lärarnamn from lärare, elev, lektion where elevnamn=Elinor.. and lektion.elev=elevpnr and lektion.lärarnr=läraranstnr

eller på join-form:

select lärarnamn from (lärare join lektion on läraranstnr=lektion.lärare) join elev on lektion.elev=elev.pnr where elev.namn=Elinor...

Att kunna grundformen på en selectsats=0.5p. korrekt joinvillkor=0.5p (max1p)

b)  Givet att man bara lagrar misslyckade uppkörningsförsök och inte antalet explicit, användande group by och having: select elev, count(*) from uppkörning group by pnr having count(*)>2;

Eller med hjälp av vy: create view antaluppkörningar as select pnr, count(*) as antal from uppkörning group by pnr; 

följt av select * from antaluppkörningar where antal>2;

Om man har en design där man lagrat antal explicit kan man få max 1p på denna. Annars max 2: 05. per st för count först, group by, having och count igen.

c)Select lärare.namn from lärare where anstnr not in (Select lärare from lektion where tid=10 and dag=090806); Max 1p.