Örebro universitet
Institutionen för naturvetenskap och teknik
Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se)








Tentamen i

Databasteknik

onsdag 19 mars 2025

Gäller som tentamen för:
DT105G Databasteknik, provkod A001


Hjälpmedel: Ordbok för översättning.
Poängkrav: Maximal poäng är 40. För godkänt betyg krävs 24 poäng, varav minst sex poäng på uppgift 1.
Resultat: Meddelas senast 15 arbetsdagar efter tentamensdatum.
Återlämning av tentor: Elektroniskt via webbportalen Studenttjänster.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070 - 73 47 013.






LYCKA TILL!

Scenario till uppgifterna

Pensionärernas riksorganisation, PRO, genomför varje år en prisundersökning för att se vad maten kostar i olika butiker i Sverige. En viss dag på året besöker pensionärerna ett stort antal olika butiker och undersöker vad ett antal olika varor kostar. Undersökningens syfte, skriver PRO, är att pressa priserna, men också att skapa en prismedvetenhet och att utse Sveriges mest pensionärsvänliga butiker.

Tyvärr har det hänt att butiker fuskar. För att framstå som billigare sänker de priserna just den dagen som undersökningen görs, på just de varor som ingår i undersökningen, och när undersökningen är klar höjer de priserna igen.

Därför ska vi prova ett nytt upplägg! Undersökningen ska pågå under hela året, och varje dag ska tusentals pensionärer gå till landets butiker och ta reda på priserna. Och naturligtvis behöver de en databas för att spara de data som de samlar in.

Det som ska lagra i databasen är:

Här är ett ER-diagram för databasen i scenariot:

ER-diagram

Uppgift 1 (7 p)

Implementera den beskrivna databasen i relationsmodellen, dvs översätt ER-diagrammet till tabeller.

Du behöver inte skriva create table-kommandon i SQL, men du ska ange vilka relationer som finns och vilka attribut varje relation innehåller. Ange också alla kandidatnycklar, vilken av dessa som är primärnyckel, samt vilka referensattribut som finns och vad de refererar till.

Implementationen ska vara bra.

Uppgift 2 (13 p)

Formulera följande frågor i SQL. Definiera gärna vyer eller CTE:er om det underlättar, men skapa inte nya tabeller.

a) (1p) Vad heter de butiker som finns i Örebro?

b) (2p) I hur många städer finns det ICA-butiker? Dvs, vad är antalet städer där det finns minst en butik med ett namn som innehåller ICA, till exempel Norra ICA Närköp?

c) (2p) Det finns bara en pensionär som heter Agda Svensson och är född 1950. Vilka telefonnummer har hon?

d) (2p) 12 februari 2025 besökte Agda Svensson, från uppgiften ovan, några olika butiker som ligger i Örebro. Vad heter de butikerna?

e) (3p) En av butikerna som Agda Svensson besökte 12 februari 2025 heter Coop Forum och ligger i Örebro. Hur många varor undersökte hon priset på vid det besöket?

f) (3p) Vilken pensionär har gjort flest besök? Vi vill veta namn och nummer på den pensionären.

Uppgift 3 (5 p)

Alla tabeller i databasen växer och blir stora. De fyra första sökningarna i deluppgiften ovan, alltså deluppgift 2a, 2b, 2c och 2d, körs ofta, men kanske med andra konstanter än de i uppgiften. Från början finns det inga index i databasen, inte ens på nycklar.

Ange för var och en av sökningarna hur man kan få dem att gå snabbare:

a) Sökningen i deluppgift 2a

b) Sökningen i deluppgift 2b

c) Sökningen i deluppgift 2c

d) Sökningen i deluppgift 2d

Tänk på att det kan finnas sökningar där det inte hjälper att skapa index. Vilka sökningar är det i så fall, och kan vi göra något annat för att få de frågorna att gå snabbare?

Uppgift 4 (4 p)

Vi använder en databashanterare med auto-commit, vilket betyder att varje SQL-kommando räknas som en egen transaktion, så länge man inte uttryckligen startar en transaktion med kommandot "start transaction".

Vi startar två olika klientprogram som loggar in på samma databas, och ger följande SQL-kommandon, i den angivna ordningen, i de två klienterna.

Vad blir resultatet av var och en av de sex select-frågorna?

Steg Klient 1 Klient 2
1 create table Tröjor
(Nummer integer not null primary key,
Storlek varchar(3));
 
2 insert into Tröjor values (1, 'M');  
3   insert into Tröjor values (2, 'XL');
4   select * from Tröjor; -- Fråga 1
5 start transaction;  
6 insert into Tröjor values (3, 'XS');  
7   start transaction;
8 insert into Tröjor values (4, 'S');  
9 select * from Tröjor; -- Fråga 2  
10   select * from Tröjor; -- Fråga 3
11   insert into Tröjor values (5, 'XXL');
12 commit;  
13   rollback;
14 select * from Tröjor; -- Fråga 4  
15   start transaction;
16   select * from Tröjor; -- Fråga 5
17   insert into Tröjor values (6, 'L');
18   update Tröjor set Storlek = 'XXL'
where Nummer = 1;
19   select * from Tröjor; -- Fråga 6
20   commit;

Uppgift 5 (2 p)

Precis efter steg 18 (update-kommandot) går strömmen, och databasservern stängs av. När strömmen kommer tillbaka och servern har startat igen, loggar vi in och ger följande kommando. Vad blir resultatet?
select * from Tröjor;

Uppgift 6 (3 p)

Här är ett EER-diagram:

EER-diagram

a) Vad är skillnaden mellan en snapshot-databas och en historisk databas?

b) Beskriver EER-diagrammet en snapshot-databas eller en historisk databas? Förklara!

c) Det finns en detalj i diagrammet som är konstig, givet vad vi vet om grönsaker. Vilken? Förklara också varför den är konstig!

Uppgift 7 (6 p)

Förklara:

a) Vad är skillnaden mellan en databashanterare och en databasadministratör?

b) Vad är skillnaden mellan en främmande nyckel och en relation?

c) Vad är skillnaden mellan ett schema och en transaktion?