Lösningar till tentamen i EDAF75

Relevanta dokument
Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Lösningsförslag, tentamen i Databaser

Databasutveckling Microsoft T-SQL - Fortsättning. Funktioner GROUP BY HAVING Skapa databaser Skapa tabeller Lite om transaktioshantering

Funktionella beroenden - teori

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Databasföreläsning. Del 2 lagrade procedurer, vyer och transaktioner

Exempel-Tentamen III

Labb LIVE. Exempelkod från föreläsningen. Plushögskolan Frågeutveckling inom MSSQL - SU14

Idag. Databaskvalitet(??) Databaskvalitet... Databaskvalitet...

Övningar i SQL. SQLAccess.doc Ove Lundgren

Databaser. Vad du ska lära dig: Ordlista

Starta MySQL Query Browser

Transaktioner. 1. Transaktioner 2. Samtidighet ( concurrency ) och lås. 3. Deadlock. Kap. 17. Informatik B: Databashantering med SQL Server

Tentamen. Databasmetodik Lördag 27 september 2014 kl

Grunderna i SQL del 1

Databasens består av: Tabell Kolumner fält Rader poster (varje post är unik)

NORMALISERING. Mahmud Al Hakim

Structured query language (SQL)

TENTAMEN. För kursen. Databasteknik. Ansvarig för tentamen: Cecilia Sönströd. Förfrågningar: Anslås inom 3 veckor

Konceptuella datamodeller

SQL, nästlade delfrågor Nästlade delfrågor. En nästlda delfråga är ett select-from-where uttryck inom where-klausulen i en annan fråga.

Tentamen i Databasteknik

DIVISIONSEXEMPEL RELATIONSALGEBRA OCH SQL. r s använder vi för att uttrycka frågor där ordet alla figurerar:

1.Lär känna MS SQL Observera. Tips. Förberedelse

ÖVNING 10 2NF Hästnamn, KursId, StartDatum, SlutDatum KursId NY! 3NF Hästnamn, Art, NY! NY! NY! NY! KursId, StartDatum, SlutDatum KursId NY!

Labb LABB 1. Databassagan och en rundtur i databasers märkliga värld. Plushögskolan Frågeutveckling inom MSSQL - SU14

Tentamen för DD1370 Databasteknik och informationssystem

Lösningsförslag Tentamen, 25 april 03

TER3. Försättsblad till skriftlig tentamen vid Linköpings universitet G28 TEN1 Webprogrammering och databaser Tentamen IDA 1 (7)

Analytisk relationsdatabasdesign

SQLs delar. Idag. Att utplåna en databas. Skapa en databas

Design och underhåll av databaser

Tentamen. i Databasteknik. lördagen den 13 mars Tillåtna hjälpmedel: Allt upptänkligt material

TDDI 60 Tekniska databaser

Structured Query Language (SQL)

Tentamen för DD1370 Databasteknik och informationssystem

Tentamen i Databasteknik

Databaser och Datamodellering Foreläsning IV

Lär känna MS SQL 2008 / Övning. Observera. Tips. Förberedelse

Introduktion till frågespråket SQL (v0.91)

Datalager och datautvinning

Lösningsförslag till Exempel tentamen

Tentamen EIT:DB Databastmetodik 11/ kl Lösningsförslag

Databasdesign. E-R-modellen

Grunderna för relationsmodellen!

D1. Create Domain TEXT30 char(30) Default INGET VÄRDE! ;

Tentamen för DD1370 Databasteknik och informationssystem

Idag. Hur skapar vi och underhåller en databas? DD1370 (Föreläsning 4) Databasteknik och informationssystem 7,5 hp Hösten / 20

Vad är en databas? Exempel på databaser: Databas = Organiserad samling och lagring av information.

Databaser Design och programmering

Databaser och SQL - en kort introduktion

Disposition. 1. Kopplingen mellan Processanalys (DFDdiagram) 2. Treskikts Client-Server arkitektur (Fig 1.8) 3. Data layer

1. SQL 2. Utsökningar mot flera tabeller. 4. IN-operatorn 5. Join 6. Kartesisk produkt 7. Tabellalias

TENTAMEN TDDD12 Databasteknik 7 januari 2010, kl 14-18

