Analyse 3 INFANL01-3 week 3 CMI Informatica
Analyse 3- INFANL01-3 Vorige les Kardinaliteit vs optionaliteit Speciale Relatietypen (meer op meer, transitie, xor) Subtypen van entiteiten Informatie uit een tabel: Projectie, Selectie, datatypen, operatoren, ordening Inleiding in SQL (DDL, DML, DCL, DTL) CRUD CREATE, INSERT en SELECT statements
Vorige les
Normaliseren Waarvoor is het toepassen van normaliseren nuttig? Welke normaalvormen zijn vorige les behandeld? Een update-anomalie is een fout die optreedt bij een afwijking van de 'standaard werkwijze' bij het vernieuwen (updaten) van gegevens in een database. Dit fenomeen treedt op door weinig (lees: onvoldoende) normalisatie. Naast de overkoepelende term update-anomalie worden ook de specifiekere termen invoeg-anomalie en verwijder-anomalie gebruikt voor anomalieën die zich voordoen specifiek bij het invoegen en verwijderen van gegevens. Sporadisch wordt in het Nederlands de term modificatie-anomalie gebruikt. In een genormaliseerd gegevensmodel kunnen de gegevens van één entiteit met één simpele opdracht worden opgeslagen. Soms wordt om technische of praktische redenen een ontwerp gekozen waarbij het invoegen, verwijderen of veranderen van gegevens meer actie vergt om alle gegevens consistent te houden. Een dergelijk model noemt men gedenormaliseerd, het heeft een of meer update-anomalieën.
Relationele databases
Wat is een relationele database (RDBMS)? Een RDBMS is een systeem : met gegevens in de vorm van tabellen het verband tussen twee tabellen(entiteiten) wordt relatie genoemd waarin SQL wordt gebruikt om tabellen te manipuleren en op te vragen Merk op dat je met SQL met hele tabellen (verzamelingen van rijen) tegelijk werkt! Dus niet met rijen zoals in een programmeertaal als Java for (int row=0;row<table.length;row++) System.out.println(table[row].getSNAAM()); Een for loop zal je in SQL dan ook niet tegenkomen! Bovendien vertel je de database mbv SQL WAT je wilt, niet HOE dat moet gebeuren (SQL is declaratief itt procedureel (Java,C,Pascal,..). SQL
verbindt twee entiteiten of een entiteit met zich zelf Relaties modeleren • Een relatie geeft weer hoe een verband is gelegd tussen twee entiteiten(tabellen) verbindt twee entiteiten of een entiteit met zich zelf is bi-directioneel heeft een naam heeft optionaliteit heeft kardinaliteit
Een relatie kan verplicht of optioneel zijn Optionaliteit Een relatie kan verplicht of optioneel zijn Elke medewerker moet op een afdeling werken Elke student kan zich inschrijven voor een cursus Welke relatie is optioneel/verplicht en hoe kun je de optionaliteit modeleren in Barker notatie en UML? Elke medewerker moet op een afdeling werken Elke student kan zich inschrijven voor een cursus
Optionaliteit modeleren Een relatie kan verplicht of optioneel zijn Elke medewerker moet op een afdeling werken Elke student kan zich inschrijven voor een cursus Welke relatie is optioneel/verplicht en hoe kun je de optionaliteit modeleren in Barker notatie en UML? Barker Notatie UML optioneel verplicht
Kardinaliteit Kardinaliteit bij een relatie geeft aan of de relatie eenvoudig of meervoudig is. Het is niet altijd mogelijk de hoeveelheid van te voren te bepalen. Elke student kan zich alleen voor een cursus inschrijven Elke klant kan meerdere tickets bestellen Welke kardinaliteit hebben deze relaties? Hoe kun je de kardinaliteit modeleren in Barker notatie en UML?
Kardinaliteit modeleren
Speciale relaties: meer-op-meer Een meer-op-meer (M:N) relatie is lastig in een fysiek model te implementeren. Het wordt geadviseerd om het te vervangen door twee een-op-meer relaties.
Voorbeeld meer-op-meer relatie Het streepje op de relatie wordt bared-relation genoemd in Barker notatie. Het betekend dat de primary-key van viewing record entieit een composite-key is. Het bestaat uit de primary key van tv show en person
Oplossen N:M Zie dat de harkjes omkeren en dat de relatie een nieuwe entiteit wordt. Ook de optionaliteit veranderd.
Los nu zelf op
Speciale relaties: transitie van een relatie (transferability) In sommige situaties kun je een relatie achteraf niet wijzigen. Er is dan sprake van “non-tranferable relationship” Voorbeeld: een persoon die zijn rijbewijs heeft gehaald. Kan een persoon zijn rijbewijs overdragen naar een andere persoon? Hoe kun dit modeleren? Hoe kun je dit implementeren in je database? Niet alle notaties kunnen non-transferable relatie weegeven. In Barker notatie kan het door een diamond op de relatie gemoderleerd worden. In het fysieke model kan het niet direct implementeerd worden. Er zijn extra stappen nodig buiten de database om dit te waarborgen.
Voorbeeld transitie van een relatie (transferability)
Speciale relaties: XOR (mutually exclusive relationships ) Een entiteit kan relaties hebben met andere entiteiten. In sommige situaties kan maar een relatie mogelijk zijn. Voorbeeld: een medewerker verdient zijn geld op uur-basis of krijgt een salaris per maand
Voorbeeld XOR in Barker notatie Hoe kun je XOR relatie implementeren in het fysieke model? Bij een XOR-relatie moeten de foreign-key optioneel blijven. In dit geval heeft membership twee foreign keys die optioneel zijn.
Oefening meer-op-meer en XOR Oefening 1: hoe kun je deze meer-op-meer relatie oplossen in twee een-meer-relaties? Oefening 2: Een ticket van een concert kan besteld worden door een agent, een ticketbureau of via het internet. Een ticket heeft een beschrijving. Een event heeft een datum en een prijs. Een agent heeft een naam en een telefoonnummer. Een ticketbureau heeft een adres en een telefoonnummer. Voor internet bestellingen wordt de URL opgeslagen. Teken alle entiteiten en de relaties daartussen in een ERD!
Supertypen en subtypen Wat is het supertype? Wat is het subtype? Hoe kun je dit implementeren in een fysiek model? De entiteit EXAM is een supertype en heeft alle attributen die alle subtypen moeten hebben. Alle afwijkende attributen moet dan afzonderlijk genoemd worden bij de subtypen. Suptypen kun je op twee manieren in fysieke model implementeren: met een tabel waar je alle afwijkende attributen optioneel maakt, of elk subtype wordt in een aparte tabel geimplementeerd. De gezamelijke attributen worden dan in elk tabelschema opgenommen.
Voorbeeld Er is een fiets. Fietsen bestaan uit een frame, een zadel, wielen, een stuur en overige onderdelen. Van een dames frame wordt bewaard, wat de maximale instaphoogte is. Bij een heren frame wordt bewaard of er een bidonhouder geïntegreerd is. VRAAG: Wat is een ‘normale entiteit’, wat is een supertype, wat is een subtype?
Structured Query Language (SQL) De kracht van SQL, het manipuleren van hele gegevenssets (tabellen) i.p.v. Per regel zoals in java. Merk op dat je met SQL met hele tabellen (verzamelingen van rijen) tegelijk werkt! Dus niet met rijen zoals in een programmeertaal als Java for (int row=0;row<table.length;row++) System.out.println(table[row].getSNAAM()); Een for loop zal je in SQL dan ook niet tegenkomen! Bovendien vertel je de database mbv SQL WAT je wilt, niet HOE dat moet gebeuren (SQL is declaratief itt procedureel (Java,C,Pascal,..). Structured Query Language (SQL)
Wat is SQL (1)? SQL (Structured Query Language): is een zeer krachtige taal met een beperkt vocabulaire (aantal ‘woorden’) is declaratief (‘WAT’ niet ‘HOE’ !!!) werkt met verzamelingen (Engels:’set’) input : tabel(len) -> output (tabel) heeft een hoger abstractieniveau dan 3GL zoals Java,C,... Hoger abstractieniveau : dit is echt vooruitgang! Waarschijnlijk zijn SQL databases de belangrijkste ontwikkeling van de laatste 30 jaar! Je zou heel veel regels code (meestal met fouten.....) moeten schrijven om hetzelfde resultaat te krijgen als 1 regel SQL !!!
Wat is SQL (2)? er zijn 4 soorten classificaties voor SQL queries: DDL (data definition language) bijv. CREATE TABLE .... DML (data manipulation language) bijv. SELECT / INSERT / UPDATE DCL (data control language) bijv. GRANT USER TCL (tranaction control language) bijv. COMMIT DDL: definieer ‘variabelen’ (maar ook DROP table etc) DML: werk met de waarde van variabelen (SELECT, UPDATE, INSERT) DCL: toegangscontrole (wie mag wat) CREATE USER paul IDENTIFIED by luap
SQL DDL: Definitie van de database structuur definieer : tabellen, kolommen + domein, sleutels met SQL (DDL), bijv : CREATE TABLE patient( PAT# smallint not null, PNAAM char(32), LEEFTIJD smallint, GESLACHT char(1), ARTS char(32), primary key (PAT#)); domein = datatype user-defined domain? anders mbv domein constraint CHECK
Aan de slag - mini case broodjeszaak De broodjeszaak op de hoek heeft verschillende broodjes. Elk broodje heeft een recept. In het recept kun je lezen welke ingrediënten er op een broodje zitten en welk broodje er voor nodig hebt. De broodjeszaak wil bijhouden hoeveel, van welk broodje de medewerkers verkopen. De medewerkers houden bij welke ingrediënten ze gebruiken.
Voorbeeld gegevens (1) ID Naam B Bruine pistolet C Ciabatta W Witte pistolet WA Waldkornbol BW Boterham wit BB Boterham bruin ID NaamBeleg H Ham K Kaas S Spek E Ei R Rosbief F Fricandeau Hamburger V Vegaburger B Brie Saté C Cervelaat Z Zalmsalade O Omelet P_nr Voornaam Achternaam 111 Jan Klaasen 112 Hans Jansen 113 Piet Paaltjes 115 Irma Doorn 117 Kenna Baas NR Ingredient 1 Sla 2 Zout 3 Peper 4 Mayo 5 Cedarkaas 6 Hamburgersaus 7 Vegaburgersaus 8 Huissaus 9 Augurk 10 Kruiden Datum Medewerker Broodje Beleg
Voorbeeld gegevens (2) Naam broodje Broodje Ingredient 1 Ingredient 2 Gezond C Ham Kaas Ei Sla Tomaat Tosti wit BW Tosti bruin BB B W Rosbief WA Zout Peper Hamburger Hamburgersaus Vegaburger Augurk Vegaburgersaus Brie Saté Sate Gebakken uitjes Cervelaat Zalmsalade Omelet Melk Kruiden Spek en Ei Spek Boter Huis special Cedarkaas Huissaus
Broodjeszaak – eerst zelf in 2-tallen Welke gegevensstructuur zou handig zijn? Hoe ga je met SQL de gekozen structuur maken?
Domein (Datatypen) Voorbeelden: CHAR (n), VARCHAR (n) INTEGER, SMALLINT, TINYINT DATE, TIME, TIMESTAMP (user defined types)
null : onbepaald, niet gespecificeerd heeft niets te maken met 0 null waarden kun je niet vergelijken
Projectie (SELECT) en selectie (WHERE)
Vullen van de database importeren (in MySQL bijv. als tab delimited tekstfile) tekst-file met INSERT statements met de hand (command-line) INSERT INTO student VALUES(‘S1’,’Janssen’,’O1’); INSERT INTO student VALUES(‘S2’,’Lopes’,’O1’); INSERT INTO student VALUES(‘S3’,’Smit’,’O3’); INSERT INTO student VALUES(‘S4’,’Meijer’,’O2’); Voorbeeld conversie: save Excel file als tab-delimited en importeer; of Java programmaatje, schrijf naar tekstfile. Bij evt laten zien van voorbeeld: zorg dat domain constraints fouten afvangen! ADVIEZEN: - maak constraints zo STRENG mogelijk (geslacht= [M|V] niet char(1), of smallint met 0=M en 1=V) - STRENG is niet hetzelfde als ZUINIG (Y2000) ! - met een goed database-ontwerp (constraints, maar ook vooral de structuur - welke tabellen met welke kolommen) kan je het overgrote deel van de vervuiling voorkomen.
Manipuleren van gegevens de inhoud (verzameling rijen) van een tabel wordt gemanipuleerd/getoond met SQL (DML), bijv.: INSERT INTO patient VALUES (23, ’Jansen’, 32, ’M’, ’Oei’); SELECT * FROM patient WHERE leeftijd>30; UPDATE patient SET leeftijd= 33 WHERE id = 2 DELETE FROM patient WHERE id = 2
Vul de database van de broodjeszaak Zie excel op n@tschool Maak zelf verkoopgegevens en vul deze tabel ook.
Relationele algebra
Relationele Algebra: vereniging (UNION) SELECT * FROM verz UNION SELECT * FROM wegb voorwaarde: aantal en domein v/d attributen komt overeen Selecteer alle soldaatjes uit de groene verzameling en alle soldaatjes uit de beige verzameling en orden ze op soort wapen.
Relationele Algebra: verschil (EXCEPT) SELECT * FROM verz EXCEPT SELECT * FROM wegb volgorde is van belang ! (verz - wegb) <> (wegb-verz) Voorbeeld van de soldaatjes: Selecteer alle groene soldaatjes, behalve de groene soldaatjes waarvan een zelfde type in de groep beige soldaatjes zit.
Relationele Algebra: doorsnede (INTERSECT) SELECT * FROM verz INTERSECT SELECT * FROM wegb Haal uit de verzameling groene soldaatjes alle soldaatjes die hetzelfde wapen hebben als in de verzameling beige soldaatjes.
Relationele Algebra: projectie (SELECT) SELECT kenteken FROM verz Selecteer de soldaatjes met een bazooka
Relationele Algebra: selectie (SELECT ... WHERE ..) SELECT * FROM verz WHERE naam = ‘jan’ selectie van rijen die aan voorwaarde voldoen Selecteer alle soldaatjes waarvoor geldt dat ze een pet hebben.
Relationele Algebra: product of JOIN SELECT * FROM man, vrouw alle mogelijke combinaties! Selecteer alle soldaatjes van groen, en combineer elk groene soldaatje met alle soldaatjes van beige. Schrijf deze match op. Doe dit voor elk groen soldaatje.
Manipuleren van gegevens Nogmaals : met SQL DML manipuleer je complete tabellen als verzamelingen!!! (dus NIET de individuele rijen) voor ELKE bewerking geldt: input : 1 of meer tabellen output : 1 tabel Dit is de formele basis van SQL Dus voor alle soldaatjes, of voor alle groene soldaatjes.
Hoeveel recepten zijn er? Oefening Hoeveel recepten zijn er? Zijn er recepten met meer dan 3 ingrediënten? Hoeveel recepten bevatten sla? Hoeveel broodjes zijn door medewerker Irma verkocht?