530 likes | 739 Views
<Mdl01 hoorcollege 1>. Docent: Martijn Hengelmolen Email: Hengelmolen@initworks.com Aanwezig: maandag, dinsdag. Inhoud Hoorcollege 1. Waarom modelleren 1 Voorbeeld tekstueel ontwerp Opdracht. Voorbeeld model. Rechtopstaande holle cilinder. Voorbeeld model. Rechtopstaande holle cilinder
E N D
<Mdl01 hoorcollege 1> Docent: Martijn Hengelmolen Email: Hengelmolen@initworks.com Aanwezig: maandag, dinsdag
Inhoud Hoorcollege 1 • Waarom modelleren 1 • Voorbeeld tekstueel ontwerp • Opdracht
Voorbeeld model • Rechtopstaande holle cilinder
Voorbeeld model • Rechtopstaande holle cilinder • Onderkant is gesloten
Voorbeeld model • Rechtopstaande holle cilinder • Onderkant is gesloten • Aan de zijkant zit een driekwart ovaal • Ovaal is kleiner dan cilinder • Kleur is wit
Voorbeeld model • Een mok, waterkoker? Thermoskan? • Vraag: is dit eenduidig?
Opdracht • Verzin een voorwerp • Beschrijf dit voorwerp • Geef tekstuele beschrijving aan mede student.
SELECT basisbegrippenhoofdstuk 5 [van der Lans] • datatypen (num, alfanum, datum/tijd) • systeemvariabelen (USER, TODAY) • expressies (o.a. CASE) • scalaire vs. set functies: • scalaire functies: input is 1 rij • set functies: input is verzameling rijen • casting
SELECT instructie:definitie <select-instructie>::= <select-component> <from-component> [<where-component>] [<group-by-component>] [<having-component>] [<order-by-component>]
SELECT instructie:voorbeeld SELECT PNAAM, LEEFTIJD [kolom(men)] FROM PATIENT [tabel(len)] WHERE LEEFTIJD > 50; [voorwaarde voor rij]
a b SELECT instructie:volgorde van uitvoeren (intern) SELECT [kolommen] [3] FROM [tabellen] [1] WHERE [voorwaarde voor rij] [2] ORDER BY [kolom] [4] 1. FROM 2. WHERE 3. SELECT 4. ORDER BY
1. FROMA 2. WHERE KLEUR=‘Blauw’ 3. SELECT ANO, ANAAM 4. ORDER BY ANAAM SELECT instructie:volgorde (voorbeeld) SELECT ANO, ANAAM FROM A WHERE KLEUR=‘Blauw’ ORDER BY ANAAM
SELECT instructie:FROM component (definitie) <from-component> ::=FROM <tabelref> [{,<tabelref>}...] <tabelref> ::=<tabelspec> [[AS] <alias>] <tabelspec> ::=[<user>.] tabelnaam
SELECT instructie:FROM component (voorbeeld) SELECT teamnr, naamFROM teams AS t, spelers AS sWHERE t.spelersnr = s.spelersnr Dit is een voorbeeld van een natural join
Natural join in stapjes:1. FROM - input SELECT .... FROM teams AS t, spelers AS s
Natural join in stapjes:2. FROM - resultaat SELECT ... FROM teams AS t, spelers AS s
Natural join in stapjes:3. WHERE - input WHERE t.spelersnr = s.spelersnr;
Natural join in stapjes:4. WHERE - resultaat SELECT ... FROM teams AS t, spelers AS s WHERE t.spelersnr = s.spelersnr;
Natural join in stapjes:5. SELECT - resultaat SELECT teamnr, naam as aanvoerder FROM teams AS t, spelers AS s WHERE t.spelersnr = s.spelersnr;
SELECT instructie:WHERE (pseudo-code) WHERE-resultaat := [ ]; for each ROW in FROM-resultaat doif conditie=waar thenWHERE-resultaat :+ ROW; endfor;
SELECT instructie:WHERE (operatoren etc) • vergelijking: = < > <= >= <> • AND, OR, NOT • BETWEEN, IN, LIKE, NULL • IN met subquery • vergelijkingsoperator met subquery • ANY, ALL • EXISTS
SELECT instructie:WHERE (voorbeelden) • WHEREGEB_DATUM > ‘1970-12-31’ ANDNOT NAAM = ‘Haas’; • WHERE GEB_DATUM BETWEEN ‘1960-1-1’ AND ‘1970-1-1’; • WHERE NAAM IN (‘Smit’,’Jansen’,’Zwart’);
SELECT instructie:WHERE (IN met subquery) • SELECT naam AS aanvoerderFROM spelersWHERE spelersnr IN (SELECT spelersnr FROM teams);
SELECT instructie:WHERE (EXISTS) • SELECT naam AS aanvoerderFROM spelersWHERE EXISTS(SELECT * FROM teams WHERE spelersnr=spelers.spelersnr);
SELECT instructie:WHERE (ALL) • SELECT naam+’ is het oudst’ AS oudste, geb_datumFROM spelersWHERE geb_datum <= ALL(SELECT geb_datum FROM spelers);
SELECT instructie:GROUP BY, HAVING • volgend hoorcollege: • SET functies (COUNT, SUM, MIN, MAX, AVG, STDEV) • GROUP BY, HAVING
Referentiele Integriteit • spelernsnr in beide tabellen moeten gesynchroniseerd blijven foreign key primary key
Referentiele Integriteit :refs aangeven bij CREATE • CREATE TABLE teams(teamnr SMALLINT NOT NULL,spelersnr SMALLINT NOT NULL,divisie CHAR(6) NOT NULL,PRIMARY KEY (teamnr),FOREIGN KEY (spelersnr) REFERENCES spelers (spelersnr));
Referentiele Integriteitrefererende acties • default (SOLID): • ON UPDATE RESTRICT • ON DELETE RESTRICT(dwz wijzigen/verwijderen van een spelersnr in de SPELERS tabel wordt tegengehouden als spelersnr in TEAMS voorkomt)
Referentiele Integriteitrefererende acties • alternatief 1: • ON UPDATE CASCADE • ON DELETE CASCADE(dwz update/delete van een spelersnr in de SPELERS tabel triggert automatischeen update/delete in TEAMS) • alternatief 2: • ON UPDATE SET NULL • ON DELETE SET NULL
Referentiele Integriteitvragen • wat is de beste oplossing voor SPELERS en TEAMS? • ON UPDATE [restrict, cascade, set null] • ON DELETE [restrict, cascade, set null] • wat is de beste oplossing voor SPELERS en BOETES? • ON UPDATE [restrict, cascade, set null] • ON DELETE [restrict, cascade, set null]
Database Ontwerp • Wat is het? • Hoe doe je het? • Voorbeeld • Normaliseren (1NF, 2NF, 3NF, BCNF) • Opdracht
Database ontwerp :Wat is het ? • het bepalen van de tabellen en hun kolommen die nodig zijn om bepaalde gegevens op te slaan (structuur) • logisch ontwerp (niet fysiek) • C. J. Date : ‘database design is still very much of an art, not a science’ • gegevens integriteit
Database ontwerp : Hoe doe je het? • ontwerpmethoden (zie [Kroenke]): • E/R (entity-relationship) • semantisch object model • controle: • normaliseren
Database ontwerp voorbeeld: administratie van uitgeleende boeken (1) • voor wie : • de eigenaar van de boeken • functie : • het geven van een actueel overzicht van alle uitgeleende boeken; bovendien per boek: • aan wie (het boek is uitgeleend) • sinds wanneer (het boek is uitgeleend)
Database ontwerp voorbeeld: administratie van uitgeleende boeken (2) • bedenk eerst hoe je het zonder ge-automatiseerd systeem zou doen! ?
Database ontwerp voorbeeld: administratie van uitgeleende boeken (3) • bedenk eerst hoe je het zonder ge-automatiseerd systeem zou doen! • schrift met 1 regel per uitgeleend boek(auteur, titel, lener_naam, lener_telnr, sinds) • vgl. database met 1 tabel:‘uitgeleende boeken’
Database ontwerp voorbeeld: administratie van uitgeleende boeken (4) • problemen: • wijzigen van telnr op meerdere plaatsen • bij terugbrengen boek ook telnr weg • hoe komt dit ? • afhankelijkheid : lener_naam -> lener_telnr • lener_naam is een determinant van lener_telnr
Database ontwerp voorbeeld: administratie van uitgeleende boeken (5) • oplossing: 2 tabellen • schrift met uitgeleende boeken • adresboekje (of GSM telefoon): naam + telnr
Normalisatie: 1NF (first normal form) • Definitie 1NF:Een tabel is in 1NF als voor elke waarde van die tabel elke rij precies 1 waarde voor elke attribuut heeftvoorbeeld: in de tabel leners heeft elke rij 1 naam en 1 telnr
Normalisatie: 2NF • Definitie 2NF:(aanname: er is slechts 1 kandidaat sleutel die de primaire sleutel is)Een tabel is in 2NF als deze in 1NF is, en elk niet-sleutel attribuut (op de een of andere manier) afhankelijk is van de primaire sleutel
Normalisatie: 2NF PK PK
Normalisatie: 3NF • Definitie 3NF:(aanname: er is slechts 1 kandidaat sleutel die de primaire sleutel is)Een tabel is in 3NF als deze in 2NF is, en elk niet-sleutel attribuut niet-transitief afhankelijk is van de primaire sleutel
Normalisatie: 3NF PK 2NF 3NF
Normalisatie: BCNF (Boyce/Codd Normal Form) • (informele) definitie:een tabel is in BCNF als de enige determinanten kandidaat-sleutels zijn(dwz alle afhankelijkheidspijlen beginnen bij kandidaat-sleutels)
Normalisatie:conclusie • Wat zijn we eigenlijk aan het doen? • Normalisatie is een kwestie van gezond verstand! • De zojuist besproken methoden zijn ‘geformaliseerd’ gezond verstand! • Met wat ervaring weet je intuïtief wanneer tabellen BCNF zijn
Opdracht (5 minuten) • Breng in BCNF: