Database Design

7
2011 R.G. van Voorthuizen LOI Hogeschool 29-7-2011 Praktijkopdracht Database Design Advanced 992H10

description

Opdracht voor LOI Hogeschool

Transcript of Database Design

Page 1: Database Design

2011

R.G. van Voorthuizen

LOI Hogeschool

29-7-2011

Praktijkopdracht Database Design Advanced

992H10

Page 2: Database Design

)

Inhoud Requirementsanalyse................................................................................................................................................................................................................................................. 1

Wensen adminstrateur: ......................................................................................................................................................................................................................................... 1

Wensen ondernemer: ............................................................................................................................................................................................................................................ 1

Entiteiten & attributen: ......................................................................................................................................................................................................................................... 1

Conceptueel Datamodel ............................................................................................................................................................................................................................................ 2

Logisch ontwerp ......................................................................................................................................................................................................................................................... 3

Logisch datamodel ................................................................................................................................................................................................................................................. 3

Vertaling naar SQL.................................................................................................................................................................................................................................................. 3

Fysiek ontwerp ........................................................................................................................................................................................................................................................... 5

Performance .......................................................................................................................................................................................................................................................... 5

Ontsluiting .............................................................................................................................................................................................................................................................. 5

Beveiligingsmodel ...................................................................................................................................................................................................................................................... 5

Requirementsanalyse

Wensen adminstrateur:

-Maandelijks genereren van facturen voor de lessen van de afgelopen maand

-2x per jaar inplannen van lesrooster

-2x per jaar inplannen van lokaaltoewijzing, gekoppeld aan lesrooster

-Genereren van overzichten deling der omzet tussen de ondernemers.

Wensen ondernemer:

-rapportage draaien van eigen leerlingen, omzet e.d.

Entiteiten & attributen:

2 ondernemers huren samen 5 muzieklokalen en ieder huurt 0, 2 of 3 extra docenten in

1 ondernemer huurt 1 danslokaal

-Persoon: persoonsnr., voornaam, tussenvoegsel, achternaam, straatnaam, postcode, plaatsnaam, telefoonnummer, E-mailadres

-Ondernemer: alle attributen van Persoon, ondernemernr.

-Docent: alle attributen van Persoon, docentnr. , specialiteit

-Leerling: alle attributen van Persoon, leerlingnr. , leeftijd

-Administrateur: alle attributen van Persoon, administrateurnr.

-Kantoorpand: straatnaam, postcode, plaatsnaam

-Lokaal: lokaalnr, naam

-Apparatuur: apparaatnr., naam

-Les: lesnr. , lessoort, benodigdheden, kosten, tijdstip, duur

Page 3: Database Design

)

Conceptueel Datamodel

Page 4: Database Design

)

Logisch ontwerp

Logisch datamodel

Page 5: Database Design

)

Vertaling naar SQL

