Datamodelleren en databases 21 Capita selecta 1 In dit college Modelleren Normaliseren Functionele afhankelijkheid 1-3N M:N-relaties, associatieve entiteittypes, ternaire relaties Weak entiteittypes Multivalued attributes (implementatie) Implementatie super/subtypes Queries selectie, projectie en join 2/30 Wat is normaliseren? Data organiseren in tabelvorm, zó dat: er minimale redundantie is update-operaties (toevoegen, wijzigen, verwijderen) eenvoudig zijn uit te voeren records in een tabel te identificeren zijn m.b.v. een unieke sleutel (primary key) 3/30 DMO 2007 1
Redundantie: voorbeeld Suppliers-and-Parts: wat als een leverancier verhuist? S# City P# Qty S1 London P1 300 S1 London P2 200 S1 London P3 400 S2 Paris P1 100 S2 Paris P2 400 S3 Paris P2 100 S4 London P2 200 S4 London P4 300 4/30 Normaliseren als techniek Normaliseren: bottom-up datamodelleringstechniek vgl. ER-methode: top-down Omvat een aantal stappen (= normaalvormen): 1NF 2NF 3NF BCNF 4NF 5NF 6NF meestal voldoende: relatie is genormaliseerd 1NF 2NF 3NF BCNF 4NF 5NF 6NF 2NF veronderstelt, dat de dataset al in 1NF is, etc. 5/30 Functionele afhankelijkheid (vb) S# City P# Qty S1 London P1 300 S1 London P2 200 S1 London P3 400 S2 Paris P1 100 S2 Paris P2 400 S3 Paris P2 100 S4 London P2 200 S4 London P4 300 S# P# City Qty S# is de determinant van City City is functioneel afhankelijk van S# 6/30 DMO 2007 2
Functionele afhankelijkheid (def) Given a relation R: attribute Y of R is functionally dependent on attribute X if and only if each X-value in R has associated with it precisely one Y-value in R (at any one time). in symbols, R.X R.Y (read: R.X functionally determines R.Y ) Attributes X and Y may be composite. 7/30 Bedrijf & werknemers - start Een team kan verschillende projecten hebben, een werknemer kan in verschillende teams zitten, maar werkt maar aan één project tegelijk. Attributen in dit voorbeeld (t = team, p = project; telkosten: aantal eenheden gebeld op een bepaald toestel): team#, pers#, tbudget, tel#, telkosten, proj#, pbudget 8/30 Bedrijf & werknemers 1NF team# tbudget pers# tel# telkosten proj# pbudget 500 112 3456 0 10 200 500 113 4589 34 10 200 500 114 1267 12 20 100 700 112 3456 0 NULL NULL 700 115 2385 57 30 400 700 116 1467 25 30 400 de alles -relatie 1NF: All values are atomic (no repeating groups) BEDRIJF (team#, tbudget, pers#, tel#, telkosten, proj#, pbudget) 9/30 DMO 2007 3
Bedrijf & werknemers 2NF BEDRIJF (team#, tbudget, pers#, tel#, telkosten, proj#, pbudget) BEDRIJF heeft een composite PK testen op 2NF: 2NF: Every non-key column dependent on the entire PK Dit is niet het geval, dus 1NF 2NF: TEAM (team#, tbudget) WERKNEMER (pers#, tel#, telkosten, proj#) 10/30 Bedrijf & werknemers 3NF 3NF: no transitive dependency on PK Er is nu wel transitieve afhankelijkheid er zijn nog andere, directere determinanten, namelijk: proj# pbudget tel# telkosten Dus hiervoor aparte tabellen: 2NF 3NF: TEAM (team#, tbudget) WERKNEMER (pers#, tel#, proj#) tel# en proj# zijn FK PROJECT (proj#, pbudget, team#) team# is FK TELEFOON (tel#, telkosten) Wat overblijft is de tussentabel voor de veel-op-veel relatie TEAM- WERKNEMER: TAAK (team#, pers#) team# en pers# zijn FK 11/30 Bedrijf & werknemers - eind TEAM team# tbudget 500 700 pers# 112 113 114 tel# 3456 4589 1267 proj# 10 10 20 tel# 3456 4589 1267 telkosten 0 TELEFOON 34 12 WERKNEMER 115 116 2385 1467 30 30 3456 2385 0 57 1467 25 PROJECT team# 03 proj# 10 20 30 pbudget 200 100 400 team# pers# 112 113 114 TAAK 115 116 12/30 DMO 2007 4
Eindsituatie in ERD associatieve entiteit / weak 13/30 Weak (= dependent) entity can only exist in conjunction with an other entity. cannot be uniquely identified by its attributes alone; therefore, it must use a foreign key in conjunction with its attributes to create a primary key (Wikipedia). 14/30 Variant ERD Wat is het verschil? Welke oplossing is beter? associatieve entiteit in ternaire relatie 15/30 DMO 2007 5
We breiden het voorbeeld uit Multivalued attribute tools : Zó niet te implementeren als één tabel, waarom niet? 16/30 Multivalued attribute 1:N 17/30 Hoe gaat het in Ms. Access? Tabellen maken Tools Relationships Relationships window Slepen van PK naar andere tabel 18/30 DMO 2007 6
Supertype/subtype Supertype Drie implementaties: 3 tabellen 2 subtypetabellen 1 supertypetabel null values Subtype1 Subtype2 19/30 SQL: Selectie Selection operatie op een relationele tabel waarbij records worden geselecteerd die aan een bepaald criterium voldoen, en die samen worden opgeleverd als een nieuwe tabel. SQL SELECT * FROM Employee WHERE Age > 50 ORDER BY Age 20/30 SQL: ORDER BY The ORDER BY keyword is used to sort the result-set by a specified column. The ORDER BY keyword sort the records in ascending order by default. If you want to sort the records in a descending order, you can use the DESC keyword. 21/30 DMO 2007 7
SQL: GROUP BY The GROUP BY statement is used in conjunction with the aggregate functions to group the result-set by one or more columns. 22/30 SQL: GROUP BY - voorbeeld SELECT Customer, SUM(OrderPrice) FROM Orders GROUP BY Customer resultaat: zonder group by: 23/30 SQL: Projectie Projection operatie op een relationele tabel waarbij kolommen worden geselecteerd, en die samen worden opgeleverd als een nieuwe tabel. SQL select Name, Age from Employee N.B. projectie gaat meestal samen met selectie 24/30 DMO 2007 8
SQL: Join Join is een zijdelingse verbinding van tabellen, waarbij eveneens een nieuwe tabel ontstaat Combineren van data uit verschillende tabellen onderling verbonden door PK-FK dezelfde tabel: self-referencing self-join Speciale joins als bij een 1:N-relatie aan de N-kant records ontbreken inner / outer join 1:N 25/30 SQL: Inner join Alleen matching records worden opgeleverd in de nieuwe tabel Als =-operator wordt gebruikt: equi-join SQL select T1.*, T2.Product from T1, T2 where T1.ID = T2.Cid of vanaf SQL92: select T1.*, T2.Product from T1 join T2 on T1.ID = T2.Cid (mag ook nog een where-clause hebben) 26/30 SQL: Outer join Alle records (van de linker en/of rechter tabel) worden opgeleverd in de nieuwe tabel NULL-waarden waar matching niet mogelijk is left outer join right outer join full outer join SQL select T1.*, T2.Product from T1 left join T2 on T1.ID = T2.Cid 27/30 DMO 2007 9
SQL: Union - 1 Union is een kop-staart verbinding van tabellen, waarbij eveneens een nieuwe tabel ontstaat Union combineert de resultaten van twee select-queries, waarbij duplicaat-records automatisch worden verwijderd (tenzij union all wordt gebruikt) Tabellen moeten wel overeenkomen in datastructuur! 28/30 SQL: Union - 2 union union all Gegeven tabel T1 en tabel T2 Gevraagd de totale verzameling T1 plus T2 SQL select * from T1 union select * from T2 order by Name select * from T1 union all select * from T2 order by Name 29/30 Vragen? 30/30 DMO 2007 10