3. Dynamiska webbplatser, 20 Yhp (4 v)

Extra övningar i SQL. Följande SQL-satser bygger på exemplen (och databasen) i föreläsningsbilderna från föreläsningen om relationsalgebra.

Databaskunskap 7,5 högskolepoäng Provmoment: Ladokkod: Tentamen ges för:

SQL. Structured Query Language. Frågespråk för att används för. Kommandon. data åtkomst data manipulation

Pga att (Nummer och Typ) tillsammans bestämmer övriga attribut funktionellt väljer vi (Nummer, Typ) till primärnyckel:

1. SQL DML (Data Manipulation Language) 2. Lägga till data. 4. Uppdatera data 5. Aktivera default value 6. Hantera datum 7.

Tentamen i Databasteknik

Databaser och. SQL, utsökningar mot flera tabeller TENTA. # radnr (#) studnr (#) kursnr * tentadatum * betyg

Viktigt! Glöm inte att skriva Tentamenskod på alla blad du lämnar in.

Innehåll MySQL Intro. Ex på ett index Index typer ISAM Balanserat träd Pk och Fk i MySQL Eget index För o nackdelar med index

Normalisering. Christer Stuxberg Institutionen för Informatik och Media

TENTAMEN. TDDD12 Databasteknik TDDD46 Databasteknik. 16 augusti 2010, kl 14-18

Tentamen DATABASTEKNIK - 1DL116, 1MB025

Inga hjälpmedel är tillåtna

TENTAMEN. För kursen. Databasteknik. Ansvarig för tentamen: Cecilia Sönströd. Förfrågningar: Anslås inom 3 veckor

Vad är en databas? Databaser. Relationsdatabas. Vad är en databashanterare? Vad du ska lära dig: Ordlista

Tentamen i. Databasteknik

TENTAMEN För kursen. Databasteknik. Ansvarig för tentamen: Anna Palmquist. Förfrågningar: Anslås inom 3 veckor

ÖVERVAKNING AV SQL SERVER

Uppgift 1. (a) Ange tre orsaker hur felaktigheter i en databas kan uppsta. Till varje av dem, ange en lamplig metod som anvands som atgard mot dessa.

Logisk databasdesign

Databasutveckling Tabeller. tinyint 1 byte (0-255) Upp till 8 bytes

Idag. 1. Från modell till databasstruktur. 2. Prata med databaser (frågepsråket SQL)

Från verklighet via modell till databas. Idag. Testa reglerna på varuhusmodellen. Från verklighet via modell till databas

TENTAMEN. För kursen. Databasteknik. Ansvarig för tentamen: Cecilia Sönströd. Förfrågningar: Anslås inom 3 veckor

Tentamen. TDDB38 - Databasteknik

Tentamen DATABASTEKNIK - 1DL116

Concepts learned this far. ER till relationer. ER till relationer. ER till relationer. TDDD12 Database Technology

Databasspråket SQL - online.

Karlstads Universitet, Datavetenskap 1

Innehåll MySQL Intro. Allmänt om Lagrade Procedurer Enkel utformning Skapa en lagrad procedur Använda parameter som indata

Lösningsförslag till Tentamen,

SQL del 2. Christer Stuxberg Institutionen för Informatik och Media

Normalisering. Varför? För att åstadkomma en så bra struktur i databasen som möjligt med minimalt med dubbellagrad info.

Databasspråket SQL - online.

TDDI60 Tekniska databaser

Karlstads Universitet, Datavetenskap 1

Uppstart Inloggning SSMS Skapa Databas Skapa Tabell Skapa Diagram, Fk, RI Hantering av Index, Pk, Fk, Ix Constraints Beräknande fält Några funktioner

KAP 16 BACKUP, RESTORE OCH RECOVERY

TENTAMEN TDDB77 Databaser och Bioinformatik 15 mars 2002, kl 14-18

Tentamenskod: Tentamensdatum: Tid: 14:00-19:00. Inga hjälpmedel är tillåtna

TENTAMEN. För kursen. Databasteknik. Ansvarig för tentamen: Cecilia Sönströd. Förfrågningar: Anslås inom 3 veckor