CREATE TABLE lesgegevens ( lessoort ENUM('Zang','Keyboard','Drum','Dans','Gitaar','Verhuur') NOT NULL, leskosten INTEGER ); ALTER TABLE lesgegevens ADD CONSTRAINT PK1 PRIMARY KEY(lessoort); CREATE TABLE les ( lesnr INTEGER NOT NULL, persoonnr INTEGER NOT NULL, lokaalnaam ENUM('Rood','Geel','Groen','Orange','Paars','Danslokaal') NOT NULL, lessoort ENUM('Zang','Keyboard','Drum','Dans','Gitaar','Verhuur') NOT NULL, periodevan DATETIME NOT NULL, //datum en tijdstip van begin van de les periodetot DATETIME NOT NULL //datum en tijdstip van eind van de les ); ALTER TABLE les ADD CONSTRAINT PK1 PRIMARY KEY(lesnr); CREATE TABLE deelname ( lesnr INTEGER NOT NULL, persoonnr INTEGER NOT NULL ); ALTER TABLE deelname ADD CONSTRAINT PK1 PRIMARY KEY(lesnr, persoonr); CREATE TABLE persoon ( persoonnr INTEGER NOT NULL, voornaam VARCHAR(50) NOT NULL, tussenvoegsel VARCHAR(10), achternaam VARCHAR(50) NOT NULL, geslacht ENUM('Man','Vrouw','Overig'), straatnaam VARCHAR(50), huisnummer INTEGER, postcode VARCHAR(6), woonplaats VARCHAR(50), maandsalaris INTEGER, rekeningnummer INTEGER ); ALTER TABLE persoon ADD CONSTRAINT PK1 PRIMARY KEY(persoonnr); CREATE TABLE lesbevoegdheid ( persoonnr INTEGER NOT NULL, lessoort ENUM('Zang','Keyboard','Drum','Dans','Gitaar','Verhuur') NOT NULL ); ALTER TABLE lesbevoegdheid ADD CONSTRAINT PK1 PRIMARY KEY(persoonnr); CREATE TABLE rollen ( persoonnr INTEGER NOT NULL, rol ENUM('Administrateur','Docent','Ondernemer','Leerling','Externe') NOT NULL ); ALTER TABLE rollen ADD CONSTRAINT PK1 PRIMARY KEY(persoonnr); CREATE TABLE inhuur ( ondernemernr INTEGER NOT NULL, persoonnr INTEGER NOT NULL ); ALTER TABLE inhuur ADD CONSTRAINT PK1 PRIMARY KEY(ondernemernr, persoonnr); CREATE TABLE lokaal ( lokaalnaam ENUM('Rood','Geel','Groen','Orange','Paars','Danslokaal') NOT NULL ); ALTER TABLE lokaal ADD CONSTRAINT PK1 PRIMARY KEY(lokaalnaam); CREATE TABLE lesmogelijkheid ( lessoort ENUM('Zang','Keyboard','Drum','Dans','Gitaar','Verhuur') NOT NULL, lokaalnaam ENUM('Rood','Geel','Groen','Orange','Paars','Danslokaal') NOT NULL ); ALTER TABLE lesmogelijkheid ADD CONSTRAINT PK1 PRIMARY KEY(lokaalnaam); ALTER TABLE lesmogelijkheid ADD CONSTRAINT FK1 FOREIGN KEY(lokaalnaam) REFERENCES lokaal; ALTER TABLE les ADD CONSTRAINT FK1 FOREIGN KEY(persoonnr) REFERENCES persoon; ALTER TABLE les ADD CONSTRAINT FK2 FOREIGN KEY(lokaalnaam) REFERENCES lokaal; ALTER TABLE les ADD CONSTRAINT FK3 FOREIGN KEY(lessoort) REFERENCES lesgegevens; ALTER TABLE deelname ADD CONSTRAINT FK1 FOREIGN KEY(lesnr) REFERENCES les; ALTER TABLE deelname ADD CONSTRAINT FK2 FOREIGN KEY(persoonnr) REFERENCES persoon; ALTER TABLE lesbevoegdheid ADD CONSTRAINT FK1 FOREIGN KEY(persoonnr) REFERENCES persoon; ALTER TABLE rollen ADD CONSTRAINT FK1 FOREIGN KEY(persoonnr) REFERENCES persoon; ALTER TABLE inhuur ADD CONSTRAINT FK1 FOREIGN KEY(ondernemernr) REFERENCES persoon(persoonnr); ALTER TABLE inhuur ADD CONSTRAINT FK2 FOREIGN KEY(persoonnr) REFERENCES persoon;

Page 6: Database Design

)

Fysiek ontwerp

Performance

DBMS zal zelf zorgen voor caching van vaak benaderde pages voor het lezen van gegevens.

De database kan het beste “in de cloud” gehost worden, dus bij een bedrijf dat meerdere servers beheerd in datacenters.

Dit geeft de beste en meest betrouwbare prestaties en veiligheid (dus continuïteit).

Als het DBMS niet al automatisch een index creëert op de Primary Key, zullen de volgende statements nog gegeven moeten worden:

CREATE UNIQUE INDEX persoon_index USING BTREE ON persoon(persoonnr); CREATE UNIQUE INDEX lesnr_index USING BITMAP ON les(lesnr); CREATE UNIQUE INDEX lespersoon_index USING BTREE ON les(persoonnr); CREATE UNIQUE INDEX lesgegevens_index USING BTREE ON lesgegevens(lessoort); CREATE UNIQUE INDEX deelname_index USING BTREE ON deelname(persoonnr); CREATE UNIQUE INDEX lesbevoegdheid_index USING BTREE ON lesbevoegdheid(persoonnr); CREATE UNIQUE INDEX rollen_index USING BTREE ON rollen(persoonnr); CREATE UNIQUE INDEX inhuur_index USING BTREE ON inhuur(ondernemernr); CREATE UNIQUE INDEX lokaal_index USING BTREE ON lokaal(lokaalnaam);

