För att ge övning för läsaren (och inte alls för att jag är lat) har jag låtit bli att kontrollera och provköra dessa svar. Maila de fel ni hittar till mig.
Enligt ER-diagrammet kan en bok bara ha en enda författare. I verkligheten har många böcker två eller flera författare.
b)
Relationer, med primärnycklarna understrukna:
Böcker(Nr, ISBN, Titel, År, Författare)
Författare(Nr, Namn, Land)
Exemplar(Nr, Bok, Exemplarnummer, Skick, UtlånadTill, Återdatum)
Låntagare(Nr, Namn, Adress, Bötessumma)
HarLånat(Nr, Exemplar, Låntagare)
I Böcker är ISBN en alternativnyckel. I Exemplar är Bok och Exemplarnummer en alternativnyckel. I HarLånat är Exemplar och Låntagare en alternativnyckel.
Referensattribut:
Böcker.Författare till Författare.Nr
Exemplar.Bok till Böcker.Nr
Exemplar.UtlånadTill till Låntagare.Nr
HarLånat.Exemplar till Exemplar.Nr
HarLånat.Låntagare.Nr till Låntagare.Nr
a) Vilka kandidatnycklar finns i tabellen?
ISBN och Exemplarnummer bildar en sammansatt kandidatnyckel. Om titlar är unika bildar även Titel och Exemplarnummer en sammansatt kandidatnyckel.
b) Vilka fullständiga funktionella beroende finns i tabellen?
Om boktitlar och låntagarnamn antas vara unika, fås fler ffb.
c) Vilken är den högsta normalform som tabellen uppfyller, av 1NF, 2NF, 3NF och BCNF? (Ledtråd: Det är inte BCNF.) Motivera svaret!
Första normalformen (1NF).
Tabellen har atomära attribut ("högst ett värde i varje ruta"), vilket är kravet för 1NF. Men eftersom Titel är ffb av enbart ISBN så är inte alla icke-nyckelattribut ffb av hela primärnyckeln, vilket är ett krav för 2NF. 3NF och BCNF förutsätter 2NF, och alltså uppfylls inte heller de.
d) Beskriv ett problem som finns i den här tabellen, men som man skulle slippa om den hade uppfyllt BCNF.
Några förslag:
select Land from Forfattare where Namn = 'Thomas Padron-McCarthy';
b) Jag heter Thomas Padron-McCarthy och har skrivit en bok. Vad har den boken för titel?
select Bocker.Titel from Forfattare, Bocker where Bocker.Forfattare = Forfattare.Nr and Forfattare.Namn = 'Thomas Padron-McCarthy';
c) Hur många exemplar av boken med titeln Databasteknik finns just nu inne, alltså är inte utlånade? Vi vill veta antalet.
select count(*) from Bocker, Exemplar where Bocker.Nr = Exemplar.Bok and Exemplar.UtlanadTill is null and Bocker.Titel = 'Databasteknik';
d) Finns det några böcker som är med i databasen, men där vi inte har några exemplar? Vi vill veta ISBN-nummer och titel på dessa böcker.
select ISBN, Titel from Bocker where Nr not in (select Bok from Exemplar);Alternativ:
select ISBN, Titel from Bocker left outer join Exemplar on Bocker.Nr = Exemplar.Bok where Exemplar.Nr is null;
e) Vad är ISBN-numret och titeln på den bok som biblioteket har i flest antal exemplar?
create view AntalExemplar as select Bok, count(*) as Antal from Exemplar group by Bok; select ISBN, Titel from Bocker where Nr in (select Bok from AntalExemplar where Antal in (select max(Antal) from AntalExemplar));
Exemplar.UtlanadTill används för is null, och en del databashanterare indexerar inte null-värden.
b) (1p) Vad är det för skillnad på ett index och en primärnyckel?
Stor. Primärnyckel är ett logiskt begrepp som säger att en kolumn (eller en kombination av kolumner) har unika värden. Ett index är en fysisk datastruktur som används för sökning i databasen för att snabbt hitta rader i en tabell baserat på värdet i en kolumn (eller i en kombination av kolumner).
Ett index kan vara unikt, dvs ange att dess kolumn eller kolumner måste ha unika värden, men måste inte vara det.
c) (1p) Hur kan index göra att samma SQL-frågor går snabbare att köra? Om SQL-koden inte har ändrars, borde det väl ta precis lika lång tid att köra frågan som innan man skapade indexen?
SQL-frågan är inte ett steg-för-steg-program som kan köras direkt, som till exempel ett C-program, utan databashanteraren måste först översätta SQL-frågan till ett steg-för-steg-program, en så kallad exekveringsplan. Databashanteraren gör den översättningen automatiskt. En SQL-fråga brukar kunna översättas till många olika exekveringsplaner, ofta med väldigt olika prestanda (dvs snabbhet). Databashanteraren har en så kallad frågeoptimerare som automatiskt väljer en exekveringsplan som är snabb. Oftast går det mycket snabbare att göra sökningarna i databasen om man går via de index som finns, och då kommer databashanteraren automatiskt att välja en exekveringsplan som använder indexen. När det nu finns nya index som kan snabba upp sökningarna, så kommer databashanteraren alltså att använda dem.
Några databashanterare som jag själv skulle kunna rekommendera till den här tillämpningen:
Kommentar: Jag har inte dragit poäng för dem som ritat underentitetstyperna överst och överentitetstypen underst. Det gör det visserligen svårt och förvirrande för läsaren, men själva symbolerna är kanske inte fel.
create trigger Aterlamning after update on Exemplar referencing old table as o new table as n for each row begin atomic declare Exemplaret integer; declare GamlaLantagaren integer; declare NyaLantagaren integer; select Exemplarnummer into Exemplaret from o; select UtlanadTill into GamlaLantagaren from o; select UtlanadTill into NyaLantagaren from n; if (GamlaLantagaren is not null and NyaLantagaren is null) then insert into HarLanat (Exemplar, Lantagare) values (Exemplaret, GamlaLantagaren); end if; end