02.08.2013 Views

Räkneövning 2 i Databaser modellsvar vecka 6, 2012

Räkneövning 2 i Databaser modellsvar vecka 6, 2012

Räkneövning 2 i Databaser modellsvar vecka 6, 2012

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Räkneövning</strong> 2 i <strong>Databaser</strong> ­ <strong>modellsvar</strong> <strong>vecka</strong> 6, <strong>2012</strong><br />

1. Svar:<br />

Konsult = (konsultnr, förnamn, efternamn)<br />

Projekt_konsult = (konsultnr, projektnr)<br />

Projekt = (projektnr, startdatum, slutdatum)<br />

Projekt_kund = (projektnr, kundnr)<br />

Kund = (kundnr, kundnamn, stad)<br />

konsult projekt kund<br />

konsultnr<br />

förnamn<br />

efternamn<br />

projekt_konsult projekt_kund<br />

Obs! Det finns ett alternativt relationsschema: eftersom varje projekt har max. en kund kopplat<br />

till sig (i detta fall exakt en kund), kunde kundnr sättas som ett attribut hos Projekt; det skulle<br />

bli en främmande nyckel till Kund), och därmed kunde tabellen Projekt_kund helt skippas.<br />

Informationen om vem som beställt projektet skulle alltså finnas hos projektet ifråga. OBS!<br />

Man kan INTE skippa sambandsmängden från E­R­modellen!!! Två entiteter kan inte direkt<br />

kopplas till varandra utan ett sambandsmängd emellan!<br />

2. Svar: (nästa sida)<br />

projektnr<br />

konsultnr<br />

projektnr<br />

startdatum<br />

slutdatum<br />

kundnr<br />

kundnamn<br />

stad<br />

projektnr<br />

kundnr


Konto = (kontonr, saldo)<br />

Ägare = (kontonr, kund_id) Obs! Kontonr ensamt räcker som PN, eftersom varje konto har<br />

max. en ägare!<br />

Kund = (kund_id, förnamn, efternamn, gata, gatunummer, postnummer, stad)<br />

Låntagare = (kund_id, lån_nr)<br />

Lån = (lån_nr, belopp)<br />

konto kund lån<br />

kontonr<br />

______________<br />

saldo<br />

kund_id<br />

____________<br />

förnamn<br />

____________<br />

efternamn<br />

____________<br />

gata<br />

____________<br />

lån_nr<br />

______________<br />

belopp<br />

ägare gatunummer<br />

____________<br />

låntagare<br />

kontonr<br />

postnummer<br />

kund_id<br />

________________ ____________<br />

_______________<br />

kund_id<br />

stad<br />

lån_nr<br />

3. Rita ett E­R­diagram för ett litet inredningsföretag som säljer möbler mot<br />

avbetalning! Vi ska kunna lagra uppgifter om kunder, möbler och försäljare samt de<br />

olika inköpen som ska betalas i rater. För varje kund ska vi registrera kundnummer,<br />

kundens namn och kundens adress. För försäljarna registreras försäljarnummer och<br />

försäljarens namn. För möblerna registreras artikelnummer, artikelnamn och<br />

försäljningspris (vi skippar här den övriga lagerinformationen). För varje inköp<br />

registreras transaktionsnummer, datum och totalbelopp. Dessutom ska det gå att för<br />

varje inköp registrera ett antal avbetalningsrater (med löpande nummer, datum och<br />

belopp ­ fundera noga hur dessa bäst skulle representeras!). Hur hänger alla dessa<br />

entitetsmängder ihop, dvs. vilka sambandsmängder behöver du för att representera de<br />

olika sambanden mellan dessa entiteter? Tänk noga på kardinaliteterna! (3p)


kund<br />

kundnr<br />

kundnamn<br />

adress<br />

Kommentarer till 3:<br />

gör<br />

artikel<br />

artikelnr<br />

artikelnamn<br />

pris<br />

rat<br />

nr<br />

säljs<br />

inköp<br />

nr<br />

datum<br />

totalbelopp<br />

avbetal-<br />

ning<br />

datum<br />

belopp<br />

säljer<br />

försäljare<br />

försäljarnr<br />

namn<br />

• Inköp kunde tänkas vara ett ternärt (3­)sambandsmängd mellan kund, artikel och<br />

försäljare, men då skulle varje inköp gälla exakt en (1 st.) artikel, inte ex. en stolgrupp<br />