Tentamen för DD1370 Databasteknik och informationssystem

Transkript:

Lösningar till tentamen i EDAF75 4 april 2018 Lösning 1 (a) Här är ett förslag till E/R-modell: Det finns flera rimliga alternativa sätt att modellera, så du behöver inte vara orolig bara för att du inte gjort precis som i figuren ovan. (b) Det finns ganska många svaga entity sets, nedan har vi infört flera surrogate keys : users(user_name, name) nationalities(country) citizenships(user_name, country) groups(group_id, user_name, group_name) group_members(group_id, user_name) posts(post_id, user_name, contents, post_time) accessible_posts(post_id, group_id) likes(like_id, post_id, user_name, like_time) comments(comment_id, post_id, user_name, contents, comment_time) shares(share_id, post_id, user_name, share_time) group_shares(share_id, group_id) (c) Som vanligt finns det flera sätt att lösa uppgiften (man kan till exempel ha ett DISTINCT inne i en COUNT), ett sätt att göra det i steg är följande: WITH complicit_users AS ( 1

DISTINCT user_name users JOIN citizenships (user_name) JOIN likes (user_name) JOIN posts (post_id) WHERE country = Australia AND contents LIKE %#SANDPAPER% ) COUNT() complicit_users Lösning 2 (a) E/R-diagram: Den enkla lösningen är: Om vi vill så kan vi använda en tom associationsklass för aassociationen mellan Publication och Person: (b) Attributen name och title är strängar, och de är båda främmande nycklar dessutom utgör de tillsammans nyckel för tabellen: CREATE TABLE authors ( name TEXT, title TEXT, PRIMARY KEY(name, title), FOREIGN KEY(name) REFERENCES persons(name), FOREIGN KEY(title) REFERENCES publications(title) ); (c) Här räcker det med en vanlig SFW (select-from-where): title, journal publications WHERE year = 2017 ORDER BY title; 2

(d) Eftersom titeln är naturlig nyckel i authors, så räcker det att vi joinar authors och persons (vi behöver inte titta vidare in i publications det hade vi behövt göra om vi istället hade haft en surrogatnyckel i publications): DISTINCT title authors JOIN persons (name) WHERE affiliation = Lund University ; (e) Vi kan lösa uppgiften antingen med en outer join: LEFT JOIN WHERE name persons authors (name) title IS NULL AND affiliation = Lund University ; eller med en subquery: WHERE name persons affiliation = Lund University AND name NOT IN ( name authors); (f) Vi kan gruppera författarna på titel, och se vilka titlar som har mer än en författare: title authors GROUP BY title HAVING COUNT() > 1; (g) Vi gör en left outer join på persons och authors, och får på så vis med samtliga personer. För att slippa NULL i utskriften använder vi COALESCE eller IFNULL): LEFT JOIN GROUP BY ORDER BY name, COALESCE(COUNT(), 0) AS cnt persons authors (name) name cnt DESC; Lösning 3 (a) Vi kan inte på rak arm säga att något attribut måste ingå i en nyckel (alla attribut kan härledas med hjälp av något/några av de andra), så vi testar alla 1-attributsnycklar: {A} + = {AB} {B} + = {B} {C} + = {CD} {D} + = {D} Vi testar därefter alla möjliga två-attributsnycklar: {AB} + = {AB} 3

