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
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 ERmodellen!!! 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 ERdiagram 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 CS101 1 Spring 2010<br />
45565 CS319 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 CS101<br />
Katz CS319<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 CS101 och CS347? Vi räknar med också<br />
dem som har vitsordet F (UK) eller NULL (har inte tentat ännu).<br />
temp1 ← ID (course_id = 'CS101' (takes))<br />
temp2 ← ID (course_id ='CS347' (takes))<br />
temp1 ∩<br />
temp2 eller:<br />
ID (course_id = 'CS101' (takes)) ∩<br />
ID (course_id = 'CS347' (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 CS101 men inte CS319?<br />
temp1 ← ID (course_id = 'CS101' (takes))<br />
temp2 ← ID (course_id = 'CS319' (takes))<br />
resultat ← temp1 temp2 eller<br />
ID (course_id = 'CS101' (takes)) ID (course_id = 'CS319' (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 />
CS101 Intro. to Computer Science Comp. Sci. 4<br />
CS190 Game Design Comp. Sci. 4<br />
CS315 Robotics Comp. Sci. 3<br />
CS319 Image Processing Comp. Sci. 3<br />
CS347 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