Ontsluiting

Ik heb er voor gekozen om uitsluitend storend procedures te gebruiken voor de ontsluiting van de database, om zodoende de applicatie volledig af te schermen van de

interne database-structuur en zo een eenduidig beveiligingsmodel op te kunnen stellen.

Wens Stored Procedure

Genereren van facturen voor de lessen van de afgelopen periode (maandelijks). Factuuroverzicht

Inplannen van lesrooster, 2x per jaar. Lesplanning

Inplannen van lokaaltoewijzing, gekoppeld aan het lesrooster, 2x per jaar. Lesplanning

Genereren van overzichten welke ondernemer welk deel van de omzet krijgt. Omzetoverzicht / Mijnomzetoverzicht

CREATE PROCEDURE factuuroverzicht BEGIN

SELECT persoon.persoonnr, persoon.voornaam, persoon.tussenvoegsel, persoon.achternaam, persoon.staatnaam, persoon.huisnummer, persoon.postcode, persoon.woonplaats FROM Persoon, Deelname, Les WHERE MONTH(Les.periodeVan) = ( MONTH(CURRENT_TIMESTAMP) – 1); //alle lessen vorige maand AND Les.lesnr = Deelname.lesnr //equi-join alle bijbehorende deelnames AND persoon.persoonnr = deelname.persoonnr //equi-join alle bijbehorende personen

END

CREATE PROCEDURE lesplanning ( IN docent INTEGER IN leerling INTEGER IN lesnr INTEGER

IN lokaal ENUM(rood, geel, groen, oranje, paars, danslokaal) IN lessoort ENUM(zang, keyboard, drum, dans, gitaar, verhuur) IN PeriodeVan DATETIME IN PeriodeTot DATETIME

) BEGIN INSERT INTO Les (Persoonnr, lokaalnaam, lessoort, PeriodeVan, PeriodeTot) VALUES (@@docent, @@lokaal, @@lesoort, @@PeriodeVan, @@PeriodeTot) INSERT INTO Deelname (lesnr, persoonnr) VALUES (@@lesnr, @@leerling)

END CREATE PROCEDURE omzetoverzicht ( IN docent INTEGER ) BEGIN SELECT COUNT leskosten FROM Lesgegevens, Les WHERE les.lessoort = lesgegevens.lessoort AND persoonnr = @@docent

END CREATE PROCEDURE mijnomzetoverzicht BEGIN SELECT COUNT leskosten FROM Lesgegevens, Les WHERE les.lessoort = lesgegevens.lessoort AND persoonnr = @@huidige_gebruiker //@@huidige_gebruiker representeert dus de ingelogde gebruiker

END

CREATE PROCEDURE lesrooster BEGIN

SELECT les.persoonnr docent, deelname.persoonnr leerling, les.lokaalnaam, les.lessoort, periodeVan, periodeTot

FROM Les, Deelname WHERE deelname.lesnr = les.lesnr AND periodeVan > CURRENT_TIMESTAMP END

Page 7: Database Design

)

Beveiligingsmodel

Omdat op databaseniveau geen rechten kunnen worden gekoppeld aan de inhoud van tabellen, heb ik ervoor gekozen om bevoegdheden te definiëren op applicatieniveau.

In de wensen staat namelijk gespecificeerd dat de 3 ondernemers elkaar weliswaar vertrouwen, maar geen inzicht aan elkaar willen geven in hun gegevens over leerlingen

en omzet e.d.

Op databaseniveau worden wel berperkingen aangebracht voor diverse tabellen, zodat tweetrapsbeveiliing ontstaat.

Rollen: Bevoegdheden:

Docent Eigen gegevens, lessen, omzet kunnen inzien

Administrateur Alle gegevens, lessen, omzet kunnen inzien en aanpassen

Websitegebruiker Lesrooster kunnen inzien

Role based accces op functieniveau tbv wensen administrateur:

GRANT SELECT, INSERT, DELETE, UPDATE ON Persoon, Les, Inhuur TO Administrateur

Role based access op inhoud, tbv wensen van docenten en websitegebruikers:

GRANT EXECUTE ON factuuroverzicht, lesplanning, omzetoverzicht TO Administrateur GRANT EXECUTE ON mijnomzetoverzicht TO Ondernemer GRANT EXECUTE ON lesrooster TO Administrateur, Docent, Ondernemer, Leerling, Externe