{AC} + = {ABCD} {AD} + = {ABCD} {BC} + = {ABCD} {BD} + = {ABCD} {CD} + = {CD} Så, {AC}, {AD}, {BC} och {BD} är nycklar. Det går inte att bilda kombinationer med tre eller fyra attribut som inte har någon av nycklarna ovan som delmängder, så vi har hittat alla våra nycklar. (b) FD 1 och FD 4 bryter mot BCNF, eftersom deras vänsterled inte är supernycklar FD 2 och FD 3 bryter inte mot BCNF eftersom deras vänsterled är nycklar (och därmed även supernycklar). (c) FD 2 och FD 3 är i BCNF, och därmed även i 3NF, och i både FD 1 och FD 4 har vi högerled som ingår som delar av nycklar, så relationen R är i 3NF. (d) Vi kan baka ihop FD 2 och FD 3 till ett funktionellt beroende, och har därefter: Relation: R(A, B, C, D) Beroenden: A B, BD AC, C D, {AD}, {BC}, {BD} och kan här välja att bryta upp på antingen A B eller C D, eftersom de är de enda som bryter mot BCNF. Vi börjar med A B: Relation: R 1 (A, B) Beroenden: A B Nycklar: {A} Denna är i BCNF, eftersom vänsterledet i vårt enda funktionella beroende är en supernyckel (alla relationer med två attribut är i BCNF, för om det finns något funktionellt beroende i relationen R(A, B), så måste det vara av formen A B eller B A, och A eller B skulle i så fall vara en nyckel). Relation: R 2 (A, C, D) Beroenden: C D Denna är inte i BCNF, eftersom C D har ett vänsterled som inte är en supernyckel. Vi måste alltså bryta upp ett steg till, och kan bara göra det på C D: Relation: R 3 (C, D) Beroenden: C D Nycklar: {C} Vänsterledet i det enda beroendet är en supernyckel, alltså är relationen i BCNF. Relation: R 4 (A, C) Beroenden: inga Vi har inga beroenden, alltså är vi i BCNF. Sammanfattningsvis får vi relationerna: R 1 (A, B) R 3 (C, D) R 4 (A, C) Om vi istället väljer att bryta upp vår ursprungliga relation på C D, så får vi: 4

Relation: R 1 (C, D) Beroenden: C D Nycklar: {C} Denna är i BCNF, eftersom den bara har två attribut (vänsterledet i vårt enda funktionella beroende är en supernyckel). Relation: R 2 (A, B, C) Beroenden: A B Denna är inte i BCNF, eftersom A B har ett vänsterled som inte är en supernyckel. Vi måste alltså bryta upp ett steg till, och kan bara göra det på A B: Relation: R 3 (A, B) Beroenden: A B Nycklar: {A} Vänsterledet i det enda beroendet är en supernyckel, alltså är relationen i BCNF. Relation: R 4 (A, C) Beroenden: inga Vi har inga beroenden, alltså är vi i BCNF. Sammanfattningsvis får vi relationerna: R 1 (C, D) R 3 (A, B) R 4 (A, C) Detta är samma relationer som vi fick ovan (med lite annan numrering). Lösning 4 (a) Om attributen B 1, B 2,... B m entydigt bestäms av värdet på attributen A 1, A 2,... A n, så sägs B 1, B 2,... B m vara funktionellt beroende av A 1, A 2,... A n, och vi skriver A 1, A 2,... A n B 1, B 2,... B m Man säger även ibland att A 1, A 2,... A n funktionellt bestämmer B 1, B 2,... B m. En supernyckel i en relation är en uppsättning attribut som entydigt bestämmer värdet på samtliga övriga attribut i relationen en nyckel är en supernyckel som inte innehåller något attribut som själv beror på övriga attribut i nyckeln (den kallas då minimal). För en nyckel gäller alltså att samtliga övriga attribut i relationen är funktionellt beroende av dem. (b) Vi kan ta en tabell med information om våra vänner, vi kan ha attributen: namn, vi antar att namnen är unika telefonnummer, vi antar att varje person bara har ett telefonnummer, och att inga vänner delar telefon med varanda gatuadress, vi antar att vännerna bara har en bostadsplats, men att flera vänner kan dela en adress postnummer Här har vi följande funktionella beroenden: FD 1 : FD 2 : FD 3 : name telefonnummer, gatuadress, postnummer telefonnummer namn, gatuadress, postnummer gatuadress postnummer (Här är namn och telefonnummer var för sig nycklar för hela relationen relationen är inte i BCNF, eftersom FD 3 har ett vänsterled som inte är en supernyckel.) 5

