Database-ontwerp op basis van een SQL-database HA-1611-01 Boekhouden-informatica, Informaticabeheer Marc De Wandel, Ria Van Eysendeyk Werkgroep Handel 2009 Vlaams Verbond van het Katholiek Secundair Onderwijs Guimardstraat 1, 1040 Brussel Vlaams Verbond van het Katholiek Secundair Onderwijs Guimardstraat 1, 1040 Brussel Database-ontwerp op basis van een SQL-database HA-1611-01 Boekhouden-informatica, Informaticabeheer Marc De Wandel, Ria Van Eysendeyk Werkgroep Handel 2009 http://handel.vvkso.net D/2009/7841/067 Alle rechten voorbehouden. Behoudens de uitdrukkelijk bij wet bepaalde uitzonderingen mag niets uit deze uitgave worden verveelvoudigd, opgeslagen in een geautomatiseerd gegevensbestand of openbaar gemaakt, op welke wijze ook, zonder de uitdrukkelijke voorafgaande en schriftelijke toestemming van het VVKSO. Inhoud 1 Werken met data ..................................................................................................... 7 1.1 1.2 1.3 1.4 1.5 Databases ................................................................................................................. 7 Databasesystemen ................................................................................................... 7 Stappen bij het ontwerpen van een database .......................................................... 8 Datamodel................................................................................................................. 9 De data dictionary ................................................................................................... 10 2 Het Entiteit-Relatie model .................................................................................... 11 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 Entiteiten ................................................................................................................. 11 Relatie ..................................................................................................................... 11 Cardinaliteit ............................................................................................................. 12 Optionaliteit ............................................................................................................. 14 Attributen................................................................................................................. 14 Voorbeelden............................................................................................................ 16 Uitgewerkt voorbeeld .............................................................................................. 18 Oefeningen ............................................................................................................. 21 3 Een relationele databank ..................................................................................... 23 3.1 3.2 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.12.1 3.12.2 3.12.3 3.12.4 3.12.5 3.12.6 3.12.7 3.13 Tabellen .................................................................................................................. 23 Sleutels ................................................................................................................... 23 Primaire sleutel ....................................................................................................... 23 Kandidaatsleutel ..................................................................................................... 24 Alternatieve sleutel ................................................................................................. 24 Surrogaatsleutel ...................................................................................................... 24 Refererende sleutel ................................................................................................ 24 Namen van velden .................................................................................................. 25 Koppelingen tussen tabellen................................................................................... 25 Het normalisatieproces ........................................................................................... 26 Normalisatievormen ................................................................................................ 27 Niet genormaliseerde gegevensgroepen................................................................ 27 Repeterende groepen: NF1 .................................................................................... 28 Partiële functionele afhankelijkheid: NF2 ............................................................... 33 Transitieve functionele afhankelijkheid: NF3 .......................................................... 35 Overzicht ................................................................................................................. 37 Voorbeelden............................................................................................................ 38 Oefening 1: facturatie ............................................................................................. 38 Oefening 2: artikelfiche ........................................................................................... 40 Oefening 3: abonnementen .................................................................................... 41 Oefening 4: stages .................................................................................................. 41 Oefening 5: projecten ............................................................................................. 42 Oefening 6: cursussen ............................................................................................ 42 Oefening 7: computerpark ...................................................................................... 43 Oefeningen ............................................................................................................. 45 4 Omzetting datamodel (ERD) naar databaseontwerp (tabellen)........................ 46 4.1 4.1.1 4.2 4.2.1 4.2.2 4.2.3 4.2.4 4.3 4.3.1 4.3.2 4.3.3 4.3.4 Entiteiten ................................................................................................................. 46 Zelfstandige entiteiten ............................................................................................. 46 Relaties zonder attributen ....................................................................................... 46 Optionaliteit ............................................................................................................. 46 Één-op-één relatie .................................................................................................. 46 Eén-op-veel relatie .................................................................................................. 47 Veel-op-veel relatie ................................................................................................. 48 Relaties met attributen ............................................................................................ 48 Eén-op-één relatie .................................................................................................. 48 Eén-op-veel relatie .................................................................................................. 49 Veel-op-veel relatie ................................................................................................. 49 Overzicht ................................................................................................................. 50 4.4 4.5 Uitgewerkt voorbeeld .............................................................................................. 51 Oefeningen .............................................................................................................. 54 5 Een database implementeren .............................................................................. 55 5.1 5.2 5.3 5.4 5.4.1 5.5 5.6 5.7 5.7.1 5.7.2 5.8 5.8.1 5.8.2 5.9 Een SQL-databank aanspreken in Visual Web Developer ..................................... 55 Een SQL-databank aanmaken in VWD Express 2008 ........................................... 57 Relaties tussen tabellen .......................................................................................... 59 Table designer ........................................................................................................ 60 Diagrammen ............................................................................................................ 62 Check constraints.................................................................................................... 63 Standaardwaarden .................................................................................................. 64 Indexen.................................................................................................................... 65 Inleiding ................................................................................................................... 65 Een index aanmaken .............................................................................................. 65 Tabelaanpassingen ................................................................................................. 66 Rijen aanpassen ..................................................................................................... 66 Primaire sleutel ....................................................................................................... 66 Oefeningen .............................................................................................................. 66 6 Speciale technieken .............................................................................................. 67 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.2 6.2.1 6.2.2 Join-eigenschappen ................................................................................................ 67 Een tabel koppelen met zichzelf ............................................................................. 67 Verbinding op meer dan 1 veld ............................................................................... 67 Meer dan 2 tabellen gebruiken ............................................................................... 68 Oefeningen .............................................................................................................. 69 Niet-genormaliseerde gegevensgroepen normaliseren .......................................... 71 Gegevens worden in rijen herhaald ........................................................................ 71 Gegevens worden in kolommen herhaald .............................................................. 74 7 Bijlagen .................................................................................................................. 75 7.1 7.2 7.2.1 7.2.2 7.3 Bijlage 1. Een bestaande Access-databank converteren naar een SQL-databank 75 Bijlage 2. Korte samenvatting van Sql-commando’s .............................................. 79 Selectiequery’s ........................................................................................................ 79 Actiequeries ............................................................................................................ 80 Bijlage 3. Lijst met belangrijkste types .................................................................... 81 1 Werken met data • • • • 1.1 Het begrip database Soorten database managementsystemen Het begrip datamodel Datadictionary Databases Wat is een database? Meestal speelt het voor langere tijd bewaren van gegevens een belangrijke rol in informatiesystemen. Denk bijvoorbeeld aan de loonadministratie in een bedrijf. Welke gegevens moeten hiervoor onder andere bijgehouden worden? Als deze gegevens op een gestructureerde, digitale manier bijgehouden worden, is het mogelijk de verwerking van die gegevens, bijvoorbeeld tot jaarlijkse loonfiches voor alle werknemers, te automatiseren. Dat bespaart hopen werk! Keerzijde van de medaille: een degelijke structuur opbouwen om de gegevens te bewaren, kost soms de spreekwoordelijke bloed, zweet en tranen. Het is gedeeltelijk een wetenschap en gedeeltelijk een kunst. Het wetenschappelijke deel is het onderwerp van de volgende hoofdstukken: je leert hoe je, door het gebruik van bepaalde technieken, tot een werkbare structuur komt. Zo'n gestructureerde digitaal bewaarde verzameling gegevens, opgezet om in een bepaalde informatiebehoefte te voorzien, wordt een database of gegevensbank genoemd. Wat is data? Algemeen wordt een onderscheid gemaakt tussen data en informatie. Data (of gegevens): ruwe feiten of observaties met betrekking tot fysieke fenomenen (bv. een klant) en bedrijfstransacties (bv. een verkoop). Data zijn objectieve meetwaarden van de karakteristieken van ‘entiteiten’ (mensen, plaatsen en gebeurtenissen). Informatie: data in een betekenisvolle en nuttige context voor specifieke eindgebruikers. Informatie is het resultaat van een value-added process (d.i. data processing). 1.2 Databasesystemen Een databasesysteem is een verzameling van elementen waarmee we een database kunnen exploiteren (Vandenbulcke et al. p. 19). In een database worden gegevens digitaal bijgehouden. Je hebt dus software nodig om de gegevens in te brengen en te beheren. De software die het werken met een database mogelijk maakt is het database managementsysteem (DBMS). Het databasemanagement is een onderdeel van een databasesysteem. Het geheel van database en DBMS is dan het databasesysteem (DBS). Relationele gegevensbanken vormen thans het meest verspreide systeem voor het beheer van persistente (te bewaren) gegevens. Andere, oudere vormen van gegevensbeheer zijn onder meer: hiërarchische databases en netwerkdatabases. Een recente ontwikkeling is de opkomst van objectgeoriënteerde databases, ook wel object bases genoemd. Momenteel werken naar schatting wereldwijd 80 % van de databases relationeel. In 1970 legde Edgard F. CODD de basis voor het relationele gegevensmodel. VVKSO Werkgroep Handel Database-ontwerp - pagina 7 Ze zijn gebaseerd op het Relationeel model (hierover later meer). In een RDBMS of Relationele Database Managementsystemen worden gegevens typisch bijgehouden in tabellen (rijen en kolommen). RDBMSen zijn zeer geschikt voor applicaties met eenvoudige data en uitgebreide bevragingsmogelijkheden, de typische administratieve applicaties. Enkel eenvoudige datatypes (numeriek, tekst …) kunnen bijgehouden worden. Een gebruiker kan zelf geen datatypes toevoegen. Een grote troef voor RDBMSen is dat ze allen bevraagd kunnen worden met een standaardtaal: SQL (Structured Query Language). MS-Access, Oracle, MySql en Microsoft SQL Server, zijn voorbeelden van RDBMS-en. In de cursus wordt gebruik gemaakt van Sql-databases. In een relationeel databanksysteem worden gegevens bijgehouden in tabellen (Engels Æ relations) waartussen relaties (Engels Æ relationships) kunnen liggen. Die relaties verbinden de gegevens in de verschillende tabellen. De tabellen bestaan uit rijen (records of tupels) en kolommen (velden). In elke rij staan de gegevens van één item, bijvoorbeeld een product. Elk kenmerk komt overeen met een kolom, bijvoorbeeld de productnaam. De grote vraag bij het opmaken van een database voor zo’n relationeel systeem is natuurlijk: welke tabellen heb ik nodig en wat is hun inhoud? 1.3 Stappen bij het ontwerpen van een database Personen die betrokken zijn bij het ontwerp van een database zijn: database ontwerpers, database administrators (verantwoordelijk voor het onderhoud van en de aanpassingen aan databasessystemen) en eindgebruikers. Het motto voor het ontwerpen van een database is zeker: 'Bezint voor je begint'. Een slecht ontworpen database kan een firma letterlijk duur te staan komen. Databaseontwerpers - voor grote databases is dit teamwerk- worden goed betaald. Maar voor wat, hoort wat natuurlijk! De verantwoordelijkheid is groot en de job niet altijd even gemakkelijk. Het ontwerp van een database verloopt in verschillende stappen die hieronder schematisch weergegeven worden. Pagina 8 Database-ontwerp Analyse van de informatiebehoefte Bepalen van het domein. Benoemen van de entiteiten Opstellen en documenteren van het datamodel Keuze van het DBMS Opstellen, invoeren en documenteren van het dataontwerp Invoer data Aan de hand van de analyse van de informatiebehoefte kan een datamodel (zie verder) opgesteld worden. Als dit gebeurd is, kan de structuur bepaald worden waarin de gegevens zullen bewaard worden: het DBMS waarin gewerkt wordt, wordt gekozen. Het datamodel moet vertaald worden naar een dataontwerp (dataschema) dat kan ingevoerd worden in het DBMS. Als het dataontwerp geïmplementeerd is, kunnen uiteindelijk de data ingevoerd worden. 1.4 Datamodel Wat is een model? Een model is een abstracte voorstelling van (een deel van) de reële wereld. Dit wil zeggen dat de maker van een model bepaalde essentiële kenmerken van de realiteit isoleert, en alle andere kenmerken als bijkomstig achterwege laat. Een gegevensmodel of datamodel is een abstracte voorstelling van een informatiesysteem, waarbij alle dynamische aspecten (generatie, transformatie en verwerking van gegevens) achterwege blijven en slechts de statische informatiestructuren, hun beperkingen en hun onderlinge verbanden van belang zijn. Een datamodel gaat over de structuur van gegevens, niet over de inhoudelijke opvulling. Een gegevensmodel kan specifiëren dat een bedrijf de namen en adressen van zijn werknemers opslaat. Het zegt niet dat er een werknemer bestaat met de naam Peeters en evenmin dat de namen en adressen worden verkregen via de personeelsdienst. Het kan wel bepalen dat ieder adres een postnummer moet bevatten. Een procesmodel brengt de dynamische aspecten in beeld. Een gegevensstroomdiagram (Data Flow Diagram, DFD) is hiervan een voorbeeld. Het toont op een visuele manier waar de data gegeneerd en verwerkt worden en waarheen ze getransporteerd worden. Een gegevensmodel wordt gebruikt voor het structureren van een database terwijl een gegevensstroomschema eerder gebruikt wordt voor het programmeren. VVKSO Werkgroep Handel Database-ontwerp - pagina 9 Waarom modelleren? Een gegevensmodel moet een duidelijke, éénduidige voorstelling geven van de gegevens en hun onderlinge verbanden. Het moet voldoende visueel zijn zodat het kan dienen als communicatiemiddel tussen de verschillende belanghebbenden van het informatiesysteem: - ontwerpers; analisten; gebruikers; beheerders; ... Pas als alle betrokken partijen het eens zijn over het model, kan er verder ontwikkeld worden. Welk model gebruiken? Er worden heel wat verschillende datamodellen gebruikt. Het Entiteit-Relatie (Entity-Relationschip) Model is een van de bekendste traditionele modellen. Er bestaan verschillende 'dialecten' van, ze verschillen hoofdzakelijk in notatie. Een voordeel van het gebruik van een algemeen bekend model is dat de samenwerking tussen de verschillende mensen die betrokken zijn bij het ontwerp, vlot kan verlopen. Geen extra trainingen nodig: iedereen kan het model interpreteren en er zijn/haar zegje over hebben. In het volgende hoofdstuk maak je kennis met een vereenvoudigde vorm van het Entiteit-Relatie Model. 1.5 De data dictionary Een datadictionary is een database waarin gegevens over een databasesysteem worden opgeslagen. Het is dus een gereserveerde ruimte in een database die wordt gebruikt om informatie op te slaan over de database zelf. Hij bevat dus gegevens over gegevens, die nuttig kunnen zijn bij het werken met een database. Onder andere volgende informatie kan steeds verstrekt worden: • • • • welke gegevens zijn er beschikbaar? hoe zijn ze opgeslagen en gedefinieerd? wie mag welke gegevens gebruiken? … Een datadictionary bevordert eenduidigheid in een databasesysteem. Door het gebruik van een datadirectionary verloopt een automatiseringsproces efficiënter. De praktijk wijst op een tijdsbesparing van 10 à 15%. Een datadirectionary kan manueel of geautomatiseerd worden bijgehouden. Er zijn verschillende datadirectionarysystemen op de merkt (bv. Oracle Data Dictionary, DB2, Interbase, SAP R/3 Basic System ABAP Data Dictionary, Microsoft SQL server, …). Pagina 10 Database-ontwerp 2 Het Entiteit-Relatie model • • • • Entiteiten en relaties Cardinaliteit Optionaliteit Attributen In dit hoofdstuk maak je kennis met een datamodel dat zeer geschikt is voor het ontwerpen van een database: het Entiteit-Relatie Model (Entity Relationship Model), afgekort ER-model. Het is in 1976 – in informaticaland héél lang gelden - door P. Chen geïntroduceerd. Sindsdien zijn er verschillende varianten ontwikkeld. In het Entiteit-Relatie model wordt gebruik gemaakt van: - entiteiten; - attributen; - relaties (relationships). 2.1 Entiteiten Een entiteit is een object (een tastbaar iets), een concept, iets dat je kunt identificeren en waarvan je gegevens wilt bijhouden: auto, persoon, magazijn, bankrekening, computer, een lied, ... Een entiteit bestaat uit: - een unieke naam; - een definitie die objectief en ondubbelzinnig aangeeft, welke objecten door de entiteit worden gemodelleerd (en soms even belangrijk: welke niet); - een lijst van attributen (zie verder). Voorbeeld Naam werknemer Definitie een natuurlijke persoon die in loondienst is van de firma; personen die slechts occasioneel voor de firma werken en personen die via een interim-kantoor tewerkgesteld zijn, worden niet als werknemers beschouwd. Attributen naam, adres, telefoonnummer, geboortedatum, datum-in-dienstname, … Voorstelling Een entiteit wordt voorgesteld door een rechthoek. Werknemer 2.2 Relatie Een relatie is een verband tussen twee of meer entiteiten dat model staat voor een overeenkomstige band tussen de reële objecten zoals “een werknemer werkt in een bedrijf”. “Werkt in” is hier de relatie tussen de entiteiten werknemer en bedrijf. Een relatie bestaat dus uit: - een naam, uniek binnen het beschouwde diagram; - een lijst van betrokken entiteiten; VVKSO Werkgroep Handel Database-ontwerp - pagina 11 - een definitie die objectief en ondubbelzinnig aangeeft, in welke omstandigheden precies het veronderstelde verband aan- of afwezig is tussen de gespecificeerde entiteiten; - een lijst van attributen (zie verder). Voorbeeld Naam Werkt in Deelnemende entiteiten werknemer, afdeling Definitie een werknemer werkt in een afdeling als hij verantwoording verschuldigd is aan het hoofd van die afdeling Attributen aantal werkuren Voorstelling Een relatie wordt voorgesteld als een verbindingslijn tussen de betrokken entiteiten. Werknemer Werkt in Afdeling De naam van de relatie kan al dan niet vermeld worden. Het pijltje is hier enkel een hulpmiddel bij het lezen van het diagram van links naar rechts: werknemer werkt in afdeling. Het pijltje kun je tevens in de andere richting tekenen: Werknemer 2.3 Geeft werk aan Afdeling Cardinaliteit De cardinaliteit van een relatie geeft aan, hoeveel instanties van een entiteit maximaal in relatie kunnen staan met één instantie van de andere entiteit. Daarbij zijn de toegelaten waarden: één of veel. Voorbeeld Als je de relatie 'persoon is ondergeschikte van manager' bekijkt, dan geldt waarschijnlijk het volgende: - iedere werknemer heeft (is ondergeschikt aan) hoogstens één manager (één-cardinaliteit): Werknemer - Manager een manager kan veel (ondergeschikte) werknemers hebben (veel-cardinaliteit): Werknemer Pagina 12 Manager Database-ontwerp In een gegevensstructuurdiagram geven we de cardinaliteit aan door een markering van de lijnen (relaties) op de plaats waar ze de rechthoeken (entiteiten) bereiken: - als de instantie van de entiteit uniek is (d.w.z. hoogstens één), plaats je een dwarsstreepje op de lijn vlakbij de entiteit; - als de instantie van de entiteit verscheidene malen kan voorkomen (d.w.z. hoogstens veel), plaats je een kraaienpoot op de lijn tegen de entiteit. Werknemer Manager Voor een relatie tussen twee entiteiten zijn er dus, wat de cardinaliteit betreft, de volgende mogelijkheden: één-op-één, één-op-veel en veel-op-veel. Een één-op-één-relatie wordt ook 1:1 genoteerd, een één-op-veel-relatie 1:n (lees: één op n) en een veel-op-veel-relatie m:n (lees: m op n). Om de cardinaliteit te bepalen, stel je een vraag in de vorm: - kan een werknemer meer dan één manager hebben? - kan een manager meer dan één werknemer hebben? Bij een positief antwoord: cardinaliteit veel, anders één. I.v.m. de cardinaliteit kan je bijgevolg 3 soorten relaties hebben. Voorbeeld: Eén-op-één relatie: Klas Onderwijzer Iedere klas heeft maximaal 1 onderwijzer en iedere onderwijzer heeft maximaal 1 klas. Deze situatie komt veel voor in het lager onderwijs. Eén-op-veel relatie: Klas Onderwijzer Iedere klas heeft maximaal 1 onderwijzer en iedere onderwijzer kan een aantal klassen hebben. Deze situatie komt soms voor in het lager onderwijs als het aantal leerlingen zeer klein is. Veel-op-veel relatie: Klas Leraar Iedere klas kan een aantal leraars hebben en iedere leraar kan een aantal klassen hebben. Dit is de situatie in het secundair onderwijs. VVKSO Werkgroep Handel Database-ontwerp - pagina 13 2.4 Optionaliteit De optionaliteit van een relatie geeft aan, hoeveel instanties van een entiteit minimaal in relatie moeten staan met één instantie van de andere entiteit. Daarbij zijn de toegelaten waarden: nul of één. Voorbeeld Als je in een database de entiteiten ‘ambtenaar' en 'huwelijkscontract' beschouwt, met daartussen de relatie 'handtekent', dan gelden de volgende vaststellingen omtrent de optionaliteit: - een ambtenaar handtekent niet noodzakelijk een huwelijkscontract; - ieder huwelijkscontract moet gehantekend worden door een ambtenaar. In een gegevensstructuurdiagram geven we de optionaliteit aan door het aanbrengen van een symbool op de lijnen (relaties) dicht bij de rechthoeken (entiteiten), naast de tekens voor cardinaliteit: - als de instantie van de entiteit verplicht is (d.w.z. minstens één), plaats je een dwarsstreepje op de lijn; - als de instantie van de desbetreffende entiteit optioneel is (d.w.z. minstens nul), plaats je een cirkeltje op de lijn. handtekent ambtenaar huwelijkscontract Het verplichte karakter van een relatie is een zeer strenge eis. Als een relatie verplicht is, wil dat zeggen dat je geen enkele situatie kunt modelleren waarin de relatie niet voorkomt, zelfs niet tijdelijk. Om de optionaliteit te bepalen, stel je een vraag in de vorm: - moet een ambtenaar minstens één huwelijkscontract ondertekenen? - moet een huwelijkscontract minstens door één ambtenaar ondertekend zijn? Bij een positief antwoord: optionaliteit één, anders nul. Samengevat geeft de cardinaliteit aan hoeveel instanties van een entiteit maximaal bij een instantie van de andere entiteit kunnen horen (maximaal 1 of meerdere), terwijl de optionaliteit het minimum aantal instanties van een entiteit aangeeft die horen bij een instantie van de andere entiteit (0 is mogelijk of altijd minstens 1). 2.5 Attributen Iedere entiteit en relatie is meestal voorzien van een verzameling attributen. Een attribuut is een eigenschap die met de instanties van de entiteit of de relatie geassocieerd wordt. Entiteiten hebben bijna altijd attributen. Relaties kunnen gemakkelijk voorkomen zonder attributen. Zo heeft een werknemer o.a. een voornaam, een familienaam, een woonplaats … • Samengestelde gegevens splitsen Je wenst bijvoorbeeld gegevens op te slaan van personen zodat deze telefonisch of per brief kunnen gecontacteerd worden. Als attributen van de persoon heb je dan nodig: naam, adres en telefoonnummer. Je zou dus kunnen opteren voor drie attributen. Dit is echter niet handig. Als je bijvoorbeeld een adresetiket wilt samenstellen, heb je straat, postnummer en gemeente apart nodig. Pagina 14 Database-ontwerp De gegevens naam, adres en telefoonnummer zijn samengestelde gegevens: naam bevat zowel voor- als familienaam, adres bevat straat, huisnummer, postnummer en gemeente en telefoonnummer bevat zonenummer en eigenlijke nummer. Als je de deelgegevens van een samengesteld gegeven afzonderlijk gebruikt, is het beter ze te beschouwen als afzonderlijke attributen. Zo splits je naam waarschijnlijk best op in de attributen voornaam en familienaam. Adres kan gesplitst worden in straat, postnummer en gemeente. Meestal zal het geen zin hebben om straatnaam en straatnummer afzonderlijk op te splitsen, gewoon omdat ze niet afzonderlijk gebruikt worden. In dit geval mag je het samengesteld attribuut onveranderd laten staan in het ERD. • Procesgegevens Een procesgegeven of berekend gegeven is een gegeven waarvan de waarde bepaald wordt door de waarde van één of meer andere gegevens. In een groothandel worden bijvoorbeeld artikelgegevens bijgehouden, o.a. naam, inkoopprijs, en hoeveelheid in voorraad. Bij het interventariseren wil men, per artikel, de waarde van de voorraad kennen. Je zou hiervoor een attribuut WaardeVoorraad kunnen voorzien waarbij WaardeVoorraad = Inkoopprijs * HoeveelheidInVoorraad. Dit betekent echter dat om de integriteit van de database te behouden bij elke verandering van de voorraad of de inkoopprijs ook de waarde van dit attribuut moet aangepast worden. Daarom worden procesgegevens meestal niet opgenomen in de database. Een ander voorbeeld is het bijhouden van de geboortedatum en de leeftijd van een persoon. De leeftijd van de loper kan immers steeds worden afgeleid uit de geboortedatum. Procesgegevens worden berekend op het moment dat ze nodig zijn (tijdens het proces). Een attribuut bestaat uit de volgende elementen: - een naam, uniek binnen de collectie attributen van dezelfde entiteit of relatie; - een entiteit of relatie waarvan het attribuut een kenmerk is; - een domein, dit is de collectie van alle mogelijke waarden die het kenmerk kan aannemen; - een definitie die éénduidig de interpretatie van de gekozen waarde uit het domein aangeeft; - het al dan niet verplichte karakter van het attribuut: moet elke instantie van de gegeven entiteit of relatie over deze eigenschap beschikken, of is dit optioneel, met andere woorden, modelleer je ook instanties waarvoor deze eigenschap irrelevant of onbekend is. Voorbeeld Naam personen ten laste Entiteit Werknemer Domein de natuurlijke getallen, inclusief 0 Definitie het aantal personen dat fiscaal ten laste van de medewerker is, volgens opgave door de medewerker zelf Verplicht Ja VVKSO Werkgroep Handel Database-ontwerp - pagina 15 Voorstelling De attributen worden bij in de rechthoek geschreven. In diagrammen worden ze meestal weggelaten om de overzichtelijkheid niet te schaden. Werknemer WerknemerID Naam Adres Telefoonnummer Datum-in-dienst … Zorg er voor dat bij de attributen van een entiteit een attribuut voorkomt dat de entiteit uniek identificeert (als later de ERD wordt omgezet naar een tabel zal dergelijk attribuut gebruikt worden als primaire sleutel). De moeilijkste stap bij het opstellen van een ERD is het identificeren van de attributen die bij de relaties horen. Voorbeeld: De gegevens van lopers aan meerdere loopnummers (100 m, 200 m, 400 m, …) worden bijgehouden. De lopers kunnen telkens een andere plaats behalen. Om het resultaat van een loper te bepalen, dien je dus steeds bij te vermelden welke loopnummer bedoeld wordt. neemt deel aan Loper Loopnummer behaalde plaats De vraag wat de behaalde plaats is, is niet opportuun indien je niet weet over welke loper het gaat. Het attribuut “Behaalde plaats” hoort dus thuis bij de relatie en niet bij de entiteit Loper of de entiteit Loopnummer. 2.6 Voorbeelden a) Datamodel van een taxibedrijf 1) Chauffeur Taxi 2) Chauffeur Taxi 3) Chauffeur Taxi 4) Chauffeur Taxi Welke uitspraken horen bij welke ERD-diagram? Er zijn meerdere ERD-diagramama’s mogelijk bij een bepaalde uitspraak. Pagina 16 Database-ontwerp Er kunnen taxi’s zonder chauffeur bestaan: ……………………………. Een taxi kan bestuurd worden door meerdere chauffeurs: ……………………………. Een chauffeur kan meerdere taxi’s besturen: ……………………………. Een taxi wordt maar door 1 chauffeur bestuurd: ……………………………. Een chauffeur rijdt maar met 1 taxi: ……………………………. b) Datamodel van een schooladministratie Een school wenst een databank die bijhoudt hoeveel lesuren de leerling in elke richting van elk vak krijgt. Bij een richting hoort een uniek Id en een omschrijving (bv. Boekhouden-Informatica). Elk vak krijgt krijgt eveneens een uniek Id en een vaknaam. Bij een bepaalde richting horen er steeds meerdere vakken. Er wordt minimaal 1 vak gegeven per richting! Er zijn uiteraard verschillende klassen die een klascode hebben (bv. 4HB). Er zijn op school richtingen waarvoor er meerdere klassen (kunnen) zijn zoals 4 Handel A en 4 Handel B. Zijn er geen inschrijvingen voor een bepaalde kals dan wordt die klas natuurlijk niet ingericht. c) Datamodel van een plaatselijke vereniging Bij een plaatselijke vrouwenvereniging wil men informatie over de leden zoals naam, adres, … in een databank opslaan.Ook wil men in die databank gegevens van de kinderen van de leden (naam en geboortedatum kind) opslaan. Elk lid en elk kind krijgen een uniek Id (de vaders kunnen uiteraard zich niet inschrijven als lid). d) Datamodel van een verkoop Klant Order Verkoper Product Volgens dit datamodel gelden de volgende regels: - een klant die nog geen order heeft geplaatst, kan bestaan; - een verkoper die nog niets heeft verkocht, kan bestaan; - een product dat nog niet verkocht is kan bestaan; - een order van een bestaand product moet via een bestaande verkoper door een bestaande klant gedaan worden. Welke attributen zou je aan elke entiteit toekennen? VVKSO Werkgroep Handel Database-ontwerp - pagina 17 2.7 Uitgewerkt voorbeeld Datamodel voor Computerpark Er zijn 6 belangrijke entiteiten: Computer, Randapparaat, Software, Verbruiksproduct, Licentie en Leverancier. Met randapparaat wordt een uitwendig randapparaat bedoeld, bijvoorbeeld: hub, printer, modem, scanner … De relaties tussen de entiteiten Levertx, Heeft, Draait op, Is verbonden met, Connecteert worden getoond in het volgende diagram samen met hun cardinaliteit en optionaliteit. (In deze oplossing wordt verondersteld dat de computers in netwerk verbonden zijn via een hub, d.w.z. de computers zijn onderling niet rechtstreeks verbonden.) Bestudeer het volgende diagram aandachtig. Ga, wat de cardinaliteit en de optionaliteit betreft, na wat deze precies betekenen. Waarom is bijvoorbeeld de relatie tussen Leverancier en Verbruiksproduct anders dan tussen Leverancier en Computer of Leverancier en Randapparaat? Per entiteit worden volgende attributen bewaard. De domeinen worden niet aangegeven omdat ze vrij evident zijn. Computer Naam Definitie ComputerID identificatie van de computer, naam waaronder de PC gekend is, bijvoorbeeld PC01, Joske ... Ja Serienummer serienummer gegeven door producent Ja Merk merknaam of 'wit product' Ja Type naam van het type zoals gekend bij producent Pagina 18 Verplicht Database-ontwerp Lokaal locatie waar toestel zich bevindt, bijvoorbeeld: B11, Directiebureel ... Ja Functie bijvoorbeeld: lescomputer, labocomputer, server, internetserver ... Ja Processor type en klokfrequentie Ja Harde schijf merk, type, capaciteit … van alle ingebouwde schijven (samengesteld gegeven) Diskettestation merk, type … (samengesteld gegeven) CD/DVD merk en type van ingebouwd CD of DVD-station (samengesteld gegeven) RAM aanwezige hoeveelheid RAM RAMtype Type RAMUitTeBreiden uitbreidingsmogelijkheid Beeldscherm merk, type … (samengesteld gegeven) Klavier merk, type … (samengesteld gegeven) Muis merk, type … (samengesteld gegeven) Geluidskaart merk, type … (samengesteld gegeven) Netwerkkaart merk, type … (samengesteld gegeven) ISATotaal totaal aantal ISA-uitbreidingsgleuven ISABezet aantal bezette ISA-uitbreidingsgleuven PCITotaal totaal aantal PCI-uitbreidingsgleuven PCIBezet aantal bezette PCI-uitbreidingsgleuven BIOS naam Moederkaart naam Chipset naam Extras soort, merk en type van extra ingebouwde onderdelen, bijvoorbeeld zipdrive … (samengesteld gegeven) Opmerkingen algemene opmerkingen i.v.m. het toestel Randapparaat Naam Definitie RandapparaatID identificatienummer van het specifieke randapparaat Ja Functie functie, bijvoorbeeld: poort, netwerkkaart, modem, printer Ja Merk naamproducent Ja Type naam van het type zoals gekend bij producent Ja Beschrijving voornaamste karakteristieken Doel waarvoor het randapparaat gebruikt wordt, bijvoorbeeld: randapparaat, reserve, didactisch materiaal VVKSO Werkgroep Handel Verplicht Database-ontwerp - pagina 19 Software Naam Definitie NaamSoftware inclusief versienummer, bijvoorbeeld MS Word 9.0 Producent bijvoorbeeld Microsoft AantalCD aantal installatie cd's LocatieCD aanduiding waar de cd’s bewaard worden Verplicht Ja Licentie Naam Definitie Verplicht Licentienummer of ‘freeware’, gegevens 'shareware' indien dit het geval is Ja Soort licentie schoollicentie, klaslicentie, netwerk ... Ja Registratiedatum datum waarop licentie geregistreerd is AantalLicenties aantal toestellen of gebruikers waarvoor licentie geldt Verbruiksproduct Naam Definitie Verplicht Soort papier, toner voor HPLaser6 ... Merk naam producent Type type naam zoals gekend door producent Beschrijving voornaamste karakteristieken Voorraad hoeveelheid stuks in voorraad Ja Bestelpunt minimumvoorraad Ja Leveringstermijn gemiddelde leveringstermijn in dagen In bestelling Ja/nee Ja Leverancier Naam Definitie Firmanaam naam van de firma Contactpersoon naam van de contactpersoon bij de firma Klantnummer klantnummer zoals gekend bij leverancier Telnr Telefoonnummer Faxnr Faxnummer E-mailadres e-mailadres van contactpersoon Adres adres van de firma Verplicht Ja De attributen die bij de relaties Levertx en Draait op horen worden in de volgende tabellen weergegeven. De relaties Is verbonden met en Connecteert hebben geen attributen. Pagina 20 Database-ontwerp Levert Naam Definitie Verplicht Leveringsdatum datum waarop goederen geleverd werden Ja Aankoopprijs prijs per stuk Ja Opmerking opmerking i.v.m. de levering Draait op Naam Definitie begindatum datum installatie einddatum datum verwijdering opmerking opmerking, bijvoorbeeld Service Release die geïnstalleerd is, optionele componenten 2.8 Verplicht Oefeningen Ontwerp voor de beschreven omgevingen een datamodel. Volg bij het ontwerpen de volgende stappen: - bepaal de entiteiten; - bepaal de relaties; - bepaal de cardinaliteit van de relaties; - bepaal de optionaliteit van de relaties; - bepaal de attributen van de entiteiten en de relaties. 1 Ontwerp een datamodel voor een puntenboek van een leraar. Je moet zowel de punten voor gewone toetsen als voor proefwerken opslaan. Op het einde van de maand moet er op basis van de databank een puntenlijst afgedrukt worden met de punten van dagelijks werk voor het maandrapport en op het einde van het trimester de punten voor dagelijks werk en proefwerk. De leraar kan meerdere vakken geven en kan in meerdere klassen komen. 2 Ontwerp een datamodel voor een databank voor de schoolbibliotheek. Voor elk boek wordt bijgehouden welk type het is (boek, tijdschrift, naslagwerk). Elk werk heeft uiteraard een naam (titel) en is voorzien van een etiket met een uniek nummer. Een gebruiker moet een werk kunnen opzoeken op basis van een trefwoord. Een werk kan aan meerdere trefwoorden voldoen. Boeken kunnen uitgeleend worden. Je moet kunnen zien of het werk nog aanwezig is of uitgeleend. Indien het uitgeleend is, heeft de persoon het recht om het werk te reserveren. Je moet natuurlijk weten aan wie het is uitgeleend omdat de leners het boek maar één maand mogen bijhouden. Op elk moment moet een lijst kunnen afgedrukt worden van de ontleende en gereserveerde boeken. 3 Een sportclub (atletiek) wenst van al zijn leden een aantal gegevens bij te houden zoals hun lidnummer, naam, adres, postnummer, gemeente, telefoonnummer en welke beste tijden ze behaalden op de loopnummers 100 m, 200 m en 400 m en de datum waarop die beste tijden gelopen werden. 4 Een kapper wil voor elk bezoek van zijn klanten bijhouden welke bewerkingen hij heeft uitgevoerd (zoals knippen, wassen & gebruikte producten, kleuren & gebruikte producten) zodat hij later een historiek kan samenstellen per klant. 5 Een huisarts wil een databank met volgende gegevens: patiënten, gezinsgegevens (gezinshoofd, gezinsleden …), adres, telefoon, mutualiteit, bezoeken per gezinslid, diagnose per bezoek, voorgeschreven geneesmiddelen. VVKSO Werkgroep Handel Database-ontwerp - pagina 21 6 De firma La Linea werkt met vertegenwoordigers die kleding verkopen in een bepaald verkoopgebied. Een klant bestelt altijd via dezelfde vertegenwoordiger. De databank moet zeker volgende zaken bevatten: - vertegenwoordigers: vertegenwoordigersnummer, naam en adresgegevens, totale omzet (verdienste) en commissiepercentage; - klanten: klantnummer, naam, adres, saldo, kredietlimiet. Elke klant heeft een vertegenwoordiger maar nooit meer dan één; - kledingsstukken: artikelnummer, omschrijving, prijs, aantal in voorraad; - bestellingen: bestelnummer, klantgegevens, vertegenwoordiger, bestelde artikelen met aantal en prijs. Bijkomende vereisten - een bestelling wordt alleen aanvaard indien de klant geregistreerd is; - per bestelling is er hoogstens één klant; - klanten kunnen een korting krijgen: de te betalen prijs kan dus lager zijn dan de prijs in het artikelenbestand; - indien de prijs van een artikel verhoogt, betaalt de klant nooit meer dan afgesproken bij de bestelling. Pagina 22 Database-ontwerp 3 Een relationele databank • • • 3.1 Het relationeel model Primaire en refererende sleutels Het normalisatieproces Tabellen Gegevens kunnen gegroepeerd worden omdat ze om de een of andere reden bij elkaar horen (cfr. entiteiten in het entiteit-relatie datamodel). Zo een groep noem je een objecttype. In een relationele databank worden objecttypes geïmplementeerd d.m.v. tabellen met twee dimensies: rijen en kolommen. Per object wordt één rij gebruikt en per gegeven (attribuut) één kolom. Deze tabellen worden relaties (relations) genoemd. Dit is een term uit de wiskunde, niet te verwarren met de relaties (relationships) in het datamodel. Een database zal meestal uit meerdere tabellen bestaan die onderling met elkaar in verband staan. Voorbeeld: patientgegevens De attributen van een patiënt-objecttype zijn voornaam, familienaam, geboortedatum, lengte en gewicht. Ze vormen de kolommen of velden van de tabel. De (gegevens van) verschillende patiënten vormen de verschillende rijen of records in de tabel. Een tabel in een relationele database moet aan bepaalde voorwaarden voldoen: • • • twee rijen mogen nooit helemaal hetzelfde zijn (geen duplicaten); de volgorde van de rijen en kolommen mogen geen intrinsieke betekenis hebben, d.w.z. het verplaatsen van rijen en/of kolommen heeft geen invloed op de betekenis van de bewaarde gegevens; elke cel dient atomaire gegevens te bevatten, d.w.z. er mag maar een waarde van het attribuut in voorkomen. In een cel waarin een lengte aangegeven wordt, mag maar 1 lengte staan en niet bijvoorbeeld de resultaten van opeenvolgende metingen. 3.2 Sleutels 3.2.1 Primaire sleutel Elke rij is uniek en kan bijgevolg geïdentificeerd worden door de waarde in een kolom of een combinatie van kolommen. Deze kolom of combinatie van kolommen noemt men primaire sleutel (PS). Als de primaire sleutel uit meerdere kolommen bestaat, spreekt men van een samengestelde sleutel. M.a.w. 2 verschillende rijen in een tabel mogen nooit in de primaire sleutel dezelfde waarde hebben en in elke rij moet de primaire sleutel steeds 1 waarde hebben. Primaire sleutels mogen bijgevolg nooit de waarde Null hebben, wat betekent dat de primaire sleutel altijd moet ingevuld worden, nooit leeg of onbekend mag zijn! De primaire sleutel van een tabel speelt een belangrijke rol in een relationele database. Besteed dus steeds voldoende zorg aan de keuze ervan! VVKSO Werkgroep Handel Database-ontwerp - pagina 23 3.2.2 Kandidaatsleutel Het kan voorkomen dat er meerdere kolommen of combinaties van kolommen de rij identificeren. Er zijn dan meerdere kandidaatsleutels. Eén ervan wordt gekozen tot primaire sleutel (primary key). In de tabel tblPatientgegevens is er eigenlijk geen kandidaatsleutel. Theoretisch, hoewel zeer onwaarschijnlijk, is het mogelijk dat er twee personen met dezelfde naam zijn, die op dezelfde dag geboren zijn en dan nog dezelfde lengte en hetzelfde gewicht hebben. In dergelijke gevallen voeg je een veld toe, meestal met een numerieke waarde, dat als primaire sleutel fungeert. 3.2.3 Alternatieve sleutel Kandidaatsleutels die geen primaire sleutel zijn geworden, worden alternatieve sleutels genoemd. De waarde van een alternatieve sleutel mag wel Null zijn. Bijvoorbeeld telefoonnummer in een tabel tblKlanten. Het begrip kandidaatsleutel is dus een verzamelnaalm voor alle primaire en alternatieve sleutels. 3.2.4 Surrogaatsleutel In de praktijk kies je best een extra kolom als primaire sleutel zoals PatientID, d.w.z. een kolom die niet overeenkomt met een eigenschap van een entiteit, maar die enkel dient om de rij te identificeren. Als je een kolom neemt die overeenkomt met een eigenschap van een attribuut, dan kan dit in de loop van de tijd veranderen. Stel dat je als primaire sleutel een telefoonnummer zou nemen. In theorie biedt dit een unieke identificatie van bijvoorbeeld een klant. Als echter de telefoonmaatschappij om een of andere reden de nummers aanpast, bijvoorbeeld zonenummer 089 wordt gesplitst in 089 en 011 zal de applicatie overal waar deze waarde als primaire sleutel en refererende sleutel (zie volgende paragraaf) gebruikt wordt, moeten aangepast worden. Dat vraagt heel wat meer werk dan enkel de gegevens in één kolom aanpassen. Een sleutel zoals PatientID die niet overeenkomt met een eigenschap van een entiteit noemt men een surrogaatsleutel. 3.2.5 Refererende sleutel Een refererende of vreemde sleutel is een geheel van attibuuttypen van een relatie waarvoor geldt: de attribuuttypen verwijzen naar de primaire sleutel uit een andere tabel. Refererende sleutels dienen juist om het verband tussen twee relaties (tabellen) weer te geven. Bij onvoldoende kennis van de werking met sql-databanken: zie hoofdstuk 5. Beschouw volgende view in ArtemisSQL.mdf: Pagina 24 Database-ontwerp In de tabel tblOrders is Klantnummer de refererende sleutel. Uiteindelijk zullen tabellen met elkaar in verband gebracht worden via het toevoegen van vreemde sleutels. Bekijk de inhoud van tabel tblKlanten. Wat is het laatste klantnummer? Voeg een record toe in tabel tblOrders met als klantnummer 275. Er volgt: 3.3 Namen van velden Ieder veld behoort een duidelijke, binnen de tabel unieke naam te krijgen, waarmee het zich van alle andere gegevens onderscheidt. Hoewel het in de meeste pakketten voor gegevensbeheer, zoals met sql-bestanden mogelijk is om een naam te kiezen die bestaat uit meerdere woorden, kun je misschien beter de woorden aan elkaar schrijven en ieder nieuw woord met een hoofdletter laten beginnen. Overdrijf niet in de lengte van de naam: 25 karakters zou ruim voldoende moeten zijn. Voorbeelden van zinvolle naamgeving: WaardeVoorraad, BetalingPerCheck enz. Een tabel kan bijvoorbeeld weergeven worden als: Patiëntgegevens(PatiëntID, Voornaam, Familienaam, Geboortedatum, Lengte, Gewicht) waarbij de primaire sleutel onderstreept wordt. 3.4 Koppelingen tussen tabellen Verschillende tabellen in een relationele database kunnen gegevens bevatten die onderling gekoppeld zijn, die dus samen een grotere gegevensgroep vormen. Bijvoorbeeld: een tabel bevat gegevens van ouders en een andere tabel bevat gegevens van kinderen. Er moet een mechanisme bestaan om aan te geven welke ouders bij welke kinderen horen. VVKSO Werkgroep Handel Database-ontwerp - pagina 25 Een dergelijke koppeling wordt in het Nederlands ook een relatie genoemd (Engels: relationship). Dit kan tot verwarring leiden. In hetgeen volgt wordt de term relatie gebruikt om een koppeling tussen tabellen aan te geven. In een relationeel ontwerp wordt een relatie aangegeven door een lijn tussen de twee tabellen die de koppelende velden verbindt. Het veld in de ‘kind’-tabel dat de koppeling legt met de (primaire sleutel) van ‘ouder’-tabel is de refererende sleutel of vreemde sleutel (foreign key). 3.5 Ouder Kind OuderID Familienaam Voornaam Straat postnummer Gemeente KindID Voornaam Leeftijd Geslacht OuderIDREF Het normalisatieproces Alle tabellen zijn niet zo maar te gebruiken in een relationele database. In paragraaf 3.1 werden reeds 3 voorwaarden opgesomd waaraan voldaan moet zijn, maar er zijn er nog. De bijkomende voorwaarden hebben hoofdzakelijk te maken met het consistent houden van de database, d.w.z. de database mag geen tegenstrijdige gegevens bevatten. Zulke tegenstrijdige gegevens kunnen ontstaan als eenzelfde gegeven, bijvoorbeeld het adres van een persoon, meerdere keren bijgehouden wordt. Het adres kan dan bijvoorbeeld op een plaats aangepast worden, maar dezelfde aanpassing wordt vergeten op de andere plaats. Gelukkig bestaan er regels waarmee je een tabel kunt aanpassen om tot een goede structuur te komen. Dit proces wordt normalisatie genoemd. Normalisatie is een bepaalde herschikking van de gegevens en gegevensgroepen, waarbij soms nieuwe groepen worden gevormd door gegevens uit bestaande groepen af te zonderen. Uiteindelijk wil je tot de volgende situatie komen: Alle attributen van een groep zijn functioneel afhankelijk van de volledige primaire sleutel en tussen attributen onderling bestaan geen functionele afhankelijkheden. Een gegeven is functioneel afhankelijk van een ander als dit gegeven gekend is als het andere gegeven gekend is. Bijvoorbeeld in het rijksregister zijn de gegevens naam en woonplaats functioneel afhankelijk van het rijksregisternummer. Als je het rijksregisternummer van iemand kent, dan kun je zijn naam en woonplaats vinden. Door het gebruik in volgende paragrafen wordt het begrip wellicht duidelijker. Het doel van normalisatie is het vermijden van redundantie dit betekent dat bepaalde informatie tegelijkertijd op meer dan één plaats wordt voorgesteld. De voornaamste nadelen van redundantie zijn: - risico's van inconsistentie: indien dezelfde soort informatie op meer dan één plaats tegelijk aanwezig is, dan kunnen de verschillende plaatsen van informatieopslag elkaar tegenspreken; - moeilijker gegevensonderhoud: sommige wijzigingen moeten op verschillende plaatsen tegelijk worden doorgevoerd. Een basisidee van de relationele structuur is dat gegevens worden opgesplitst in verschillende tabellen die met elkaar verbonden zijn. Op die manier wordt redundantie en inconsistentie vermeden. Nochtans is redundantie soms nuttig. Zo kan een overdreven genormaliseerd gegevensbeheersysteem veel tijd vragen om gegevens op te zoeken, door het grote aantal verschillende gegevensgroepen. Pagina 26 Database-ontwerp Je gaat hoe dan ook de normalisatie steeds volledig doorvoeren en achteraf bepaalde redundanties eventueel opnieuw invoeren, op voorwaarde dat je daarvoor een goede reden kunnen opgeven. 3.6 Normalisatievormen Een normaalvorm (NV of NF – Normal Form) is een stap in het normalisatieproces. Elke normaalvorm stelt bepaalde eisen aan de manier waarop de gegevens zijn opgeslagen (zoals eisen aan de geldende functionele afhankelijkheden). Er zijn 6 normaalvormen. Hier worden er maar 3 besproken omdat ze meestal volstaan om tot een efficiënte database te komen: - NF1: verwijder de zich herhalende deelverzamelingen (repeterende groepen). - NF2: verwijder de attributen die functioneel afhankelijk zijn van slechts een deel van de sleutel. - NF3: verwijder de attributen die functioneel afhankelijk zijn van andere attributen. Met 'verwijderen' wordt bedoeld in een afzonderlijke gegevensgroep onderbrengen, niet weglaten uit het gegevensmodel! 3.7 Niet genormaliseerde gegevensgroepen Onderstaande tabel tblBestellingen bevat gegevens over meubelen en de leverancier ervan. Het is eigenlijk niets anders dan een losse verzameling van gegevens. Een dergelijke gegevensgroep is een gegevensgroep in de nulde normaalvorm (0NF). Het is de ‘naieve’ benadering om gegevens te structureren: de structuur van de database bootst de verschijningsvorm van de gegevens in de werkelijkheid na. Bij het ontwerp werd enkel gekeken naar de bestelling. De tabel wordt aanzien als een lijst van bestellingen. Naam Kleur TAFEL Wit Prijs 445,00 Aantal 2 Naam Tel Straat Postc Plaats IDEA 03 156 84 95 Boomsesteenweg 185 2610 WILRIJK 03 156 84 96 STOEL Wit 198,00 8 FIEREMANS 054 20 60 80 Assesteenweg 1740 TERNAT TAFEL Zwart 495,00 6 JANSSENS 02 256 15 23 Zeypstraat 15 2800 MECHELEN TAFEL Zwart 495,00 6 JANSSENS 02 256 15 23 Zeypstraat 15 2800 MECHELEN STOEL Bruin 124,00 10 JANSENS 02 256 15 32 Zeipstraat 15 2000 MECHELEN KAST Zwart 544,00 5 FIEREMANS 02 132 54 98 Assesteenweg 121 1740 TERNAT 054 20 60 80 Ninoofsesteenweg 156 Wit ROOSDAAL Bruin BED KAST Grijs 397,00 9 LINEA 03 189 78 91 Boomsesteenweg 185 2610 WILRIJK Wit 422,00 1 BRICO 02 563 89 78 Hoogstraat 210 1000 BRUSSEL Bruin 745,00 4 JANSSENS 02 256 15 23 Zeipstraat 15 2800 MECHELEN Bekijk de adresgegevens van leverancier Janssens. Wat stel je vast? Twee rijen zijn volledig identiek. Wat denk je hierover? Sommige artikelen bestaan in meerdere kleuren. Welke? Mag dit in een tabel van een relationele database zo bewaard worden? Verklaar. Wordt er op andere plaatsen nog gezondigd tegen dezelfde regel? Waar? VVKSO Werkgroep Handel Database-ontwerp - pagina 27 Het is duidelijk dat deze gegevensgroep niet voldoet om als tabel in een relationele omgeving gebruikt te worden. Herlees nog eens de voorwaarden waaraan een tabel in een relationele databank moet voldoen (paragraaf 3.1). Aan welke voorwaarden wordt in deze gegevensgroep niet voldaan? Bij een relationele tabel hoort ook een primaire sleutel. Wat zou je in deze tabel als primaire sleutel kunnen gebruiken? 3.8 Repeterende groepen: NF1 NF1: iedere tabel die voldoet aan de minimale eisen die aan een relatie (tabel) worden gesteld is automatisch in NF1. Praktisch komt het er op neer dat er een primaire sleutel moet bestaan en dat alle cellen atomair zijn. Een RDBMS zoals MS Access, SQL Server, MySQL laat enkel atomaire cellen toe. Wel is het in veel RDBMS-sen mogelijk om zonder een primaire sleutel te werken. In volgende voorbeelden wordt uitgelegd welke problemen kunnen opduiken als een tabel niet in NF1 is en hoe je een gegeven tabel in NF1 kunt zetten. Voorbeeld 1 In een bedrijf worden de volgende personeelsgegevens bijgehouden: Persnr Naam Straat Postnummer Gemeente Taal 10051 Devos Dorpsplein 1 8000 Brugge Nederlands Frans Engels 20089 Vandevelde Centrumlaan 5 9000 Gent Nederlands Duits … … … … … … Het veld Taal bevat de talen gekend door de personeelsleden. Wat is de primaire sleutel van deze gegevensgroep? Waarom kan deze gegevensgroep niet als tabel gebruikt worden in een relationele database? De talenkennis van de personeelsleden moet op een andere manier bewaard worden. Welke problemen kun je verwachten als je diverse velden voorziet (Taal1, Taal2, Taal3, ...) om dan in elk veld een gekende taal te noteren? Welke problemen treden op als je per personeelslid zoveel rijen voorziet als er gekende talen zijn? Een gegeven of een combinatie van gegevens die per entiteit meerdere keren voorkomt noemt men een repeterende groep. Pagina 28 Database-ontwerp De oplossing van de aangehaalde problemen vereist het verwijderen van de repeterende groep (hier het gegeven Taal) uit de oorspronkelijke gegevensgroep en het creëren van een nieuwe gegevensgroep met de gegevens van de repeterende groep. Er wordt een scheiding gemaakt van gegevens WAARBIJ MEN ER MOET VOOR ZORGEN OM GEEN INFORMATIE TE VERLIEZEN! Een volgende opsplitsing zou dan ook verkeerd zijn: Persnr Naam Straat Postnummer Gemeente 10051 Devos Dorpsplein 1 8000 Brugge 20089 Vandevelde Centrumlaan 5 9000 Gent … … … … … en Taal Nederlands Frans Engels Nederlands Duits … Waarom is dit geen goed voorstel en volgend voorstel wel? Persnr Naam Straat Postnummer Gemeente 10051 Devos Dorpsplein 1 8000 Brugge 20089 Vandevelde Centrumlaan 5 9000 Gent … … … … … en Persnr Taal 10051 Nederlands 10051 Frans 10051 Engels 20089 Nederlands 20089 Duits … … Om geen gegevensverlies te hebben moet je dus de repeterende groep uit de oorspronkelijke gegevensgroep verwijderen en in een aparte gegevensgroep zetten, waarbij je de primaire sleutel herhaalt. Wat is een primaire sleutel voor de tweede gegevensgroep? Bovenstaande gegevensgroepen staan in de eerste normaalvorm (1NF). Het is mogelijk dat er meerdere repeterende groepen voorkomen. Die moeten allemaal in aparte gegevensgroepen bijgehouden worden. VVKSO Werkgroep Handel Database-ontwerp - pagina 29 De zo ontstane gegevensgroepen zijn gerelateerd. De relatie wordt gelegd door het primaire sleutelveld van de eerste gegevensgroep die herhaald wordt in de tweede gegevensgroep. In de tweede gegevensgroep kan dat sleutelveld meerdere keren dezelfde waarde bevatten. Het kan dus zeker geen primair sleutelveld voor de tweede gegevensgroep vormen. Men spreekt van een refererende sleutel of foreign key. In het bovenstaande voorbeeld is Persnr de primaire sleutel van de eerste gegevensgroep en de refererende sleutel van de tweede gegevensgroep. Voorbeeld 2 Bij het normaliseren hoef je niet onmiddellijk de gegevens in tabelvorm weer te geven. Meestal is dit zelfs niet mogelijk omdat er te veel gegevens zijn. Je kunt de gegevens ook onder elkaar weergeven zoals in volgend voorbeeld. (De primaire sleutel wordt onderstreept.) 9 nulde normaalvorm personeelsnummer naam adresgegevens (straat, postnummer, gemeente) talenkennis (taal, mondelinge kennis, schriftelijke kennis) behaalde diploma's (naam, jaartal) 9 eerste normaalvorm personeelsnummer naam adresgegevens (straat, postnummer, gemeente) en personeelsnummer taal mondelinge kennis schriftelijke kennis en personeelsnummer diplomanaam jaartal Personeelsnummer is de primaire sleutel van de eerste gegevensgroep en de refererende sleutel van de twee andere. Voorbeeld 3 9 nulde normaalvorm lidnummer naam adresgegevens (straat, postnummer, gemeente) kinderen (naam, leeftijd, gevolgde lessen) 9 eerste normaalvorm Pagina 30 Database-ontwerp Stap 1 lidnummer naam adresgegevens (straat, postnummer, gemeente) en lidnummer naamkind leeftijd gevolgde lessen Stap 2 lidnummer naam adresgegevens (straat, postnummer, gemeente) en lidnummer naamkind leeftijd en lidnummer naamkind gevolgde les Voor de eenvoud kun je aan de tweede gegevensgroep een speciaal sleutelveld toevoegen dat kan dienen als primaire sleutel voor de gegevensgroep. Je krijgt dan iets als het volgende. 9 eerste normaalvorm lidnummer naam adresgegevens (straat, postnummer, gemeente) en kindnummer lidnummer naamkind leeftijd en kindnummer gevolgde les VVKSO Werkgroep Handel Database-ontwerp - pagina 31 Voorbeeld 4 Hieronder zie je een tabel met namen van personen en de softwarepakketten die ze geven: Persnum P10 P11 P13 P16 P19 Naam Marc Ria Annie Guy Gerry Software Powershell, Asp.Net Excel, Word, Access Word, Access Asp.Net, Word, Vb.Net Vb.Net, Asp.Net, Powershell Strikt genomen is deze tabel in de eerste normaalvorm, maar er wordt gezondigd tegen de geest van deze normaalvorm omdat er meerdere betekenisvolle gegevens in een cel staan. Het is moeilijk om uit een dergelijke tabel alle personeelsleden te filteren die Word geven. De repeterende groep wordt gevormd door de gebruikte Software. Een omzetting naar de eerste normaalvorm geeft het volgende resultaat: Persnum P10 P11 P13 P16 P19 Naam Marc Ria Annie Guy Gerry en Persnum P10 P10 P11 P11 P11 P13 P13 … Software Powershell Asp.Net Excel Word Access Word Access … Misschien heb je het probleem van het softwaregebruik als volgt opgelost. Persnum P10 P11 P13 P16 P19 Naam Marc Ria Annie Guy Gerry Powershell Asp.Net x x x x x Word Access x x x x x Vb.Net Excel x x x Schijnbaar is er hier geen sprake van herhalende groepen. In elke cel staat immers hoogstens één vermelding nl. een x als de persoon het betreffende programma gebruikt. Dergelijke structuur heeft enkele belangrijke nadelen. - Veel velden zijn leeg maar nemen toch plaats in op de schijf. - Wanneer een pakket niet meer gebruikt wordt, is het bij alle records leeg maar het is nog aanwezig. Je kunt het slechts verwijderen wanneer je de structuur van de tabel wijzigt. Dit is een activiteit die de gewone gebruiker niet zal uitvoeren. Wanneer er een nieuw pakket wordt toegevoegd moet je eveneens de tabelstructuur aanpassen. Wanneer je echter met een gesplitste tabel werkt, dan heb je slechts records te verwijderen of toe te voegen. De tabelstructuur verandert hierdoor niet, wel het aantal rijen in de tabel. Pagina 32 Database-ontwerp 3.9 Partiële functionele afhankelijkheid: NF2 Een relatie is in 2 NF als alle attributen die niet opgenomen zijn in de PS van de gehele PS afhankelijk zijn. Praktisch kan dit alleen problemen opleveren als de primaire sleutel een samengestelde sleutel is. Voorbeeld 1 In een onderneming waar software op maat van de klant ontwikkeld wordt, wordt elke opdracht gezien als een project dat geïdentificeerd wordt door een projectnummer en naam. Analisten, programmeurs en andere medewerkers worden toegewezen aan één of meerdere projecten. Om de kosten te kunnen bepalen, wordt per medewerker bijgehouden hoelang hij aan een project gewerkt heeft. 9 nulde normaalvorm personeelsnummer adresgegevens (straat, postnummer, gemeente) uurloon projecten (projectnummer, projectnaam, klantnaam, werkduur) 9 eerste normaalvorm personeelsnummer adresgegevens (straat, postnummer, gemeente) uurloon en personeelsnummer projectnummer projectnaam klantnaam werkduur Kenmerkend voor een primaire sleutel is dat hij een rij volledig identificeert. Dit wil zeggen: als de primaire sleutel gekend is, dan kun je de waarden van alle andere velden vinden. Men zegt dat alle velden functioneel afhankelijk (f.a.) zijn van de primaire sleutel (veld X is functioneel afhankelijk van veld Y als de waarde van veld X vastligt als de waarde van veld Y gegeven is). Voorbeeld Als we de klantID kennen dan kennen we tevens de klantnaam, klantadres, … Bij een klantID hoort immers ondubbelzinnig een klantnaam, een klantadres, … De klantnaam is dus functioneel afhankelijk van de klantID. Het omgekeerde geldt niet: het klantID is niet functioneel afhankelijk van de klantnaam. Bij een klantnaam kunnen er meerdere klantID’s horen. De klantnaam Piet Pieters of Jan Janssens kan meerdere keren voorkomen in de tabel zodat Piet Pieters niet ondubbelzinnig kan zeggen welk klantID er mee overeenkomt. Als de primaire sleutel een samengestelde sleutel is, m.a.w. uit meerdere velden bestaat, dan is het mogelijk dat kennis van een deel van de sleutel voldoende is om de waarde van een of meer velden te vinden. In het bovenstaande voorbeeld, tweede tabel, is dit het geval voor de velden projectnaam en klantnaam. Als het projectnummer gekend is, dan kan men de waarde van deze beide velden vinden. Men zegt dat deze velden partieel functioneel afhankelijk zijn van de primaire sleutel (of afhankelijk zijn van een deel van de sleutel). VVKSO Werkgroep Handel Database-ontwerp - pagina 33 In de tweede stap in de normalisering moeten velden die partieel functioneel afhankelijk zijn uit de oorspronkelijke gegevensgroep verwijderd worden en samen met het deel van de sleutel waarvan ze afhankelijk zijn in een nieuwe gegevensgroep geplaatst worden. 9 tweede normaalvorm personeelsnummer adresgegevens (straat, postnummer, gemeente) uurloon en personeelsnummer projectnummer werkduur en projectnummer projectnaam klantnaam Als deze stap niet gezet wordt, zal de database redundante gegevens bevatten, d.w.z. dezelfde gegevens komen meerdere malen voor (zie voorbeeld 2). Inderdaad zal in bovenstaand voorbeeld, voor elk personeelslid dat aan een bepaald project toegewezen wordt zowel de projectnaam als de klantnaam herhaald worden. Merk op dat door het afzonderen van de projectgegevens de primaire sleutel van de nieuwe gegevensgroep (projectnummer) aanwezig blijft als refererende sleutel in de oorspronkelijke gegevensgroep. De gegevens van de medewerkers zitten samen in de gegevensgroep. De gegevens van het project zitten samen in een andere gegevensgroep. De koppeling tussen deze gegevensgroepen namelijk welke werknemers werken hoelang voor welk project, zit in een aparte gegevensgroep met een samengestelde sleutel. Voorbeeld 2 Een groothandelaar koopt bepaalde artikelen bij meerdere leveranciers. 9 nulde normaalvorm artikelnummer artikelnaam artikelcategorie leveranciersnummer aantal levtel 9 eerste normaalvorm artikelnummer artikelnaam artikelcategorie Pagina 34 Database-ontwerp en artikelnummer leveranciersnummer aantal levtel Als de stap naar de tweede normaalvorm (2NF) niet gedaan wordt, kan de tweede gegevensgroep er als volgt uitzien. Levnum L1 L1 L1 L2 L2 L3 L3 L4 LevTel 235 235 235 999 999 800 800 600 Artnum A1 A2 A3 A2 A4 A1 A5 A6 Aantal 10 12 14 10 5 13 10 5 Welke gegevens worden nodeloos herhaald? Hoeveel keer moet je het telefoonnummer veranderen als het telefoonnummer van L1 verandert? Wat gebeurt er indien artikel A6 gewist wordt (niet aangekocht)? Kun je het telefoonnummer van een leverancier toevoegen als hij nog geen artikel geleverd heeft? Welke velden zijn functioneel afhankelijk van slechts een deel van de sleutel? Breng bovenstaande gegevensgroep in tweede normaalvorm. 3.10 Transitieve functionele afhankelijkheid: NF3 Een relatie is in 3 NF als de relatie in 2 NF is en geen transitieve afhankelijkheden bevat Wat dit precies betekent, kom je te weten in de volgende voorbeelden. Voorbeeld In een boekenwinkel houdt men van alle boeken volgende gegevens bij: Boekcode Categoriecode CategorieOms Titel BK1276 K36 Kinderen 3-6 jaar Samson op reis VW0058 K03 Kinderen 0-3 jaar Dieren kijken HJ1000 K36 Kinderen 3-6 jaar Samson is ziek … … … … Auteur Verkprijs 14,50 2,45 14,50 … … Wat vind je zelf (intuïtief) van dit voorstel voor de gegevensbestandstructuur? Leg uit met voorbeeld(en) waarom je dit voorstel goed of slecht vindt. VVKSO Werkgroep Handel Database-ontwerp - pagina 35 In dit voorbeeld is de categorieomschrijving (CategorieOms) gekend als de categoriecode gekend is. Dit veld is dus functioneel afhankelijk van een ander veld dan het primaire sleutelveld. Men spreekt in dat geval van transitieve functionele afhankelijkheid. In de derde stap van de normalisering moeten velden die transitief functioneel afhankelijk zijn uit de oorspronkelijke gegevensgroep verwijderd worden en samen met het veld waarvan ze afhangen in een nieuwe gegevensgroep geplaatst worden. Boekcode CategorieCode Titel BK1276 K36 Samson op reis VW0058 K03 Dieren kijken HJ1000 K36 Samson is ziek … … … Auteur Verkprijs 14,50 2,45 14,50 … … en CategorieCode CategorieOms K36 Kinderen 3-6 jaar K03 Kinderen 0-3 jaar … … Merk op: CategorieCode is de primaire sleutel van de nieuwe gegevensgroep en de refererende sleutel in de oorspronkelijke groep. De werkwijze is dus analoog als bij de tweede normalisatiestap. Pagina 36 Database-ontwerp 3.11 Overzicht Om tot een goede structuur van je relationele database te komen maak je volgende stappen. 9 Inventariseer alle elementaire gegevens. 9 Duid de sleutel(s) aan. 9 Verwijder alle procesgegevens. 9 Zet de gegevensgroepen in eerste normaalvorm. Werkwijze: - geef de deelverzameling aan die een herhaald aantal keren voorkomt. - herhaal de sleutel van de oorspronkelijke groep samen met de gegevens van de zich herhalende deelverzameling als nieuwe groep. - verwijder de zich herhalende deelverzameling uit de oorspronkelijke groep. 9 Zet de gegevensgroepen in tweede normaalvorm. Geef de attributen aan die niet functioneel afhankelijk zijn van de volledige sleutel. Vorm een aparte groep voor ieder deel van de sleutel waarvan attributen functioneel afhankelijk zijn. Neem in iedere groep de attributen met het bijbehorende sleuteldeel op. Verwijder deze attributen uit de oorspronkelijke groep. 9 Zet de gegevensgroepen in derde normaalvorm. Geef de attributen aan die ook functioneel afhankelijk zijn van andere attributen. Vorm een aparte groep voor ieder attribuut of combinatie van attributen, waar andere attributen functioneel afhankelijk van zijn. Neem in iedere groep de attributen met bijbehorende sleutel op. Verwijder de attributen van de nieuwe groep(en) uit de oorspronkelijke groep. VVKSO Werkgroep Handel Database-ontwerp - pagina 37 3.12 Voorbeelden 3.12.1 Oefening 1: facturatie In het kader van de automatisering van het bedrijf Elza moet de administratie van volgende facturen geautomatiseerd worden: N.V. Elza Factuurnummer: 51 Veldstraat 63 Klant: 29 9000 Gent Firma Verstraete Vredelaan 45 8520 Kurrne Geleverd: Datum: 25/01/2008 Artikelnummer Omschrijving Aantal Prijs A0456 C1200 C0002 Video S148 Cd-speler P4 Cd-speler V3 1 3 1 399,00 249,50 259,35 Totaal: 1406,85 1. Inventariseer de gegevens. 2. Duid de sleutel aan: deze wordt onderstreept. 3. Verwijder de procesgegevens. FACTUREN Factuurnummer Klnummer Klnaam Kladres Klpostnr Klgemeente Factuurdatum Artikelnummer Omschrijving Aantal herhalende deelverzameling Prijs Totaal -> procesgegeven verwijderen 1° normaalvorm: verwijder de zich herhalende deelverzamelingen Op de factuur komen de gegevens Artikelnummer, Omschrijving, Aantal en Prijs meerdere keren voor. Per factuur is het aantal gekochte artikelen variabel. Probleem: voor hoeveel artikelen moet er plaats (kolommen) voorzien zijn in de tabel? Wat gebeurt er als er teveel of te weinig plaats voorzien wordt? Pagina 38 Database-ontwerp Deze vier gegevens vormen een zich herhalende deelverzameling. Deze groep wordt uit de tabel verwijderd en in een aparte tabel geplaatst: tblBestellingen. Werkwijze: 1. Duid de zich herhalende deelverzameling aan. 2. Maak een nieuwe tabel met de sleutel uit de oorspronkelijke tabel en de zich herhalende deelverzameling. 3. Duid een bijkomende sleutel aan in de nieuwe tabel. 4. Verwijder de zich herhalende deelverzameling uit de oorspronkelijke tabel. 1e normaalvorm: FACTUREN (tblFacturen) BESTELLING (tblBestelling) Factuurnummer Klnummer Klnaam Kladres Klpostnr Klgemeente Factuurdatum Factuurnummer Artikelnummer Omschrijving Aantal Prijs Merk op: als er in een zich herhalende deelverzameling een andere zich herhalende deelverzameling voorkomt, dan moet deze werkwijze nog eens herhaald worden. 2° normaalvorm: verwijder de attributen die slechts afhankelijk zijn van een deel van de sleutel In de tabel tblBestelling zijn de gegevens Omschrijving en Prijs enkel afhankelijk van een deel van de sleutel (Artikelnummer) en niet van de volledige sleutel. Daarom worden ze uit de tabel verwijderd en in een aparte tabel opgenomen. Werkwijze: 1. Duid de attributen aan die slechts afhankelijk zijn van een deel van de sleutel. 2. Stel een aparte tabel op voor ieder deel van de sleutel waarvan attributen volledig afhankelijk zijn. 3. Duid in de nieuwe tabellen een sleutel aan. 4. Verwijder de attributen van de nieuwe groep(en) uit de oorspronkelijke groep. 2e normaalvorm: FACTUREN (tblFacturen) BESTELLING (tblBestelling) Factuurnummer Klnummer Klnaam Kladres Klpostnr Klgemeente Factuurdatum Factuurnummer Artikelnummer Aantal ARTIKELEN (tblArtikelen) Artikelnummer Omschrijving Prijs VVKSO Werkgroep Handel Database-ontwerp - pagina 39 Er zijn nu al drie afzonderlijke tabellen. De tabel tblArtikelen kan nu ook bij andere facturen gebruikt worden: het opnemen van het artikelnummer zal voldoende zijn om de bijkomende gegevens op te vragen. 3° normaalvorm: verwijder de attributen die verborgen afhankelijk zijn van de sleutel (die dus ook nog afhankelijk zijn van andere attributen) In de tabel tblFacturen zijn de gegevens Klnaam, Kladres, Klpostnr en Klgemeente verborgen afhankelijk van de sleutel via het attribuut Klnummer: bij elk klantnummer hoort slechts één naam, adres, gemeente en postnummer. Werkwijze: 1. Geef de attributen aan die verborgen afhankelijk zijn van de sleutel. 2. Vorm een aparte groep voor ieder attribuut of combinatie attributen waar andere attributen afhankelijk van zijn. 3. Duid in deze nieuwe tabellen de sleutel aan. 4. Verwijder de attributen van de nieuwe groep(en) uit de oorspronkelijke groep. 3e normaalvorm: FACTUREN (tblFacturen) BESTELLING (tblBestelling) Factuurnummer Klnummer Factuurdatum Factuurnummer Artikelnummer Aantal ARTIKELEN (tblArtikelen) KLANTEN (tblKlanten) Artikelnummer Omschrijving Prijs Klnummer Klnaam Kladres Klpostnr Klgemeente Verkorte schrijfwijze: Naam van de tabel (sleutel, gegeven1, gegeven2, …) In ons voorbeeld geeft dit: tblFacturen(Factuurnummer, Klnummer, Factuurdatum) tblBestelling(Factuurnummer, Artikelnummer, Aantal) tblArtikelen(Artikelnummer, Omschrijving, Prijs) tblKlanten(Klnummer, Klnaam, Kladres, Klpostnr, Klgemeente) 3.12.2 Oefening 2: artikelfiche In een magazijn houdt men per artikel een fiche bij. Daarop staat naast het aantal in voorraad ook informatie over de bestellingen die reeds geplaatst zijn. Dergelijke fiche ziet er uit zoals hieronder afgebeeld. Ontwerp tabellen in de derde normaalvorm waarmee dergelijke fiches kunnen worden bijgehouden. Pagina 40 Database-ontwerp Artikelnummer: 425 Strijkijzer Hoeveelheid in magazijn: 15 Geplaatste bestellingen: Ordernummer Leverancier Leveringsdatum 5891 6004 6147 Debo & zoon Vanassche Vanhee 25/02/09 01/03/09 15/03/097 Aantal 9 25 8 Bestelde hoeveelheid: 42 3.12.3 Oefening 3: abonnementen “Lezen is gezond” is een uitgeverij van meerdere weekbladen. Als een abonnee niet tijdig betaalt, stuurt de administratie een aanmaning volgens onderstaand model. Ontwerp tabellen in de derde normaalvorm om deze administratie te automatiseren. Uitgeverij “Lezen is gezond”, Antwerpen Rekeningnummer: 001-2345678-03 Abonnementsnummer: 25897 Abonneenummer: 57645 De Heer/Mevrouw Pieters Stationsstraat 99 9000 Gent Geachte abonnee, Er is gebleken dat u uw abonnementsgeld voor het blad “Dag iedereen” nog niet hebt betaald. Wij vragen u beleefd het verschuldigde bedrag van € 34,99 zo snel mogelijk te betalen. Gelieve bij uw betaling de nummers te vermelden die u bovenaan de brief vindt. Hoogachtend, 3.12.4 Oefening 4: stages Bij het organiseren van de stages op een school wordt op de administratie gebruik gemaakt van het volgende overzicht. Ontwerp tabellen in de derde normaalvorm waarmee onderstaand overzicht kan worden aangelegd. VVKSO Werkgroep Handel Database-ontwerp - pagina 41 Overzicht van stagiaires per bedrijf Bedrijfsgegevens Nummer Naam Adres Plaats Contactpersoon Geplaatste leerlingen Nummer 88048 88005 88103 88074 3.12.5 Naam Steven Devos Katrien Adams Ann Verhenne Geert Naert Klas 6a 6a 6c 6b Periode 1 1 2 2 Oefening 5: projecten In een softwarebureau zijn er steeds een groot aantal lopende projecten. Het is niet uitgesloten dat eenzelfde medewerker tegelijkertijd aan verschillende projecten meewerkt. In het bedrijf zijn er slechts 2 chefs: Jan is de chef van de afdeling Analyse en Piet is chef van de afdeling Programmering. Men wil steeds een goed overzicht van de zaken behouden. Ontwerp tabellen in de derde normaalvorm om deze administratie te automatiseren. PROJECTOVERZICHT Project 001 Vdb Budget 1200 002 Tra 800 003 Ptz 1000 3.12.6 Medewerker 014 Paul 009 Petra 010 Tom 009 Petra 014 Paul 012 Ria Afdeling Analyse Programmering Analyse Programmering Analyse Programmering Chef Jan Piet Jan Piet Jan Piet Uren 50 80 120 200 45 80 Oefening 6: cursussen In een bepaald bedrijf worden voor de werknemers cursussen georganiseerd. Van elke werknemer worden een aantal gegevens bijgehouden: een uniek nummer, de persoonlijke gegevens, de afdeling waar hij werkt een zijn jaarsalaris. Het bedrijf heeft een achttal afdelingen met elk een eigen baas. Deze afdelingen zijn gevestigd in verschillende plaatsen. Bij de cursusadministratie moeten alle gegevens over de cursisten steeds beschikbaar zijn. Van elke cursus wordt de officiële naam, de naam van de leraar, de startdatum en de duur van de cursus bijgehouden. Als een werknemer een cursus met succes beëindigd heeft, krijgt hij hiervoor een diploma. Op dat diploma komen enkele persoonlijke gegevens van de werknemer, zijn afdeling en de datum waarop hij de cursus heeft beëindigd. Ontwerp tabellen in de derde normaalvorm om deze administratie te automatiseren. Pagina 42 Database-ontwerp 3.12.7 Oefening 7: computerpark Beschouw als gegevensgroep de attributen behorende bij de entiteit Computer in het voorbeeld Computerpark. Nulde normaalvorm De definities worden weergegeven voor de duidelijkheid. ComputerID fungeert als primaire sleutel. Naam Definitie ComputerID identificatie van de computer, naam waaronder de PC gekend is, bijvoorbeeld PC01, Joske ... Serienummer serienummer gegeven door producent Merk merknaam of 'wit product' Type naam van het type zoals gekend bij producent Lokaal locatie waar toestel zich bevindt, bijvoorbeeld: B11, Directiebureel ... Functie specifieke functie, bijvoorbeeld: lescomputer, labocomputer, server, internetserver ... Processor type met klokfrequentie Harde schijf merk, type, capaciteit … van alle ingebouwde schijven (samengesteld gegeven) Diskettestation merk, type… (samengesteld gegeven) CD/DVD merk en type van ingebouwd CD of DVD-station (samengesteld gegeven) RAM aanwezige hoeveelheid RAM RAMtype Type RAMUitTeBreiden uitbreidingsmogelijkheid Beeldscherm merk, type… (samengesteld gegeven) Klavier merk, type… (samengesteld gegeven) Muis merk, type… (samengesteld gegeven) Geluidskaart merk, type… (samengesteld gegeven) Netwerkkaart merk, type… (samengesteld gegeven) ISATotaal totaal aantal ISA-uitbreidingsgleuven ISABezet aantal bezette ISA-uitbreidingsgleuven PCITotaal totaal aantal PCI-uitbreidingsgleuven PCIBezet aantal bezette PCI-uitbreidingsgleuven BIOS naam Moederkaart naam Chipset naam Extra’s soort, merk en type van extra ingebouwde onderdelen, bijvoorbeeld, zipdrive, cd-writer… (samengesteld gegeven) Opmerkingen algemene opmerkingen i.v.m. het toestel Eerste normaalvorm Afhankelijk van het computerpark dat beschreven wordt, bevat de gegevensgroep verschillende repeterende groepen. In sommige computerparken is het bijvoorbeeld mogelijk dat een computer meerdere netwerkkaarten bevat, meerdere diskettestations enz. Hier wordt verondersteld dat een toestel meerdere harde schijven kan hebben en meerdere extra's. Dit leidt tot volgende splitsing. VVKSO Werkgroep Handel Database-ontwerp - pagina 43 Computer Extra HardeSchijf ComputerID Serienummer Merk Type Lokaal Functie Processor Diskettestation CD/DVD RAM RAMtype RAMUitTeBreiden Beeldscherm Klavier Muis Geluidskaart Netwerkkaart ISATotaal ISABezet PCITotaal PCIBezet BIOS Moederkaart Chipset Opmerkingen ExtraID ComputerID Type Beschrijving Merk HardeSchijfID ComputerID Type Capaciteit Snelheid Merk Tweede normaalvorm Enkel de nieuwe gegevensgroepen moeten bekeken worden, want zij hebben een samengestelde sleutel. In beide gevallen hangen alle niet sleutelattributen af van het eerste deel van de sleutel. Dit leidt tot volgde splitsingen. ExtraComputer HardeSchijfComputer ExtraID ComputerID HardeSchijfID ComputerID Extra HardeSchijf ExtraID Type Beschrijving Merk HardeSchijfID Type Capaciteit Snelheid Merk Derde normaalvorm Diskettestation, CD/DVD, Beeldscherm, Klavier, Muis, Geluidskaart en Netwerkkaart zijn samengestelde gegevens. Bovendien is het zo dat als het identificerend gegeven bekend is. Dit leidt tot volgde splitsingen. Computer ComputerID Serienummer Merk Type Lokaal Functie Processor DiskettestationID CD/DVD_ID RAM Pagina 44 Diskettestation DiskettestationID Merk Type Snelheid ComputerID CD/DVD CD/DVD_ID Merk Type Speed Beeldscherm BeeldschermID Merk Type KlavierID KlavierID Merk Type Database-ontwerp RAMtype RAMUitTeBreiden BeeldschermID KlavierID MuisID GeluidskaartID NetwerkkaartID ISATotaal ISABezet PCITotaal PCIBezet BIOS Moederkaart Chipset Opmerkingen Energiesparend Ergonomisch Muis MuisID Merk Type Soort Geluidskaart GeluidskaartID Merk Type AantalBit Driver Netwerkkaart NetwerkkaartID Merk Type Driver De andere gegevensgroepen van Computerpark zijn in de derde normaalvorm. 3.13 1 Oefeningen Verbind de termen in kolom 1 met de synoniemen in kolom 2. Veld Rij Record Kolom Attribuut Relatie Tabel Instantie van entiteit Kenmerk 2 Geef een voorbeeld van een unieke sleutel die door volgende organisaties of instellingen wordt gebruikt om iemand te identificeren: Verzekeringsmaatschappij - Financiële instelling – Mutualiteit – Sportvereniging 3 Onderstreep in de eerste rij (veldnamen) van volgende tabel de primaire sleutel. NUMMER P10 P11 P40 P50 P60 NAAM Legrand Legrand De Bolle Vervaet Legrand VOORNAAM Pieter Annemie Annemie Sandra Pieter GEBOORTEDATUM 1990-11-11 1990-11-11 1991-01-15 1990-10-18 1967-05-20 LENGTE 174 168 172 168 174 GEWICHT 60 56 58 56 80 Kun je ook een kandidaatsleutel vinden? 4 Bepaal een mogelijke structuur voor personeelsgegevens van een onderneming. In de databank met personeelsgegevens wordt naast de gegevens van de werknemers (naam, datum indiensttreding, afdeling, brutoloon) ook de naam en de geboortedatum van de kinderen bijgehouden. 5 Normaliseer de gegevensgroepen die je hebt gevonden als resultaat van de oefeningen uit het vorige hoofdstuk. VVKSO Werkgroep Handel Database-ontwerp - pagina 45 4 Omzetting datamodel (ERD) naar databaseontwerp (tabellen) • Omzetting van entiteiten • Omzetting van relaties Een entity-relationship diagram kun je omzetten naar de verschillende soorten DBMS. In dit hoofdstuk wordt de omzetting naar een RDBMS besproken. Het resultaat van de omzetting wordt het databaseontwerp genoemd. Een relationele database ontwerpen wil zeggen de tabellen en hun onderlinge relaties definiëren en wel zo dat de database geen overtollige noch tegenstrijdige gegevens zal bevatten. De gegevens moeten steeds genormaliseerd worden. Je mag dit doen op het niveau van het datamodel, d.w.z. het datamodel verfijnen tot de attributen die bij de entiteiten of de relaties horen, een genormaliseerde groep vormen, of op het niveau van het database ontwerp, d.w.z. eerst een omzetting doen naar gerelateerde tabellen en dan de tabellen normaliseren. 4.1 Entiteiten 4.1.1 Zelfstandige entiteiten Als je een Entiteit-Relatie model hebt opgemaakt kun je in eerste instantie de entiteiten vertalen in tabellen. De entiteiten worden tabellen, de attributen worden velden. Indien dit nog niet gebeurd is, moet je nog een normalisatie doorvoeren. 4.2 Relaties zonder attributen 4.2.1 Optionaliteit De optionaliteit van een relatie wordt omgezet tot een eventuele beperking (constraint) van de tabel. Als de optionalteit 1 is, is de entiteit vereist, wat meestal in de RDBMS zal leiden tot het vereist stellen van de refererende sleutel in de tabel coresponderend met de andere entiteit. 4.2.2 Één-op-één relatie Voorbeeld relatie: gebruikt entiteiten: Bureautafel(BureautafelID, Locatie, Type…) en Werknemer(WerknemerID, Familienaam, Voornaam…) definitie: Administratieve werknemers krijgen een vaste bureautafel toegewezen op kantoor. Deze bureautafel moet met niemand gedeeld worden en iedereen krijgt slechts één bureautafel. Er kunnen werknemers zijn zonder bureautafel en bureautafels die niet gebruikt worden door werknemers. Werknemer Bureautafel gebruikt Pagina 46 Database-ontwerp De relatie Gebruikt wordt in het relationele ontwerp gebracht door tussen de tabellen Werknemer en Bureautafel een relatie (koppeling) te leggen. Dit gebeurt door aan de tabel Bureautafel de primaire sleutel (WerknemerID) van de tabel Werknemer toe te voegen of omgekeerd. Het toegevoegde veld is de refererende sleutel. Van elke entiteit wordt een tabel gemaakt. Hierbij neem je in één van de beide tabellen de primaire sleutel op van de andere tabel. De tabellen in het relationele ontwerp worden dus: Werknemer Bureautafel WerknemerID Familienaam Voornaam … 1 BureautafelID Locatie Type 1 … WerknemerID of Werknemer Bureautafel WerknemerID Familienaam Voornaam … BureautafelID 1 BureautafelID 1 Locatie Type … In principe zijn beide oplossingen gelijkwaardig. Welke van de twee uiteindelijk praktisch het beste is, hangt af van de bevraging van de databank. Als daarbij meestal uitgegaan wordt van de werknemers (wat waarschijnlijk het geval is), dan is de eerste oplossing de beste. Je ziet dat iedere tabel een primaire sleutel heeft. In de eerste oplossing is WerknemerID de refererende sleutel, in de tweede oplossing is BureautafelID de refererende sleutel. Opmerking In sommige gevallen kunnen de tabellen coresponderend met de entiteiten waartussen de één-opéén relatie zonder attributen ligt, teruggebracht worden tot één tabel. Dit kan enkel als tenminste in één van de tabellen geen enkel attribuut als primaire sleutel kan fungeren, anders krijg je immers transitieve afhankelijkheid. Het is vooral de optionaliteit die zal bepalen of het werken met één enkele tabel zinvol is. Veel lege velden bijhouden heeft geen zin. 4.2.3 Eén-op-veel relatie Beschouw dezelfde relatie als hierboven maar waarbij het mogelijk is dat een werknemer meerdere bureautafels toegewezen krijgt. Bureautafel Werknemer gebruikt De omzetting gebeurt op dezelfde manier als bij een één-op-één relatie maar nu wordt de primaire sleutel van de tabel langs de één-kant toegevoegd als refererende sleutel aan de tabel aan de veelkant. VVKSO Werkgroep Handel Database-ontwerp - pagina 47 Werknemer Bureautafel WerknemerID Familienaam Voornaam … 1 BureautafelID Locatie Type ∞ … WerknemerID De één- en de veel-kant worden respectievelijk aangeduid door de symbolen 1 en ∞. 4.2.4 Veel-op-veel relatie Beschouw weer dezelfde relatie maar breid ze verder uit door toe te laten dat eenzelfde bureautafel gedeeld wordt door verschillende werknemers. Werknemer Bureautafel gebruikt Om deze relatie te vertalen naar een relationeel ontwerp, creëer je nog een extra tabel naast de tabellen die de entiteiten voorstellen. Deze derde tabel geef je als attributen de primaire sleutel van beide tabellen (deze tabel bevat dus enkel de primaire sleutels uit beide tabellen). Ze vormen samen de primaire sleutel van de nieuwe tabel en elk apart een refererende sleutel voor een entiteit-tabel. Iedere entiteit-tabel heeft een één-op-veel relatie met de bijkomende derde tabel. Werknemer WerknemerBureautafel WerknemerID Familienaam Voornaam … ∞ 1 WerknemerID BureautafelID 4.3 Relaties met attributen 4.3.1 Eén-op-één relatie Bureautafel ∞ 1 BureautafelID Locatie Type … Voorbeeld relatie: Huwt entiteiten: Man(ManID, Familienaam, Voornaam…) en Vrouw(VrouwID, Familienaam…) definitie: Een man huwt een vrouw. Een man kan maar één vrouw huwen en omgekeerd. Niet elke man en niet elke vrouw huwt. attributen: Huwelijksdatum, NaamGetuige1, NaamGetuige2 Man huwt Vrouw De relatie wordt vertaald in een bijkomende tabel. Pagina 48 Database-ontwerp Man Huwelijk ManID Familienaam Voornaam … 1 Huwelijksdatum NaamGetuige1 NaamGetuige2 1 VrouwID ManID Vrouw VrouwID Familienaam Voornaam … 1 1 De derde tabel bevat de primaire sleutels van de twee andere tabellen. Vanwege de één-op-één relatie kan, als primaire sleutel van de tabel die met de relatie overeenkomt, de primaire sleutel van één van beide andere tabellen gekozen worden. De attributen van de relatie worden toegevoegd als gewone velden in de derde tabel. Beide relaties zijnvan het type één-op-één. 4.3.2 Eén-op-veel relatie Voorbeeld relatie: Schrijft in entiteiten: Persoon(PersoonID, Familienaam, Voornaam, …) en Cursus(CursusID, Naam, Lesgever, Klaslokaal, …) definitie: Een persoon schrijft in voor een cursus. Een persoon kan en moet inschrijven voor één cursus. attributen: Inschrijvingsdatum, Inschrijvingsgeld Persoon Cursus schrijft in Verklaar de optionaliteit van deze relatie. Naast de entiteiten, wordt de relatie zelf ook vertaald in een tabel. Deze tabel krijgt als attributen de attributen van de relatie en de primaire sleutels van de entiteit-tabellen. Persoon Inschrijving PersoonID Familienaam Voornaam … 1 1 Inschrijvingsdatum Inschrijvingsgeld PersoonID CursusID Cursus 1 ∞ CursusID Naam Lesgever … Als primaire sleutel van de nieuwe tabel kan de primaire sleutel van de tabel gekoppeld via de éénop-één relatie gebruikt worden. Verklaar. 4.3.3 Veel-op-veel relatie Beschouw dezelfde relatie waarbij het nu toegestaan is dat een persoon zich inschrijft voor meerdere cursussen. VVKSO Werkgroep Handel Database-ontwerp - pagina 49 Persoon Cursus schrijft in Persoon Inschrijving PersoonID Familienaam Voornaam … 1 ∞ Inschrijvingsdatum Inschrijvingsgeld PersoonID ∞ CursusID Cursus 1 CursusID Naam Lesgever Klaslokaal … Welke verschillen zijn er met de één-op-veel relatie? De twee entiteiten worden elk omgezet naar een tabel. Er wordt opnieuw gebruik gemakt van een derde tabel die de primaire sleutels bevat van beide tabellen plus de attributen van de relatie. Hoe de primaire sleutel bepalen in de derde tabel? Zoek een functionele afhankelijkheid van de vorm X is f.a. van Y, of X is f.a. van de combinatie {Y,Z}. Als je geen enkele functionele afhankelijkheid vindt, voeg dan zelf een nieuw veld toe dat je primaire sleutel maakt. Zoals je opmerkt zijn de velden Inschrijvingsdatum en Inschrijvingsgeld functioneel afhankelijk van de combinatie {PersoonsID, CursusID}. Daarom mag je de combinatie PersoonID en CursusID instellen als primaire sleutel in de derde tabel. 4.3.4 Overzicht Relaties zonder attributen Eén-op-een relatie • tabellen (entiteiten) • PS van ene tabel (keuze) toevoegen als RS aan andere tabel • in sommige gevallen terugbrengen tot één tabel Eén-op-veel relatie • tabellen (entiteiten) • PS van de één-kant toevoegen als RS aan de veel-kant Veel-op-veel relatie • tabellen (entiteiten & nieuwe tabel) • in de nieuwe tabel opnemen van PS van de 2 entiteit-tabellen, 2 sleutels vormen samen PS nieuwe tabel Relaties met attributen Eén-op-een relatie • tabellen (entiteiten & relatie) • PS van de entiteit-tabellen toevoegen aan nieuwe tabel als RS samen met de attributen van de relatie Pagina 50 Database-ontwerp • PS van de nieuwe tabel: één van de PS van de entiteit-tabellen (keuze) Eén-op-veel relatie • tabellen (entiteiten & relatie) • PS van de entiteit-tabellen toevoegen aan nieuwe tabel als RS samen met de attributen van de relatie • PS van de nieuwe tabel: PS van de entiteit-tabel aan de één-kant Veel-op-veel relatie • tabellen (entiteiten & relatie) • PS van de entiteit-tabellen toevoegen aan nieuwe tabel als RS samen met de attributen van de relatie • PS van de nieuwe tabel: samengestelde sleutel – PS van de entiteit-tabellen 4.4 Uitgewerkt voorbeeld De gegevensgroepen behorende bij de entiteiten in het datamodel voor Computerpark zijn reeds genormaliseerd in vorig hoofdstuk. Alle resulterende gegevensgroepen zullen omgezet worden in een tabel. Dit leidt tot de volgende tabellen: Randapparaat, Software, Licentie, Verbruiksproduct, Leverancier, Computer, HardeSchijf, Extra, HardeSchijfComputer, ExtraComputer, Diskettestation, CD_DVD, Beeldscherm, Klavier, Muis, Geluidskaart, Netwerkkaart. De relaties tussen deze tabellen zijn af te leiden uit het datamodel of volgen uit de normalisering. Het datamodel bevat drie veel-op-veel relaties en vijf relaties met attributen nl. Levertx en Draait op. Deze moeten nog omgezet worden naar tabellen en relaties voor het relationeel model. Is verbonden met Veel-op-veel relatie zonder attributen. Computer ComputerID … Verbinding ∞ ComputerID RandapparaatID 1 Randapparaat ∞ 1 RandapparaatID … Levertx Het gaat hier om 4 verschillende relaties die verschillende entiteiten verbinden. Drie van de relaties zijn één-op-veel en de vierde is veel-op-veel. Elke relatie heeft dezelfde attributen. Naam Definitie Leveringsdatum datum waarop goederen geleverd werden Ja Aankoopprijs prijs per stuk Ja Opmerking opmerking i.v.m. de levering VVKSO Werkgroep Handel Verplicht Database-ontwerp - pagina 51 Levert1, levering computers (één-op-veel) De relatie wordt vertaald in een tabel: LeveringComputer. Computer ComputerID … LeveringComputer 1 Leveringsdatum Aankoopprijs 1 Opmerking LeverancierID ComputerID Leverancier LeverancierID 1 … ∞ Als meerdere computers bij dezelfde levering aan dezelfde prijs geleverd worden, krijg je dikwijls dezelfde waarden voor de attributen en de tabel LeveringComputer. In dat geval kun je aan de levering een identificatie toekennen en pas je de tabellen aan. Computer ComputerID LeveringID … LeveringComputer ∞ 1 LeveringID Leveringsdatum Aankoopprijs Opmerking LeverancierID Leverancier LeverancierID 1 … ∞ Hoe voorzie je deze situatie in het datamodel? Vertaal het aangepaste datamodel naar een databaseontwerp. Bekom je hetzelfde resultaat? Levert2: levering randapparaten (één-op-veel) Idem. Levert3: levering software (één-op-veel) De relatie wordt vertaald in een tabel LeveringSoftware. Software SoftwareID … LeveringSoftware 1 Leveringsdatum Aankoopprijs 1 Opmerking LeverancierID SoftwareID Leverancier LeverancierID 1 … ∞ Tussen de tabellen Software en LeveringSoftware bestaat een één-op-één relatie. Deze kan in sommige gevallen teruggebracht worden tot één tabel. Omdat een bepaald softwarepakket (installatie cd's) slechts in één exemplaar en door één leverancier geleverd wordt, plaatsen we de attributen van de levering bij in de tabel Software. Is dit een goed idee als er veel freeware gebruikt wordt? Verklaar je antwoord. Pagina 52 Database-ontwerp Software Leverancier SoftwareID … LeveranciersID Leveringsdatum Aankoopprijs Opmerking LeverancierID 1 … ∞ Levert4: levering verbruiksproducten Hier moet er met een aparte tabel gewerkt worden omdat het om een veel-op-veel relatie gaat. Verbruiksproduct LeveringVerbruiksProd VerbruiksproductID 1 … LeveringID Leveringsdatum Aankoopprijs Opmerking ∞ LeverancierID VerbruiksproductID Leverancier LeverancierID 1 … ∞ In principe vormen LeverancierID, VerbruikproductID en Leveringsdatum samen een samengestelde primaire sleutel. Hier is de voorkeur gegeven aan een surrogaatsleutel LeveringsID. Draait op Deze relatie is een veel-op-veel relatie. Er zal dus met een bijkomende tabel moeten gewerkt worden. De attributen van Draait op zijn: Naam Definitie Begindatum datum installatie Einddatum datum verwijdering Opmerking opmerking, bijvoorbeeld Service Release die geïnstalleerd is, optionele componenten Computer ComputerID LeveringID … DraaitOp 1 ∞ ComputerID SoftwareID Begindatum Einddatum Opmerking Software ∞ SoftwareID 1 … Opmerking: mogelijk bevatten alle computers in hetzelfde lokaal ook dezelfde software. Is in dit geval deze oplossing een goede oplossing? Verklaar je antwoord. Pas het datamodel en het dataontwerp aan aan deze situatie. VVKSO Werkgroep Handel Database-ontwerp - pagina 53 Connecteert Connecteert is een speciale relatie omdat ze een entiteit verbindt met zichzelf. Ook hier is een supplementaire tabel nodig. Randapparaat RandapparaatID … Connectie 1 RandapparaatID1 ∞ RandapparaatID2 Vanwege het speciale karakter van tabel Connectie zal er steeds bijzondere aandacht moeten besteed worden aan query's en filters die hiermee gemaakt worden. 4.5 Oefeningen Zet de datamodellen van de oefeningen uit het vorige hoofdstuk om naar databaseontwerpen voor een RDBMS. Pagina 54 Database-ontwerp 5 Een database implementeren • • • 5.1 Componenten van de database Gegevenstypes in Sql Column Properties Een SQL-databank aanspreken in Visual Web Developer Microsoft SQL Server 2008 is de grote broer van MS Access. Je kunt er grote client-server toepassingen mee maken. Raadpleeg onderstaande website voor uitgebreide informatie. http://technet.microsoft.com/en-us/sqlserver/default.aspx Je hoeft niet over de volledige Microsoft SQL Server toepassing te beschikken om toch met SQLdatabases te kunnen werken. De Microsoft SQL Server 2008 Express Edition kun je gratis te downloaden: http://www.microsoft.com/express/sql/default.aspx Je kunt tijdens de installatie van Visual Basic Express Edition 2008 of Web Developer Express Edition 2008 aanklikken of Microsoft SQL Server Express Edition 2008 mee dient geïnstalleerd te worden. Start Visual Web Developer Express Edition 2008 (VWD) op. Open de Database Explorer via het menu View. Kies in de knoppenbalk van Database Explorer voor de knop Connect to Database. De SQL Server staat standaard ingesteld. Klik op Change… indien je een Accessdatabase wilt koppelen. Zoek via de Browse-knop de SQL-database SportclubSQL.mdf op. Klik eventueel op de knop Test Connection. Er verschijnt: VVKSO Werkgroep Handel Database-ontwerp - pagina 55 Objecten voor het maken van een databaseverbinding: Namespace Type Database System.Data.Odbc OdbcConnection Alle databases die Odbc ondersteunen (verouderd) System.Data.OleDb OleDbConnection Alle databases die OleDb ondersteunen (Access) System.Data.OracleClient OracleConnection Oracle System.Data.SqlClient SqlConnection SQL Server Open de databank SportclubSQL.mdf. In de Database Explorer verschijnen de componenten van de de database. Dubbelklik op de verzameling Tables. Componenten van de database: Map Verklaring Database Diagrams Databasediagrammen voegen op zich niets toe aan een database, maar zijn er om de tabellen en de relaties tussen de tabellen te visualiseren. Tables De tabellen in de database. Views Een view is een weergave van gegevens in de database, een soort virtuele tabel. De view kan gegevens uit 1 of meerdere tabellen weergeven. Stored procedures Dit zijn functies die je kunt uitvoeren. Dit kan zijn om gegevens op te vragen, toe te voegen, te wijzigen of te verwijderen. Parameters zijn toegelaten. Stored Procedures worden veel gebruikt om een toepassing niet direct op tabellen te laten uitvoeren. Daardoor is de onderliggende tabelstructuur gemakkelijker te veranderen, omdat je alleen maar de Stored Procedures dient te veranderen en de code van de toeassing kan blijven. Werken met Stored Procedures is ook veiliger, omdat ze eerst kunnen controleren of hetgeen de toepassing wil doen wel toegelaten is. Functions Kunnen in een view of stored procedure gebruikt worden. Functies kun je niet direct vanuit een toepassing gebruiken, maar zijn er om de sql-code van views en stored procedures te vereenvoudigen en er voor te zorgen dat je niet steeds dezelfde code op verschillende plaatsen dient te schrijven. Synonyms Synoniemen voor objecten (tabellen, views, stored procedures) in de database. Synoniemen maken het mogelijk om de objecten te herbenoemen zonder dat toepassingen hier last van ondervinden. Types Standaard zijn er een aantal types die kolommen in een database kunnen hebben. Je kunt ook types zef definiëren via de map Types. Pagina 56 Database-ontwerp Sql-server biedt de mogelijkheid om .NET functies aan te roepen in een query of stored procedure, zodat je functies in VB of C# kunt maken in plaats van in Sql. Als je een functie wilt gebruiken moet je de assembly waarin deze zit registreren in Sql-server. Dat doe je in de map Assemblies Assemblies Bekijk de inhoud van de tabel tblLeden via snelmenu, Show Table Data. Bekijk de structuur van tblLeden (of dubbelklik op de tabel). Test of je veranderingen kunt aanbrengen in de velden van tblLeden. 5.2 Een SQL-databank aanmaken in VWD Express 2008 Creëer volgende sql-database PatientenSQL.mdf, ontwerp de structuur van de tabel tblPatiëntgegevens en plaats er volgende gegevens in: VVKSO Werkgroep Handel Database-ontwerp - pagina 57 Werkwijze: • • • Maak de website Patienten aan. Er wordt onder meer een map App_Data aangemaakt. Open in de website het snelmenu van de map App_Data en kies Add New Item… Kies SQL Server Database en geef deze de naam PatientenSQL.mdf. Indien de database aangemaakt wordt in de map App_Data is deze automatisch gekoppeld aan de website. Je kunt ook het snelmenu van het project Patienten opvragen en kiezen voor Add New Item. Er volgt dan: Bemerk dat ook de database SportclubSQL.mdf beschikbaar blijft in de nieuwe website. Dit is het gevolg van het feit dat deze database niet werd geplaatst in de eigen App_Data-map. Het is zeer belangrijk dat je goed nadenkt voor je de structuur vastlegt. Later wijzigingen aanbrengen, kan behoorlijk ingewikkeld zijn en bovendien soms leiden tot gegevensverlies! • Kies het snelmenu van Tables en selecteer Add New Table en maak volgende structuur aan (zie bijlage 3 voor een overzicht van de belangrijkste types in SQL): Pagina 58 Database-ontwerp • Enkel de velden Geboortedatum, Lengte en Gewicht mogen leeg gelaten worden. De lengte is een geheel getal (smallint), het gewicht kan een decimaal gedeelte bevatten (float). • Plaats van het veld PatientID de Column Properties (Is Identity) op Yes zodat dit veld ‘autonummering’ wordt. De Identity Increment geeft aan dat de waarde voor iedere nieuwe rij met 1 verhoogd wordt en de Identity Seed geeft aan dat de teller bij 1 begint. Maak van PatientID de sleutel en sla de tabel als tblPatientgegevens op. Let steeds op het volgende: - gebruik betekenisvolle veldnamen. Uit de naam van een veld moet je de inhoud ervan kunnen afleiden; - vermijd te lange veldnamen en gebruik zo weinig mogelijk spaties. Dit laatste is vooral van belang als je vaak in expressies of code naar objecten verwijst. • Voer bovenstaande records in. Vul voor de onderstaande velden het gekozen gegevenstype in en ga na waarom die keuze gemaakt werd. Gebruik eventueel de helpfunctie voor meer uitleg over de verschillende types (Help, Search, trefwoord: types in sql). Veldnaam Gegevenstype Werknemer-ID BrutoWedde Auto InDienst Foto Bijzonderheden Gebruik steeds het gepaste gegevenstype. Een postnummer is bijvoorbeeld van het tekentype, ook al bevat het enkel cijfers, omdat je er niet mee rekent. 5.3 Relaties tussen tabellen De gegevens in de verschillende tabellen kunnen naar elkaar verwijzen via een gemeenschappelijk veld. Beide velden dienen van hetzelfde type te zijn (benaming mag verschillen). Bij referentiële integriteit kan een record van de tabel aan de veelkant maar ingevuld worden als er een overeenkomstige sleutel is in de tabel aan de éénkant. Zodoende wordt aan invoercontrole gedaan en wordt verhinderd dat onbetrouwbare gegevens in een tabel worden opgeslagen wat betekent: • • • niet-bestaande referenties kunnen dan niet ontstaan; gegevens waarnaar verwezen wordt kunnen niet verwijderd worden; sleutelwaarden die veranderen kunnen eventueel (trapsgewijs) aangepast worden. Relaties kun je maken met de Table designer of met behulp van een diagram. VVKSO Werkgroep Handel Database-ontwerp - pagina 59 5.4 Table designer Klik in de werkbalk Table Designer op het pictogram Relationships. Als oefening werken we met de databank SportclubSQL.mdf en worden relaties gelegd tussen de tabellen tblLeden en tblPostnummers, tussen tblLeden en tblInschrijvingen en tussen tblInschrijvingen en tblSporttakken. Gemeenschappelijk veld tussen de tabellen tblPostnummers en tblLeden: Primary key table Foreign key table tblPostnummers tblLeden Key: Stad Refererende sleutel: Gemeente Je vertrekt van de tabel met de refererende sleutel (foreign key) om de relatie te leggen met een primaire sleutel in een andere tabel. Kies het snelmenu van tabel tblLeden en kies voor Open Table Definition of Show Tabel Data. Kies in Table Designer de knop Relationships . Het dialoogvenster Foreign Key Relationships verschijnt. Kies Add. Elke relatie krijgt een naam. Je kunt deze zelf geven of de door het systeem gegeven naam aanvaarden. Om de relatie in te stellen (of te wijzigen) gebruik je de knop Pagina 60 bij Tables And Colums Specification. Database-ontwerp Vul de gegevens in zoals hierboven en klik OK. Kies Close. Er wordt gevraagd om de wijzigingen te bewaren. Zoek het gemeenschappelijk veld tussen de andere tabellen. Primary key table Foreign key table tblLeden tblInschrijvingen Key: Refererende sleutel: Primary key table Key: Foreign key table Refererende sleutel: Leg de ontbrekende relaties. VVKSO Werkgroep Handel Database-ontwerp - pagina 61 5.4.1 Diagrammen Relaties tussen tabellen kunnen ook gelegd worden door gebruik te maken van een diagram. Om dit te kunnen uitvoeren wissen we eerst de relaties die werden gemaakt via Designer Table. Selecteer het onderdeel Database Diagrams van SportclubSQL.mdf en kies Add New Diagram in het snelmenu. Er verschijnt: Voeg alle tabellen toe. De relaties die al bestaan worden in het diagram door verbindingslijnen voorgesteld. Je legt een relatie tussen twee tabellen door de primaire sleutel van één tabel te slepen naar een refererende sleutel van een andere tabel (om bestaande relaties te bewerken: selecteer de relatie en druk op F4.) Leg de relaties tussen de tabellen zoals hierboven. Primaire sleutel Refererende sleutel tblPostnummers(Stad) tblLeden(Gemeente) tblLeden(Nummer) tblInschrijvingen(Lidnr) tblSporttakken(Taknr) tblInschrijvingen(Taknr) Om relaties te bewerken kies je in het snelmenu van een afgebeelde tabel: Relationships... Pagina 62 Database-ontwerp Bij het sluiten van het relatievenster bevestig je de veranderingen. Daarna wordt de naam gevraagd van het diagram. Na klikken op OK, volgt: 5.5 Check constraints Om domein integriteit te ondersteunen maakt SQL server onder meer gebruik van check constraints. In PatientenSQL.mdf, tabel tblPatientgegevens wil men de maximale lengte beperken tot 250 (cm) en het maximaal gewicht tot 200 kg. Voor beide velden mogen uiteraard geen negatieve waarden ingevoerd worden. Klik op het pictogram Manage Check Constraints in Table Designer van tblPatientgegevens. Klik op Add. Voeg de beperking toe via Expression: VVKSO Werkgroep Handel Database-ontwerp - pagina 63 Leg de beperkingen op voor Lengte en Gewicht. Test een beperking uit. Er volgt voor een foutief ingevoerde lengte: In uitdrukkingen zoals Postnummer >= 1000 And Postnummer <=9999 wordt een karakterstring (Postnummer) vergeleken met een gehele waarde. Sql laat het gebruik van een impliciete omzetting van het karaktertype toe. 5.6 Standaardwaarden Standaardwaarden (defaults) vormen een toevoeging om data integriteit te ondersteunen. We beschouwen database SportclubSQL.mdf en geven een standaardwaarde aan de velden Gemeente en Geslacht van tblLeden. Je doet dit in de Table Designer. De meeste leden komen uit Ieper en zijn van het mannelijk geslacht. Deze gegevens plaatsen we als standaardwaarden. Voer eerst een check constraint in tblLeden voor het veld Geslacht: enkel V of M zijn toegestaan. Klik op het pictogram Manage Check Constraints in Table Designer van tblLeden. Selecteer het veld Gemeente en vul voor Default Value or Binding de standaardwaarde in. Pagina 64 Database-ontwerp Selecteer het veld Geslacht en vul de standaardwaarde M in. Stel in tblInschrijvingen de standaardwaarde voor het veld Betaald in op False. 5.7 Indexen 5.7.1 Inleiding Een index levert een opgeslagen structuur. SQL Express 2008 bepaalt zelf wanneer en welke index gebruikt zal worden voor het selecteren van gegevens. Door het maken van indexen in tabellen kun je de snelheid van zoekopdrachten in de tabel spectaculair verhogen. Indexen nemen uiteraard ruimte in op opslagmedia en bij het toevoegen en verwijderen van records moeten de indexen ook bijgewerkt worden. Een index vertraagt dit soort van opdrachten. Er moet dus altijd een afweging gebeuren tussen voor- en nadelen van de ingreep. SQL server kent twee soorten indexen: clustered en non-clustered. Een geclusterde index zorgt ervoor dat de rijen in de tabel fysiek geordend worden volgens de index. Er kan dus in een tabel slechts één geclusterde index bestaan. Geef je een tabel een primaire sleutel, dan wordt automatisch een geclusterde index voor deze sleutel aangemaakt. Een niet-geclusterde index kun je maken voor elk veld of combinatie van velden. Bij voorkeur kies je een index voor velden waarvoor veel selectieopdrachten bestaan. In een niet-geclusterde index voor een heap (een tabel zonder geclusterde index) wordt verwezen naar een record door zijn rijnummer in de tabel. In het andere geval wordt verwezen naar de sleutelwaarde in de geclusterde index. 5.7.2 Een index aanmaken We maken een niet-geclusterde index aan op het veld Gemeente voor de tabel tblLeden van database SportclubSQL.mdf. Selecteer het veld Gemeente. Klik op het pictogram Manage Indexes and Keys in Table Designer van tblLeden. Klik op Add. Vul de gegevens in zoals hierboven. VVKSO Werkgroep Handel Database-ontwerp - pagina 65 5.8 Tabelaanpassingen 5.8.1 Rijen aanpassen • Velden of rijen verwijderen Selecteer de rij en - • druk op de Delete-toets snelmenu en Delete Column Velden of rijen verplaatsen Selecteer de rij met de rijknop. Sleep dan de geselecteerde rij naar de gewenste positie. • Velden of rijen invoegen Selecteer de rij waarvoor je een veld wenst in te voegen en - 5.8.2 • Snelmenu en kies voor Insert Column Primaire sleutel Eén veld of meerdere velden als primaire sleutel instellen: - selecteer het veld of de meerdere velden kies het snelmenu en klik op Set primary Key - klik op het pictogram Table Designer. of van de werkbalk Het kiezen van een primaire sleutel heeft volgende voordelen: − je kunt nooit twee records met dezelfde waarde voor dat veld (of combinatie van velden) tegenkomen; − het sorteren en opzoeken volgens dit veld gaat aanzienlijk sneller; − de tabel wordt gerangschikt volgens de waarde van de primaire sleutel. 5.9 Oefeningen 1 Hoeveel primaire sleutels kan een tabel hebben? 2 Een primaire sleutel bestaat uit meerdere velden. Hoe kun je die primaire sleutel toekennen? Hoe ga je praktisch te werk als deze velden niet naast elkaar liggen? Pagina 66 Database-ontwerp 6 Speciale technieken 6.1 Join-eigenschappen 6.1.1 Een tabel koppelen met zichzelf Beschouw de database ArtemisSQL.mdf. Bij het koppelen van een tabel met zichzelf maak je gebruik van een Alias. Voer de volgende SELECT-instructie uit. SELECT TOP (100) PERCENT dbo.tblWerknemers.Familienaam, dbo.tblWerknemers.Voornaam, tblWerknemers_1.Familienaam AS Expr1, tblWerknemers_1.Voornaam AS Expr2 FROM dbo.tblWerknemers INNER JOIN dbo.tblWerknemers AS tblWerknemers_1 ON dbo.tblWerknemers.BrutoWedde < tblWerknemers_1.BrutoWedde ORDER BY dbo.tblWerknemers.Familienaam, dbo.tblWerknemers.Voornaam Je bent hier natuurlijk verplicht volledige kolomnamen te gebruiken omdat er verwarring mogelijk is. Wat ‘vergelijkt’ deze SELECT-instructie? Bewaar de view: 6.1.2 Verbinding op meer dan 1 veld Maak een view ZelfdeStraatView van de klanten die in dezelfde straat wonen. Dezelfde straatnamen kunnen in meerdere gemeenten voorkomen. Er moet dus een verbinding gemaakt worden zowel op Straat als op Gemeente. Om dubbele gegevens te vermijden zorgen we ervoor dat - per rij - de eerste naam alfabetisch kleiner is dan de tweede naam. VVKSO Werkgroep Handel Database-ontwerp - pagina 67 De volgende SQL-instructie toont het gevraagde: SELECT TOP (100) PERCENT dbo.tblKlanten.Naam, dbo.tblKlanten.Straat, dbo.tblKlanten.Gemeente, tblKlanten_1.Naam AS Expr1, tblKlanten_1.Straat AS Expr2, tblKlanten_1.Gemeente AS Expr3 FROM dbo.tblKlanten INNER JOIN dbo.tblKlanten AS tblKlanten_1 ON dbo.tblKlanten.Gemeente = tblKlanten_1.Gemeente AND dbo.tblKlanten.Straat = tblKlanten_1.Straat AND dbo.tblKlanten.Naam < tblKlanten_1.Naam ORDER BY dbo.tblKlanten.Naam 6.1.3 Meer dan 2 tabellen gebruiken Maak de view KostprijsPerOrderView die de kostprijs van de producten per order weergeeft. De INNER JOIN’s zijn genest. Pas de SELECT-instructie aan zo dat per order de klantnaam getoond wordt en het factuurbedrag weergegeven wordt. Hou hierbij rekening met een winstpercentage van 33 % en de korting. Rangschik volgens de klantnaam. Voeg de tabel tblKlanten bij via Add Table. Pagina 68 Database-ontwerp Bewaar als FactuurbedragPerOrderView. 6.1.4 Oefeningen Vooraf: beschouw Stamboom.mdb. Zet de database om in de Sql-databank StamboomSQL.mdf. Om een migratie naar SQL Server 2008 uit te voeren kun je volgende tool downloaden: http://www.microsoft.com/downloads/details.aspx?FamilyId=133B59C2‐C89C‐4641‐BEBB‐ 6D04476EC1BA&displaylang=en Na registratie kun je de migratie uitvoeren. De data komt steeds terecht in de DATA-map van Microsoft SQL server. Vergeet de queries niet mee te migreren. Inhoud van tblFamilieleden (via snelmenu van de tabel, Show Table Data): VVKSO Werkgroep Handel Database-ontwerp - pagina 69 Verklaring: de vader van Abeels Aldegonde is persoon met ID 2 d.i. Abeels Alex. Haar moeder is Martens Mia. 1. Maak een view ZelfdeStraatView van familieleden die in dezelfde straat wonen: Dezelfde straatnamen kunnen in meerdere gemeenten voorkomen (zie Keizerlei in Antwerpen en Tongeren). Er moet dus een verbinding gemaakt worden zowel op Straat als op Gemeente. Kun je er voor zorgen dat de dubbele namen verdwijnen? Je hoeft slecht 1 kleine aanpassing te doen! Oplossing: Verdere uitwerking Maak nu StamboomView die in de eerste kolom de namen plaatst van alle familieleden uit de tabel. Als de vader of moeder voorkomt in de tabel wordt de naam afgedrukt. Hints: - Voeg in de view de tabel tblFamilieleden driemaal toe en koppel de tabellen zodat je een relatie kunt leggen voor de gegevens van de vader en een relatie voor de gegevens van de moeder. - Pas ook de join-eigenschappen aan. Pagina 70 Database-ontwerp Resultaat: 6.2 Niet-genormaliseerde gegevensgroepen normaliseren 6.2.1 Gegevens worden in rijen herhaald Beschouw de eerder besproken tabel tblBestellingen van Sql-database AankopenSQL.mdf. De tabel bevat nu geen duplicaten meer en elke cel is atomair. We werken NV1 uit. In de records komen gegevens voor die in rijen worden herhaald. De gegevens die herhaald worden dienen we te splitsen in twee tabellen. We leggen een relatie tussen beide tabellen aan de hand van een gemeenschappelijk veld. Hoe de tabel splitsen in twee tabellen (er zijn andere mogelijkheden)? Stap 1: maak een selectiequery met daarin de velden waarvan de inhoud in de rijen wordt herhaald (NaamLev, Tel, Straat, Postc en Plaats). Ga naar de eigenschappen van de query en vraag enkel de unieke waarden op (= Distinct Values). Sorteer eventueel op NaamLev. We bekomen de Sql-opdracht: SELECT DISTINCT NaamLev, Tel, Straat, Postc, Plaats FROM tblBestellingen ORDER BY NaamLev Verander de selectiequery via Change Type in een tabelmaakquery Make Table… Geef de aan te maken tabel een gepaste naam, in ons geval tblLeveranciers. VVKSO Werkgroep Handel Database-ontwerp - pagina 71 Deze tabel wordt de tabel aan de éénzijde. Voer de query uit Controleer de inhoud van de aangemaakte tabel (snelmenu van tblLeveranciers, Show Table Data): Stap 2: ga naar het tabelontwerp van tblLeveranciers (dubbelklik op de tabel) en voeg een Autonummeringsveld Id toe. Verander de Column Properties (Is Identity) in onderdeel Identity Specification in Yes. Increment 1 betekent dat de stapwaarde 1 is, Seed betekent startwaarde 1. Maak dit veld sleutelveld. Stap 3: ga naar het oorspronkelijke tabelontwerp en voeg een veld toe (bv LevNummer) van het type numeriek int (voor verdere types: zie bijlage). Stap 4: ontwerp een nieuwe query gebaseerd op beide tabellen. Leg in het queryscherm een relatie tussen een veld uit de tabel aan de éénzijde en een veld uit de oorspronkelijke tabel waarvan de inhoud overeenstemt. In de één-tabel moet de inhoud van dit veld uniek zijn. Plaats nu het veld LevNummer in het queryrooster. Dit veld is nog leeg. Wijzig de query in een bijwerkquery (Update). Pagina 72 Database-ontwerp Er verschijnt: en vul bij New Value het volgende in: Id. Voer de query uit. Er verschijnt: Test of het veld Nummer van tblBestellingen de correcte leveranciersnummers bevatten. Stap 5: verwijder in de hoofdtabel tblBestellingen alle velden (behalve het veld LevNummer) die voorkomen in tblLeveranciers. Het veld LevNummer mag niet worden verwijderd omdat het nodig is om de relatie tussen de twee tabellen te garanderen. Stap 6: leg een relatie tussen beide tabellen via de knop Relationships. VVKSO Werkgroep Handel Database-ontwerp - pagina 73 6.2.2 Gegevens worden in kolommen herhaald We werken de normalisatie uit aan de hand van database ElzaSQL.mdf. Hierin vind je de niet genormaliseerde tabel tblNietGenormaliseerd. In deze tabel komen meerdere kolommen voor die worden herhaald. Deze kolommen hebben inhoudelijk dezelfde gegevens. We splitsen bijgevolg tblFacturen in twee tabellen. Een tabel splitsen in twee tabellen kan als volgt: (er zijn andere mogelijkheden): Stap 1: in tblNIetGenormaliseerd moet een veld met unieke waarden (sleutelveld) aanwezig zijn om later een relatie te kunnen leggen. Indien er nog geen sleutel is, voeg je een nieuw autonummeringsveld toe en maak je van dit veld een sleutelveld. Vermits tabel tblNietGenormaliseerd reeds een sleutelveld heeft, namelijk Factuurnummer hoef je hier verder niets te doen. Stap 2: kopieer de tabel tblNietGenormaliseerd (via de actiequery Make Table… en geef het vb. de naam tblFacturen. In het tabelontwerp van deze nieuwe tabel verwijder je alle kolommen die meerdere malen voorkomen. De tabel aan de éénzijde is nu in orde volgens NV1. Stap 3: maak in het databasevenster een kopie van de tblNietGenormaliseerd en wijzig de naam in een gepaste naam, bv. tblBestellingBlok1. Ga naar het tabelontwerp van deze tabel en verwijder alle kolommen behalve het sleutelveld en het eerste blok van de herhalende gegevens. Wijzig de instellingen van het sleutelveld (geen sleutelveld, geen autonummering, niet geïndexeerd). Het ontwerp van de tabel aan de veelzijde is nu in orde. Stap 4: maak in het databankoverzicht opnieuw een kopie van de hoofdtabel en wijzig de naam in een gepaste naam, bv. tblBestellingBlok2. Ga naar het tabelontwerp en verwijder alle kolommen behalve het sleutelveld en het tweede blok van de herhalende gegevens. Wijzig desnoods de veldnamen in tblBestellingBlok2 zodat ze identiek zijn aan de veldnamen die gebruikt worden in de tblBestellingBlok1 (dit vergemakkelijkt de te maken toevoegquery maar is niet noodzakelijk). Maak een toevoegquery waarin alle overgebleven velden staan en voeg deze records toe aan tblBestellingBlok1. Voer de query uit. Herhaal stap vier indien er nog herhalende blokken voorkomen in de hoofdtabel (derde blok, vierde blok). Stap 5: verwijder de oorspronkelijke tabel en tblBestellingBlok2 t/m tblBestellingBlok4. Behoud tblFacturen en tblBestellingBlok1. Wijzig de naam tblBestellingBlok1 in tblBestelling. Verwijder in tblBestelling de records waarvan enkel het vroegere sleutelveld is ingevuld (met behulp van een verwijderquery). Stap 6: leg een relatie tussen de tabellen tblFacturen en tblBestelling. Hoe moet het nu verder voor tblArtikelen en tblKlanten? Leg alle relaties tussen de 4 tabellen. Pagina 74 Database-ontwerp 7 Bijlagen 7.1 Bijlage 1. Een bestaande Access-databank converteren naar een SQL-databank Je kunt een MS Access database transformeren naar een Microsoft SQL Server database met behulp van de Wizard Upsize van MS Access 2007 Ook in Access 2003 kun je bestaande Access-bestanden converteren naar SQL-databanken. Open de databank Sportclub.mdb in Microsoft Office 2003. Via de menukeuze Extra, Databasehulpprogramma’s, Wizard Upsize start je de wizard voor deze conversie. Volg deze wizard. De SQL databank krijgt standaard de naam van de Access-databank gevolgd door SQL. In onderstaande nota’s wordt de volledige werkwijze voor MS Access 2007 overlopen. Open in Microsoft Access 2007 de databank Sportclub.mdb. Activeer de menu-optie Hulpmiddelen voor databases en vervolgens SQL Server. De Wizard Upsize verschijnt. Kies Nieuwe database maken en klik Volgende. VVKSO Werkgroep Handel Database-ontwerp - pagina 75 Zoals je bemerkt krijgt de nieuwe SQL-databank standaard de naam van de Access-databank gevolgd door SQL. Klik op Volgende. Exporteer alle tabellen en klik op Volgende. Klik op de knop Volgende. Pagina 76 Database-ontwerp Kies Nieuwe Access-client/servertoepassing maken en klik op Volgende. Met deze laatste twee instellingen vraag je een Access-Project te maken en dat bestand te openen. In een Access-Project kan een SQL-databank worden aangesproken en bewerkt. Hierin maakt Access een verbinding met de databank op de SQL Server. Er volgt nog: Bij deze convertie komt het vaak voor dat aan het ontwerp van een tabel een veld met naam upsize_ts van het type TimeStamp wordt toegevoegd. Je kunt dit veld verwijderen omdat het geen relevante informatie bevat. VVKSO Werkgroep Handel Database-ontwerp - pagina 77 Bij geslaagde conversie zie je: Pagina 78 Database-ontwerp 7.2 Bijlage 2. Korte samenvatting van Sql-commando’s 7.2.1 Selectiequery’s <SELECT-instructie> ::= <SELECT-component> <FROM-component> [ <WHERE-component> ] [ <GROUP-BY-component> [ <HAVING-component> ] ] [ <ORDER-BY-component> ] SELECT ... FROM ... In de SELECT-component wordt gespecificeerd welke kolommen worden getoond. Elke SELECTinstructie bestaat minstens uit 2 componenten: SELECT en FROM. De andere componenten zijn optioneel. Na SELECT worden de velden opgesomd, na FROM worden de tabellen vermeld waar de velden zich bevinden. SELECT ... FROM ... ORDER BY ... ORDER BY sorteert de rijen op basis van een veld of velden (ASCending of DESCending). SELECT ... FROM ... WHERE ... WHERE selecteert de rijen met een voorwaarde SELECT ... FROM ... GROUP BY ... HAVING ... De GROUP BY-component groepeert de rijen op basis van gelijke waarden in kolommen (velden). Rijen worden gegroepeerd als ze in de betreffende kolom dezelfde waarde hebben. De component HAVING is enigszins vergelijkbaar met de WHERE-component. Het verschil is dat de WHERE-component betrekking heeft op het tussenresultaat van de FROM-component en HAVING op het gegroepeerd tussenresultaat van de GROUP BY-component. Het effect is wel hetzelfde, ook in de HAVING-component worden rijen met behulp van een voorwaarde geselecteerd. De volgorde van de componenten staat vast. Een GROUP BY-component mag nooit vóór een WHERE- of FROM-component staan en de ORDER BY-component is (bij gebruik) altijd de laatste. Een HAVING-component mag alleen gebruikt worden als een GROUP BY-component gebruikt wordt. VVKSO Werkgroep Handel Database-ontwerp - pagina 79 7.2.2 Actiequeries Een record toevoegen aan de tabel: INSERT INTO Syntax 1: INSERT INTO <tabelnaam> VALUES (<waarde1>, <waarde2>, ...) Indien je echter niet alle velden direct een waarde wenst te geven dan kun je volgende syntax gebruiken . Syntax 2: INSERT INTO <tabelnaam> (<veldnaam1>, <veldnaam2>, ...) VALUES (<waarde1>, <waarde2>, ...) De integriteitregels moeten toestaan dat er een aantal velden niet ingevuld worden, Een nieuwe tabel maken en de inhoud van een andere tabel er in kopiëren: SELECT INTO Wanneer er gewerkt wordt met autonummeringsvelden (op SQL Server noemt dit type Identity), dan geef je bij het toevoegen van een nieuw record nooit een waarde mee met dit veld. SELECT … INTO FROM Een record wijzigen in de tabel: UPDATE De UPDATE-instructie laat toe om met 1 instructie gegevens binnen 1 of meerdere records te wijzigen. Syntax: UPDATE <tabelnaam> SET <veldnaam1> = <waarde1>, <veldnaam2> = <waarde2>, ... WHERE <voorwaarde> Deze instructie wordt hoofdzakelijk gebruikt voor back-up doeleinden of om tabellen (al dan niet in hun geheel) van de ene database naar de andere database te kopiëren. In zijn eenvoudigste vorm kopieert de instructie dus een volledige tabel. Een record verwijderen uit een tabel: DELETE FROM Syntax: DELETE FROM <tabelnaam> WHERE <voorwaarde> Het is mogelijk, mits het aanpassen van de voorwaarde, meerdere records in 1 keer te wissen. Wil je alle records uit een tabel wissen, laat dan de WHERE-clausule weg. Pagina 80 Database-ontwerp 7.3 Bijlage 3. Lijst met belangrijkste types SQL Data Type Access Data Type/Vb bigint Omschrijving Geheel getal tussen -9 223 372 036 854 775 808 (-2^63) en 9 223 372 036 854 775 807 (2^63 - 1) bit Boolean 0 of 1 (True of False) money, small money Currency Getal in geldeenheid datetime, smalldatetime DateTime Datum en tijd van 1 januari 1753 tot 31 december 9999 (met een nauwkeurigheid van 3.33 milliseconden (datetime) Datum en tijd van 1 januari 1900 tot 6 juni 2079 met nauwkeurigheid van 1 minuut (smalldatetime) float Single of Double Vlottende precisie getallen met bereik: -1.79E + 308 tot -2.23E - 308, 0 en 2.23E + 308 tot 1.79E + 308 int Long Geheel getal tussen -2 147 483 648 (-2^31) en 2 147 483 647 (2^32 - 1) ncharvar String (16-bitkarakterset) String van variabele lengte. De maximale grootte moet bepaald worden bij het definiëren van de kolom (nvarchar(max)) uniqueidentifier Guid (ReplicationID) Sleutel ook wel Globaly Unique Identifier (Guid) genoemd. Bedoeld om rijen uniek te identificeren varbinary Array van byte Binaire data zoals afbeeldingen en bestanden varchar String (8-bitskarakterset) String van variabele lengte. De maximale grootte moet bepaald worden bij het definiëren van de kolom. Maximum is 8000 tekens tinyint Byte Geheel getal van 0 t/m 255 smallint Integer Geheel getal tussen -32 768 (-2^15) en 32 767 (2^15 -1) real Single Decimaal getal met bereik: -3.40E + 38 tot -1.18E - 38, 0 en 1.18E - 38 tot 3.40E + 38 decimal of numeric Decimal Decimaal getal met bepaalde nauwkeurigheid gelegen tussen -10^38 +1 through 10^38 –1 char Char Vaste lengte (geen unicode) met maximum lengte van 8000 tekens timestamp VVKSO Werkgroep Handel Een uniek getal dat geüpdated wordt telkens een rij wordt veranderd Database-ontwerp - pagina 81 text Variabele lengte (geen unicode) met een maximum lengte van 2^31 - 1 (2 147 483 647) tekens image Binaire gegevens met variabele lengte met een maximum lengte van 2^31 - 1 (2 147 483 647) bytes nchar Gegevens met vaste lengte (unicode) met een maximum lengte van 4,000 tekens ntext Memo Gegevens met variabele lengte (unicode) met maximum lengte van 2^30 - 1 (1 073 741 823) tekens De types ntext, text en image zijn verouderd en zullen in de toekomst wegvallen. Gebruik als alternatief de types nvartext(MAX), varchar(MAX) en varbinary. Pagina 82 Database-ontwerp