350 likes | 459 Views
definitieve versie 2002. Databases I Domeincalculus. Martin Caminada / Wiebren de Jonge Vrije Universiteit, Amsterdam. Te behandelen querietalen. relationele algebra domeincalculus tupelcalculus SQL. Voorbeeld Database. DEPARTMENT D# NAME BUDGET D1 engineering 500,000
E N D
definitieve versie 2002 Databases IDomeincalculus Martin Caminada / Wiebren de JongeVrije Universiteit, Amsterdam
Te behandelen querietalen • relationele algebra • domeincalculus • tupelcalculus • SQL
Voorbeeld Database DEPARTMENT D# NAME BUDGET D1 engineering 500,000 D2 sales 200,000 DEPENDENT EMPLOYEE E#NAME REL E# NAME BDATED#E3 Mary daughter E1 John 28-08-1964 D1 E3 Sue wife E2 Joe 04-04-1968 D1 E4 Suzie daughter E3 Jack 03-09-1969 D1 E4 Tom son E4 Will 21-03-1971 D2 E4 Mary wife E5 Bridget 22-01-1972 D2
Domeincalculus “Geef de naam en geboortedatum van de employees die in D2 werken” { (n, b) | EMPLOYEE( name: n, bdate: b, D#: “D2” ) } notatie boek:{ n, b | EMPLOYEE( e, n, b, “D2” ) } soms ook in boek:{ n, b | e d EMPLOYEE( e, n, b, d ) AND e=“E5” } Onze notatie: • geef namen van attributen expliciet weer • laat attributen die je niet nodig hebt gewoon weg • constanten toegestaan als specificatie attribuutwaarden
Domeincalculus Algemene vorm:{ (v1, v2, …, vn) | CONDITIE(v1, v2, …, vn) } CONDITIE is een formule in predicaatlogica (met v1, v2, …, vn als vrije variabelen), opgebouwd uit de volgende atomen: • REL(A1: a1, A2: a2, …, An: an)met a1, a2, …, an variabelen of constanten • viop vjmet vi en vj variabelen en op { , , , , , } • viopc (of: c op vi)met vi variabele, c constante en op { , , , , , }
Voorbeeld query ( / ) “Geef de namen en E#’s van employees die voor 1970 zijn geboren” { (n, e) | b (EMPLOYEE( E#: e, name: n, bdate: b ) b < “01-01-1970” ) } n e John E1 Joe E2 Jack E3
Voorbeeld query () “Geef de namen van de dependents van Will” { (n) | e (EMPLOYEE(E#: e, name: “Will”) DEPENDENT(E#: e, name: n)) } n Suzie Tom Mary
Voorbeeld Database SECRETARY NAME E# BDATE ADDRESS TSPEED Sue E1 21-08-1971 Singel 30 80 Mary E2 18-12-1968 Damrak 18 90 SALESMAN NAME E# BDATE ADDRESS LIMIT John E3 08-08-1969 Rokin 21 50 000 Joe E4 09-10-1970 Nes 87 75 000 ENGINEER NAME E# BDATE ADDRESS SPECIAL Jack E5 02-02-1972 NZVBW 13 electronics Jill E6 01-01-1971 NZABW 15 software
Voorbeeld query () “Geef voor iedere employee (= secretary, salesman of engineer) z’n E# en naam” { (e, n) | SECRETARY(E#: e, name: n) SALESMAN(E#: e, name: n) ENGINEER(E#: e, name: n) } e n E1 Sue E2 Mary E3 John E4 Joe E5 Jack E6 Jill
Voorbeeld query () “Geef de E#’s en namen van de ongehuwde engineering-employees” { (e, n) | d (EMPLOYEE(E#: e, name: n, D#: d) DEPARTMENT(D#: d, name: “engineering”) DEPENDENT(E#: e, REL: “husband”) DEPENDENT(E#: e, REL: “wife”) ) } e n E1 John E2 Joe in feite maak je hier gebruik van de Closed World Assumption
Voorbeeld query () (alternatief) “Geef de E#’s en namen van de ongehuwde engineering-employees” { (e, n) | d (EMPLOYEE(E#: e, name: n, D#: d) DEPARTMENT(D#: d, name: “engineering”) r (DEPENDENT(E#: e, REL: r) (r=“husband” r=“wife”)) }
Voorbeeld query () “Geef de E#’s van de employees die werken aan alle projecten” { (e) | j (PROJECT(J#: j) EMP_PROJ(E#: e, J#: j)) } e E3
Voorbeeld Database PROJECT J# NAME J1 build-intranet J2 market-research EMP_PROJ EMPLOYEE E#J# E# NAME BDATED#E2 J1 E1 John 28-08-1964 D1 E3 J1 E2 Joe 04-04-1968 D1 E3 J2 E3 Jack 03-09-1969 D1 E4 J2 E4 Will 21-03-1971 D2 E5 J2 E5 Bridget 22-01-1972 D2
Voorbeeld query () “Geef alle paren (naam + adres) van mannen en vrouwen, ongeacht of ze in elkaars gewenste leeftijdscategorie vallen” { (mn, ma, vn, va) |M_ZOEKENDE(m_naam: mn, m_adres: ma)V_ZOEKENDE(v_naam: vn, v_adres: va) }
Voorbeeld Database M_ZOEKENDE M_NAAMM_ADRES M_GJAAR M_MINJ M_MAXJ Teun Nes 30 1950 1950 1960 Wim Singel 23 1955 1950 1960 Sjon Damstr 9 1975 1975 1980 V_ZOEKENDE V_NAAMV_ADRES V_GJAAR V_MINJ V_MAXJ Truus Amstel 80 1953 1950 1960 Bep Rokin 42 1959 1950 1960 Anita NZVBW 18 1980 1975 1980
Resultaat query mnmavnva Teun Nes 30 Truus Amstel 80 Teun Nes 30 Bep Rokin 42 Teun Nes 30 Anita NZVBW 18 Wim Singel 23 Truus Amstel 80 Wim Singel 23 Bep Rokin 42 Wim Singel 23 Anita NZVBW 18 Sjon Damstr 9 Truus Amstel 80 Sjon Damstr 9 Bep Rokin 42 Sjon Damstr 9 Anita NZVBW 18
Resultaat query (alternatief) PAAR m_naamm_adresv_naam v_adres Teun Nes 30 Truus Amstel 80 Teun Nes 30 Bep Rokin 42 Teun Nes 30 Anita NZVBW 18 Wim Singel 23 Truus Amstel 80 Wim Singel 23 Bep Rokin 42 Wim Singel 23 Anita NZVBW 18 Sjon Damstr 9 Truus Amstel 80 Sjon Damstr 9 Bep Rokin 42 Sjon Damstr 9 Anita NZVBW 18
Voorbeeld query (alternatief) “Geef alle paren (naam + adres) van mannen en vrouwen, ongeacht of ze in elkaars gewenste leeftijdscategorie vallen” { PAAR(m_naam: mn, m_adres: ma, v_naam: vn, v_adres: va) | M_ZOEKENDE(m_naam: mn, m_adres: ma)V_ZOEKENDE(v_naam: vn, v_adres: va) }
Relationeel compleet • domeincalculus is relationeel compleet; je kunt er dezelfde queries mee opstellen als met de operaties {, , , , } in relationele algebra • queries met de operaties outer join, outer union of aggregate functions kunnen niet noodzakelijkerwijs in domeincalculus worden uitgedrukt
Voorbeeld complexe queries (I) ZOEKENDE NAAMADRES GESL GJAAR MINJ MAXJ Teun Nes 30 M 1950 1950 1960 Wim Singel 23 M 1955 1950 1960 Sjon Damstr 9 M 1975 1975 1980 Truus Amstel 80 V 1953 1950 1960 Bep Rokin 42 V 1959 1950 1960 Anita NZVBW 18 V 1980 1975 1980 “Geef de namen en adressen van alle eventuele paren (d.w.z. personen van tegenovergesteld geslacht die binnen elkaars gewenste leeftijdscategorie vallen)”
Voorbeeld query (I) “Geef de namen en adressen van alle eventuele paren (d.w.z. personen van tegenovergesteld geslacht die binnen elkaars gewenste leeftijdscategorie vallen)” { (mn, ma, vn, va) |m_gjaar m_minj m_maxj v_gjaar v_minj v_maxj(ZOEKENDE(naam: mn, adres: ma, gesl: ‘M’, gjaar: m_gjaar, minj: m_minj, maxj: m_maxj) ZOEKENDE(naam: vn, adres: va, gesl: ‘V’, gjaar: v_gjaar, minj: v_minj, maxj: v_maxj) v_minj m_gjaar m_gjaar v_maxj m_minj v_gjaar v_gjaar m_maxj)
Voorbeeld complexe queries (I) mnmavn va Teun Nes 30 Truus Amstel 80 Teun Nes 30 Bep Rokin 42 Wim Singel 23 Truus Amstel 80 Wim Singel 23 Bep Rokin 42 Sjon Damstr 9 Anita NZVBW 18
Voorbeeld complexe queries (II) CAN_SUPPLY SUPPLIERPARTPRICE s1 p1 3 s1 p2 3 NEEDED s2 p1 2PART s2 p2 3p1 s2 p3 4p2 s3 p1 4 p3 s3 p2 3 s3 p3 3“Geef voor iedere supplier die s3 p4 8 alles kan leveren wat we nodig hebben z’n totaalprijs”(kan niet in domeincalculus)
Voorbeeld complexe queries (algebra) “Geef voor iedere supplier die alles kan leveren wat we nodig hebben z’n totaalprijs” TOTAL_SUPPLIERS (SUPPLIER, PART CAN_SUPPLY) NEEDED CAN_SUPPLY_RELEVANT CAN_SUPPLY TOTAL_SUPPLIERS NEEDED RESULT SUPPLIERFSUM PRICECAN_SUPPLY_RELEVANT
Voorbeeld complexe queries (II) CAN_SUPPLY SUPPLIERPARTPRICE s1 p1 3 s1 p2 3 NEEDED s2 p1 2PART s2 p2 3p1 s2 p3 4p2 s3 p1 4 p3 s3 p2 3 s3 p3 3“Geef de suppliers die s3 p4 8 alles kunnen leveren wat we nodig hebben”
Voorbeeld complexe queries (II) “Geef de suppliers die alles kunnen leveren wat we nodig hebben” { (s) | p (NEEDED(part: p) SUPPLIES(supplier: s, part: p)) } s s2 s3
Voorbeeld complexe queries (III) DRAAIT FAN_VAN STATIONARTIEST PERSOONARTIEST Country Carpenters Jan OP Country Parton Piet Meeuwis Noordzee Hazes Joost Borsato Noordzee Borsato Joost Carpenters Noordzee Meeuwis Radio10 Meeuwis LUISTERT_NAAR Radio10 Elvis PERSOONSTATION Radio10 Abba Jan Radio10 Piet Noordzee Joost Radio10 Joost Noordzee
Voorbeeld complexe queries (III) “Geef de artiesten die gedraaid worden op de stations waar Joost naar luistert” { (a) | s (DRAAIT(station: s, artiest: a) LUISTERT_NAAR(persoon: “Joost”, station: s) } a Hazes Borsato Meeuwis Elvis Abba
Voorbeeld complexe queries (III) “Geef de personen die tenminste naar ieder radiostation luisteren waar Piet ook naar luistert (eventueel ook nog naar andere stations)” { (p) | s (LUISTERT_NAAR(persoon: “Piet”, station: s) LUISTERT_NAAR(persoon: p, station: s)) } p Piet Joost
Voorbeeld complexe queries (III) “Geef de fans van artiesten die nergens gedraaid worden” { (p) | a (FAN_VAN(persoon: p, artiest: a) s DRAAIT(station: s, artiest: a)) } p Jan
Herschrijven queries: PNF “Geef de fans van artiesten die nergens gedraaid worden” { (p) | a (FAN_VAN(persoon: p, artiest: a) s DRAAIT(station: s, artiest: a)) } a (FAN_VAN(p, a) s DRAAIT(s, a)) a (FAN_VAN(p, a) s DRAAIT(s, a)) ( ) a (s DRAAIT(s, a) FAN_VAN(p, a)) (f d d f) a s (DRAAIT(s, a) FAN_VAN(p, a)) (uitbreiden scope )
Prenex Normal Form • Een formule is in Prenex Normal Form (PNF) als alle kwantoren aan het begin van de formule staan: Q1x1 Q2x2 … Qnxn f’ met Qi {, } en f’ formule zonder kwantoren • waarom herschrijven? • vergelijken of twee queries equivalent zijn • herschrijven query soms noodzakelijk wegens beperkingen querytaal • PNF levert in SQL veelal beter leesbare queries op
Herschrijfregels PNF (1/2) • f f • f g f g • f g g ff g g f • (f g) f g(f g) f g • f (g h) (f g) (f h)f (g h) (f g) (f h) • x f(x) x f(x)x f(x) x f(x)
Herschrijfregels PNF (2/2) • Qx f(x) Qy f(y) (d.w.z. vervang alle vrije voorkomens van x in f door y) • Qx f(x) g Qx (f(x) g)Qx f(x) g Qx (f(x) g) • Q1x f(x) Q2x g(x) Q1x Q2y(f(x) g(y))Q1x f(x) Q2x g(x) Q1x Q2y (f(x) g(y)) • x f(x) y g(y) x (f(x) g(x)) x f(x) y g(y) x (f(x) g(x)) • let op: x f(x) y g(y) x (f(x) g(x)) x f(x) y g(y) x (f(x) g(x))
Thuis • nalezen: 9.4 + aanvullingen hoofdstuk 9 • voorbereiden: 9.3 • huiswerk: • opgave 19 (nieuw) • opgave 20 (nieuw) • opgave 4