Lösning 5 (a) Vi använder transaktioner av två olika skäl: Vi vill kunna ge samtidig access till databasen från flera processer. Vi vill kunna hantera olika slags fel som kan uppstå. Begreppet ACID (Atomicity-Consistency-Isolation-Durability) kretsar kring både samtidighet och felåterhämtning. Ett exempel då vi vill använda transasktioner är när vi i en bank-databas vill flytta pengar mellan två konton 1. Vi startar en transaktion när vi börjar transfereringen, och avslutar transaktionen när vi ökat det ena saldot, och minskat det andra. Det gör att: ingen annan kan ändra saldot på våra konton under själva transaktionen (isolation), vi kan göra en roll-back om något saldo skulle bli negativt (atomicity, consistency), vi kan återställa databasen om vi får något systemfel (atomicity, consistency). (b) Vi kan starta en transaktion med START TRANSACTION (syntaxen skiljer mellan olika databaser, i några skriver man istället BEGIN), och vi kan avsluta den med COMMIT eller ROLLBACK (vi skulle ange två kommandon, välj två av ovanstående tre). COMMIT markerar att vår transaktion har avslutats som vi planerade, och att våra tabeller skall uppdateras. ROLLBACK gör att vi tar tillbaka de uppdateringar vi har gjort i transaktionen. (c) Vi kan välja olika grader av isolering för våra transaktioner, minimal isolering får vi med ISOLATION LEVEL READ UNCOMMITTED här riskerar vi att läsa data som ännu inte commit -ats i någon annan transaktion (och som kanske kommer att tas tillbaka i en ROLLBACK). Fördelen med att använda READ UNCOMMITTED är att vi inte behöver låsa databasen, nackdelen är att vi har färre garantier rörande våra data, vi kan rent av få data som aldrig skulle varit i databasen (som vid en ROLLBACK). Om vi istället väljer ISOLATION LEVEL READ COMMITTED, så får vi bara data som har commit -ats, vi ökar därmed kvaliteten på våra data, men detta kräver att vi måste låsa delar av databasen. I REPEATABLE READ garanteras att vi inne i vår transaktion får samma svar på samma query, så länge vi inte själva ändrar i tabellen, eller någon annan lägger till nya rader i den underliggande tabellen (detta kallas phantom reads ). Lösning 6 En inre join kombinerar två tabeller R A och R B med avseende på något join-predikat ett sådant predikat tar attribut från båda tabellerna och ser var raderna matchar varandra: p(a i1, a i2,..., b j1, b j2,...). Den resulterande tabellen får i sina rader samtliga projicerade kolumner från de båda tabellerna, för de kombinationer av rader i R A och R B för vilka join-predikatet gäller rent logiskt är detta samma som om vi tar en cross join mellan R A och R B, och sedan använder join-predikatet för selektion (men vi kan slippa upprepade kolumner, och frågeoptimeraren kan ibland konstruera effektivare sökningar om den vet att vi vill göra en inner join dessutom blir frågan lättare att läsa om den struktureras med inner joins). Skillnaden mellan en inner join och en outer join är att vi i en outer join matchar samtliga rader i den ena (left eller right outer join) eller båda (full outer join) de rader som saknar motsvarighet i den andra tabellen kombineras ihop med NULL-värden. Som exempel kan vi ta en databas liknande den med vänner som vi hade i problem 4b men nu även med böcker som kan lånas ut: friends(name, phone, street_addr) books(isbn, title) loans(name, isbn, borrowed_on) Vi kan generera en lista på alla de böcker våra vänner lånat, antingen bara en lista med namn och titlar: JOIN name, title loans books (isbn); 1 Detta är något man numera ofta försöker undvika genom att man lagrar transfereringar snarare än uppdaterar saldon. 6

eller en lite snyggare utskrift (där vi slår samman alla böcker på en rad i utskriften, så att vi får en rad per vän): JOIN GROUP BY name, GROUP_CONCAT(title,, ) AS borrowed loans books (isbn) name; I dessa båda queries får vi bara med de vänner som har lånat någon bok, de vänner som inte kan kombineras med en rad i loans kommer inte med. Om vi vill ha med alla vänner, oavsett om de lånat eller ej, så kan vi göra en left outer join med friendstabellen till vänster: name, COALESCE(GROUP_CONCAT(title,, ), no loans ) AS borrowed friends LEFT JOIN loans (name) LEFT JOIN books (isbn) GROUP BY name; Vi kan även använda denna teknik för att hitta just de vänner som inte har lånat någon bok de har parats ihop med NULL-värden: title books LEFT JOIN loans (isbn) WHERE name IS NULL; 7