på fyra stolar (sambandsmängdens primärnyckel skulle utgöras av de tre entiteternas<br />

primärnycklar). Då kunde man inte heller ha rat som en svag entitetsmängd med inköp<br />

som identifierande stark entitetsmängd, för inköp skulle vara ett samband, inte en<br />

entitet.<br />

• Varje inköp måste relateras till en kund (som gör inköpet), en eller flera artiklar som<br />

köps och en försäljare som utför transaktionen.<br />

• Vi tillåter inte att flera kunder tillsammans gör ett inköp; varje inköp registreras till exakt<br />

en kund.


4. Se på den kursdatabas som kommer här som bilaga och ge det relationsalgebraiska<br />

uttrycket för följande frågor: (5p)<br />

a) Vilka kurser (ID, course_id, sec_id, semester, year) hålls av läraren med ID 45565?<br />

ID = 45565 (teaches)<br />

ID course_id sec_id semester year<br />

45565 CS­101 1 Spring 2010<br />

45565 CS­319 1 Spring 2010<br />

b) Hur skulle du modifiera uttrycket i a) om du bara vill se kolumnerna ID och course_id<br />

i resultatet?<br />

ID, course_id ( ID = 45565 (teaches))<br />

c) Modifiera uttrycket i fråga b) så att ID ersätts av lärarens namn!<br />

name, course_id ( teaches.ID = instructor.ID ∧ teaches. ID = 45565 (teaches ×<br />

instructor))<br />

eller<br />

name course_id<br />

Katz CS­101<br />

Katz CS­319<br />

name, course_id ( ID = 45565 (teaches 1 instructor))<br />

d) Modifiera uttrycket i fråga c) så att course_id ersätts av kursnamnet (title)!<br />

name, title ( ID = 45565 ( course 1 teaches 1 instructor))<br />

name title<br />

Katz Intro. To Computer Science<br />

Katz Image Processing


e) Vilka studenter (ID) tar/har tagit både CS­101 och CS­347? Vi räknar med också<br />

dem som har vitsordet F (UK) eller NULL (har inte tentat ännu).<br />

temp1 ← ID (course_id = 'CS­101' (takes))<br />

temp2 ← ID (course_id ='CS­347' (takes))<br />

temp1 ∩<br />

temp2 eller:<br />

ID (course_id = 'CS­101' (takes)) ∩<br />

ID (course_id = 'CS­347' (takes))<br />

temp1 temp2<br />

00128 00128<br />

12345 12345<br />

45678<br />

54321<br />

76543<br />

98765<br />

f) Vilka studenter (ID) tar kurs CS­101 men inte CS­319?<br />

temp1 ← ID (course_id = 'CS­101' (takes))<br />

temp2 ← ID (course_id = 'CS­319' (takes))<br />

resultat ← temp1 ­ temp2 eller<br />

ID (course_id = 'CS­101' (takes)) ­ ID (course_id = 'CS­319' (takes))<br />

temp1 temp2<br />

00128 45678<br />

12345 76543<br />

45678<br />

54321<br />

76543<br />

98765


eller<br />

f) Hur många Comp. Sci. studenter finns det i student ?<br />

Gcount()(dept_name = 'Comp. Sci.' (student))<br />

4<br />

antal (dept_name = 'Comp. Sci.' (dept_nameGcount() as antal (student)))<br />

dept_name antal<br />

Comp. Sci. 4 antal<br />

History 1 4<br />

Finance 1<br />

Physics 3<br />

Music 1<br />

Elec. Eng. 2<br />

Biology 1<br />

g) Hur många studiepoäng (credits) får den som tar alla de kurser som ges<br />

av institutionen Comp. Sci.?<br />

Gsum(credits)(dept_name = 'Comp. Sci.' (course))<br />

course_id title dept_name credits<br />

CS­101 Intro. to Computer Science Comp. Sci. 4<br />

CS­190 Game Design Comp. Sci. 4<br />

CS­315 Robotics Comp. Sci. 3<br />

CS­319 Image Processing Comp. Sci. 3<br />

CS­347 Database System Concepts Comp. Sci. 3 17


eller:<br />

sum_cu (dept_name = 'comp. Sci.' (dept_nameGsum(credits) as sum_cu (course)))<br />

dept_name sum_cu<br />

Biology 11<br />

Comp. Sci. 17<br />

Elec. Eng. 3<br />

Finance 3<br />

History 3<br />

Music 3<br />

Physics 4<br />

17

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!