Det som ska lagras i databasen är följande:
ER- och EER-diagram kan ritas på flera olika sätt. Om du använder en annan notation än kursboken, måste du förklara den notation som du använder.
Svar:
Några kommentarer om lösningen ovan:
Svar:
Tabeller (kallas också relationer):
Kandidatnycklar är understrukna. I de tabeller där det finns flera kandidatnycklar, är den första primärnyckel.
Referensattribut (kallas också främmande nycklar):
Nedan visas create table-kommandon och exempeldata. Det krävs inte som svar, men är med för att underlätta provkörningar.
CREATE TABLE Länder (Nummer INTEGER NOT NULL PRIMARY KEY, Namn NVARCHAR(10) NOT NULL UNIQUE); INSERT INTO Länder VALUES (1, 'Sverige'); INSERT INTO Länder VALUES (2, 'USA'); INSERT INTO Länder VALUES (3, 'Israel'); CREATE TABLE Filmer (Nummer INTEGER NOT NULL PRIMARY KEY, År INTEGER, Land INTEGER REFERENCES Länder (Nummer)); INSERT INTO Filmer VALUES (1, 1991, 2); INSERT INTO Filmer VALUES (2, 1992, 2); INSERT INTO Filmer VALUES (3, 1957, 1); CREATE TABLE Titlar (Film INTEGER REFERENCES Filmer (Nummer), Titel NVARCHAR(30) NOT NULL, PRIMARY KEY (Film, Titel)); INSERT INTO Titlar VALUES (1, 'Terminator 2: Judgment Day'); INSERT INTO Titlar VALUES (2, 'Reservoir Dogs'); INSERT INTO Titlar VALUES (2, 'De hänsynslösa'); INSERT INTO Titlar VALUES (2, 'Perros de reserva'); INSERT INTO Titlar VALUES (3, 'Det sjunde inseglet'); INSERT INTO Titlar VALUES (3, 'The Seventh Seal'); CREATE TABLE Skådespelare (Nummer INTEGER NOT NULL PRIMARY KEY, Namn NVARCHAR(30) NOT NULL, Födelseår INTEGER, Land INTEGER REFERENCES Länder (Nummer)); INSERT INTO Skådespelare VALUES (1, 'Arnold Schwarzenegger', 1947, 2); INSERT INTO Skådespelare VALUES (2, 'Max von Sydow', 1929, 1); CREATE TABLE Spelat (Skådespelare INTEGER REFERENCES Skådespelare (Nummer), Film INTEGER REFERENCES Filmer (Nummer), Rollfigur NVARCHAR(30) NOT NULL, PRIMARY KEY (Skådespelare, Film)); INSERT INTO Spelat VALUES (1, 1, 'The Terminator'); INSERT INTO Spelat VALUES (2, 3, 'Antonius Block'); CREATE TABLE Användare (Nummer INTEGER NOT NULL PRIMARY KEY, Namn NVARCHAR(10) NOT NULL UNIQUE, Lösenord NVARCHAR(10) NOT NULL); INSERT INTO Användare VALUES (1, 'padrone', 'banan'); INSERT INTO Användare VALUES (2, 'joe', 'banan'); INSERT INTO Användare VALUES (3, 'donald', 'banan'); CREATE TABLE Recensioner (Nummer INTEGER NOT NULL PRIMARY KEY, Användare INTEGER NOT NULL REFERENCES Användare (Nummer), Film INTEGER NOT NULL REFERENCES Filmer (Nummer), UNIQUE (Användare, Film), Betyg INTEGER NOT NULL, Text NVARCHAR(10)); INSERT INTO Recensioner VALUES (1, 1, 1, 10, 'Bäst!'); INSERT INTO Recensioner VALUES (2, 1, 2, 9, 'Ok!'); INSERT INTO Recensioner VALUES (3, 1, 3, 8, 'Bra!'); INSERT INTO Recensioner VALUES (4, 2, 1, 10, NULL); INSERT INTO Recensioner VALUES (5, 3, 1, 2, NULL);
a) (1p) Från vilket land kommer skådespelaren Arnold Schwarzenegger?
Svar (några alternativ):
Om man inte har en tabell med länder, utan det står bara ett namn på ett land direkt i skådespelartabellen, blir frågan enklare:SELECT Länder.Namn FROM Skådespelare, Länder WHERE Skådespelare.Land = Länder.Nummer AND Skådespelare.Namn = 'Arnold Schwarzenegger'; SELECT Länder.Namn FROM Skådespelare JOIN Länder ON Skådespelare.Land = Länder.Nummer AND Skådespelare.Namn = 'Arnold Schwarzenegger'; SELECT Namn FROM Länder WHERE Nummer IN (SELECT Land FROM Skådespelare WHERE Namn = 'Arnold Schwarzenegger');
SELECT Land FROM Skådespelare WHERE Namn = 'Arnold Schwarzenegger';
b) (2p) Hur många filmer har han spelat i?
Svar (två alternativ):
SELECT COUNT(*) FROM Skådespelare, Spelat, Filmer WHERE Skådespelare.Nummer = Spelat.Skådespelare AND Spelat.Film = Filmer.Nummer AND Skådespelare.Namn = 'Arnold Schwarzenegger'; SELECT COUNT(*) FROM Skådespelare, Spelat WHERE Skådespelare.Nummer = Spelat.Skådespelare AND Skådespelare.Namn = 'Arnold Schwarzenegger';
c) (2p) Vad heter rollfiguren som Max von Sydow spelar i filmen Det sjunde inseglet?
Svar:
SELECT Spelat.Rollfigur FROM Skådespelare, Spelat, Filmer, Titlar WHERE Skådespelare.Nummer = Spelat.Skådespelare AND Spelat.Film = Filmer.Nummer AND Filmer.Nummer = Titlar.Film AND Skådespelare.Namn = 'Max von Sydow' AND Titlar.Titel = 'Det sjunde inseglet';
d) (3p) Vilket genomsnittsbetyg har filmen Terminator 2: Judgment Day? (Tips: Man kan använda vanliga matematiska operationer, som division, i SQL.)
Svar (två alternativ):
SELECT AVG(Recensioner.Betyg) FROM Recensioner, Filmer, Titlar WHERE Recensioner.Film = Filmer.Nummer AND Filmer.Nummer = Titlar.Film AND Titlar.Titel = 'Terminator 2: Judgment Day'; SELECT AVG(1.0 * Recensioner.Betyg) FROM Recensioner, Filmer, Titlar WHERE Recensioner.Film = Filmer.Nummer AND Filmer.Nummer = Titlar.Film AND Titlar.Titel = 'Terminator 2: Judgment Day'; SELECT 1.0 * SUM(Recensioner.Betyg) / COUNT(Recensioner.Betyg) FROM Recensioner, Filmer, Titlar WHERE Recensioner.Film = Filmer.Nummer AND Filmer.Nummer = Titlar.Film AND Titlar.Titel = 'Terminator 2: Judgment Day';
En kommentar: Beroende på vilken databashanterare man använder kan man behöva multiplicera med 1.0 om man vill ha med decimaler i svaret. Annars blir det heltalsdivision, och exempelvis 2/3 blir noll.
e) (3p) Från vilket land kommer flest filmer?
Svar (ett alternativ med en vy och etyt med en CTE):
CREATE VIEW AntalFilmerPerLand AS SELECT Länder.Namn AS Land, COUNT(*) AS Antal FROM Filmer, Länder WHERE Filmer.Land = Länder.Nummer GROUP BY Länder.Namn; SELECT Land FROM AntalFilmerPerLand WHERE Antal IN (SELECT MAX(Antal) FROM AntalFilmerPerLand); WITH AntalFilmerPerLand AS (SELECT Länder.Namn AS Land, COUNT(*) AS Antal FROM Filmer, Länder WHERE Filmer.Land = Länder.Nummer GROUP BY Länder.Namn) SELECT Land FROM AntalFilmerPerLand WHERE Antal IN (SELECT MAX(Antal) FROM AntalFilmerPerLand);
Vilka index bör man skapa för att denna sökning ska bli snabbare?
Svar:
Svar:
Om atomicitet (A) saknas: Man kanske vill lägga in en ny film i databasen. Då måste man lägga in rader inte bara i tabellen Filmer utan också i tabellerna Titlar, Skådespelare (om de inte redan fanns där) och Spelat. Man lägger in den i tabellen Filmer och i tabellen Titlar men innan man hinner lägga till rader i de andra tabellerna för att ange vilka skådespelare som var med, avbryts transaktionen av någon anledning. Då kommer det att se ut som att filmen inte hade några skådespelare alls.
Om hållbarhet (D, "durability") saknas: Om användarna lägger in recensioner och information om filmer i databasen, och får bekräftelser på att dessa data är inlagda, vill de förstås inte att deras data ska försvinna igen. Att data försvinner ur filmdatabasen BDMI är kanske inte lika illa som om de försvinner ur en bankdatabas, där en försvunnen ändring kan innebära att kundernas pengar försvinner, men om det händer för ofta tappar användarna förtroende för webbplatsen, och det kan bli svårt för BDMI att konkurrera med IMDB.
Fruktodlaren har förstås många äppelträd och många äpplen. Sambandet att äpplena växer på träden, är det ett många-till-många-samband? Förklara!
Svar:
Se teoriövning 1!
Nej, det är ett många-till-ett-samband!
"Många till många", "ett till många" och så vidare handlar inte om hur många äpplen och träd det finns, utan det handlar om hur många äpplen ett träd kan kopplas ihop med, och hur många träd ett äpple kan kopplas ihop med.
Varje träd kan kopplas ihop med många äpplen, för det kan växa många äpplen på varje träd. Alltså ska det vara många åt det hållet i sambandet.
Varje äpple kan kopplas ihop med ett enda träd, för ett äpple växer bara på ett enda träd, inte flera. Alltså ska det vara ett åt det hållet i sambandet.
Äpplen | ||||
---|---|---|---|---|
Trädnummer | Äppelnummer | |||
1 | 1, 2, 3, 4, 9 | |||
2 | 5, 7, 8, 10, 11 | |||
3 | 6, 12, 13 | |||
4 | 14, 15, 16, 17, 18, 19 | |||
5 | 20, 22, 24 | |||
6 | 21, 23 |
Vilka normalformer, av 1NF, 2NF, 3NF och BCNF, uppfyller tabellen? Motivera svaret!
Svar:
Den uppfyller inga av de normalformerna. Kolumnen Äppelnummer innehåller en lista med äppelnummer, så det är alltså inte ett atomärt attribut. Därför bryter den mot första normalformen. Eftersom den andra och tredje normalformen, och Boyce-Codds normalform, är strängare och strängare krav, dvs de lägger på fler och fler krav på tabellen, uppfyller tabellen inte heller dessa normalformer.
Svar:
En DBA (databasadministratör) är en person, eller en hel grupp av personer, som ansvarar för databasens drift. Ett DBMS (database management system, eller på svenska databashanterare) är det program, eller system av program, som hanterar databasen.
b) Vad är det för skillnad på ett index och en primärnyckel?
Svar:
En primärnyckel är en logisk egenskap hos en tabell, medan ett index är en datastruktur som används internt av databashanteraren. En primärnyckel (i den vanliga, logiska betydelsen) är en kolumn eller kombination av kolumner i en tabell som är garanterad att vara unik, dvs det kan inte finnas två eller flera rader i tabellen med samma värden i den kolumnen eller kombinationen av kolumner. Ett index är en datastruktur som databashanteraren internt använder för att söka efter rader i en tabell, snabbare än genom att bara läsa igenom hela tabellen. Index måste inte vara unika, dvs de kan, men måste inte, indexera en unik kolumn eller kombination av kolumner.
c) Vad är det för skillnad på ALTER och UPDATE?
Svar:
ALTER används för att ändra en tabells schema, till exempel för att lägga till en ny kolumn. UPDATE används för att ändra innehållet på en eller flera rader i tabellen.
d) Vad är det för skillnad, särskilt med tanke på webbplatser som använder databaser, på serverkällkod och klientkällkod?
Svar:
Serverkällkod är den källkod till (i första hand) en webbsida som lagras på servern. Den kan innehålla kommandon och andra element som servern först utför, för att till exempel hämta data ur en databas som ska visas på webbsidan. Klientkällkod är den HTML-kod som sedan skickas till webbläsaren, och den skiljer sig från serverkällkoden till exempel genom att kommandona för att hämta data ur en databas har ersatts med de data som hämtades.