Air Crash Booking System

Størrelse: px
Starte visningen fra side:

Download "Air Crash Booking System"

Transkript

1 Air Crash Booking System Eksamensopgave i Databaser (ddb), E06 Vejleder: Louis Salvail Afleveret 27. oktober 2006 af: Jens Gram Pedersen, , mail@jensgram.dk 28 nummererede sider

2 I N D H O L D S F O R T E G N E L S E INDLEDNING...1 E/R-DAIGRAM & ENTITETSSÆT...2 Overvejelser i forbindelse med modellen... 4 CONSTRAINTS, DATABASE-SCHEMA & DOMÆNER...6 Nøgler... 6 Single-Value begrænsninger...6 Referentiel integritet... 6 Andre begrænsninger...6 Relationelt database-schema & domæner...7 FD'ER & RELATIONEL ALGEBRA... 8 Funktionelle afhængigheder...8 Relationel algebra (opgaver fra ugeseddel)... 9 SQL, INDEKSER & SIKRING MOD OVERBOOKING...12 Oprettelse af tabeller og constraints i SQL...12 Indekser...15 Sikring mod overbooking Oversættelse af relationel algebra til SQL (opgaver fra ugeseddel)...16 Yderligere opgaver fra ugesedlen JAVA-INTERFACET, PROBLEMER & TRANSAKTIONER Brug af Java-interfacet...19 Problemer...19 Brug af transaktioner...20 DISKUSSION AF DESIGN & ÆNDRINGER Løbende ændringer & revideringer...22 Assertions & triggers Brugere & autorisationer...25 KONKLUSION & DISKUSSION REFERENCER... 28

3 I N D L E D N I N G Denne opgave omhandler det endelige system, der er udarbejdet i løbet af kurset. Opgavens første del er en sammenskrivning af de løbende aflevering ud fra den endelig databasemodel. De overordnede afsnit er derfor baseret på de løbende afleveringer, men tilrettet til at afspejle den endelige model. Opgavens anden del indeholder behandling af de problemstillinger, der blev præsenteret i forbindelse med eksamensopgaven. Air Crash Booking System er et databasebaseret system, der kan håndtere flyafgange, passagerer, lufthavne, reservation, sæde-bookinger m.v. Dertil hører en Java-applikation, der muliggør bestilling af billetter, oprettelse af nye afgange, samt yderligere adminstration. Air Crash er et fiktivt luftfartsselskab, der tilbyder rejser i mindre fly. Det betyder, at der er plads til mellem 5 og 20 personer på de forskellige afgange. Ikke desto mindre skal systemet kunne håndtere frequent flyers, elektroniske billetter etc. De specifikke krav diskuteres sammen med den følgende gennemgang af systemet. - 1 af 28 -

4 E / R - D A I G R A M & E N T I T E T S S Æ T Gennem arbejdet med Air Crash systemet, er den endelige databasestruktur endt som illustreret på nedenstående E/R-diagram: letter num r rightseat Aircrafts contains Seats nextto leftseat applies-to reserves fcendsr ow arrival id Schedules flies-to flies-from Airports nam e code departure for located-at country street zip zip ETickets country Addresses zip ZipCodes enum ber nam e city state holds Passengers lives-at freqflyern o Illustration 1: E/R-diagram for Air Crash Booking System. Relationer markeret med udfyldte pile angiver én-til-mange (og én-til-én) relationer, hvor der påkræves referentiel integritet. Mere herom senere. Relationen mellem ETickets og Seats kræver er blot en maksimalt én relation og pilen er derfor ikke udfyldt. Systemet baserer sig således på 8 entitetssæt: Aircrafts: Dette entitetssæt indeholder et sæt af fly, der udgør Air Crash's samlede flåde. Hvert fly har et unikt nummer, der kunne være på formen YZ 192 etc. Dette entitetssæt kunne desuden indeholde mere specifikke flydata (model, fabrikant, maksimal kapacitet), men disse aspekter har jeg ignoreret i denne sammenhæng. Seats: Idéen bag dette entitetssæt er, at en entitet i Seats modsvarer et konkret sæde i et af selskabets fly (med bogstav og række 1 ). Det vil sige, at et sæde, der findes i virkeligheden 1 ROW er et reserveret ord i Oracle, så række-attributten har fået navnet r. id - 2 af 28 -

5 også findes én gang i databasen. Sæder er en svag entitet, da en del af nøglen gives gennem relationen til Aircrafts ( contains kræver referentiel integritet, da ethvert sæde nødvendigvis skal knytte sig til et fly ellers kan det ikke identificeres og det vil desuden ikke give mening at have et sæde, der ikke er knyttet til et fly). Jeg har valgt at lade hvert Seat indgå i en relation ( nextto ), der knytter et sæde til nabosædet (-erne). Man kunne også have beregnet, hvilket sæder, der er ved siden af et givent sæde via bogstaverne, men jeg finder den valgte modellering mere alsidig og korrekt. Et sæde, der ikke indgår i en nextto-relation som eksempelvis rightseat må nødvendigvis være en vinduesplads i venstre side af flyet. Addresses: En adresse er et sæt bestående af gade (dækker over vejnavn og husnummer), land og postnummer. Adresser er internationale, hvorfor et ikke-dansk element stat er medtaget. Oprindeligt var by og stat attributter på Addresses-sættet, men gennem applicering af principperne for BCNF (Boyce-Codd Normal Form) blev det tydeligt, at det kunne give anledning til anomalier (by og stat afhænger af postnummer og land, jf. afsnittet Funktionelle afhængigheder, s. 8. I Addresses fungerer gade, postnummer og land som nøgle (jeg forudsætter, at Lufthavnsboulevarden 6 i 2770, DK er unik). Grunden til, at adresser er et selvstændigt entitetssæt er, at en adresse ikke er atomisk og desuden kan genbruges. ZipCodes: Som nævnt ovenfor kan postnummer og land angive by og stat (forudsat, at et postnummer ikke dækker over flere stater i samme land). ZipCodes blev introduceret for at fjerne anomalier og mindske redundans i databasen. Airports: En lufthavn har et almindeligt navn (dagligdags navn, ex: Kastrup Lufthavn ) og en unik kode. Denne kode (ex: DK-KBH ) fungerer derfor som nøgle. Jeg formoder, at der kun findes én lufthavn pr. adresse, hvorfor relationen til entitetssættet Addresses er en én-til-én relation. Passengers: En passager har et navn og et unikt ID, som fungerer som nøgle. Dette ID er blot et nummer. Ligesom lufthavne har en relation til en adresse, gør det samme sig gældende for passagerer. Her gælder det dog, at relationen er én-til-mange, da forskellige passagerer kan bo på samme adresse. Attributten freqflyerno behandles i det følgende afsnit. Schedules: I denne model er en Schedule en konkret flyafgang eksempelvis Fly YZ 192 DK-KBH->UK-HEAT med afgang 27. okt. '06 kl. 8:15. Den enkelte afgang har et unikt ID, der benyttes som nøgle. Afgangs- og ankomsttidpunkter er timestamps (dato og tid), men udgangspunkt og destination er relationer til konkrete lufthavns-entiteter. I første - 3 af 28 -

6 omgang påkrævede relationen til Aircrafts ikke referentiel integritet, da jeg forestillede mig, at en afgang kunne være planlagt uden at være knyttet til et fly. Det gjorde det dog umuligt at sikre en afgang mod overbooking. Da jeg skønnede, at det var vigtigere, påkræves der nu referentiel integritet på alle Schedule's relationer. Attributten fcendsrow benyttes til at angive, hvor i flyet der skelnes mellem økonomi- og første klasse. Jeg har vedtaget, at fcendsrow er -1, hvis alle rækker er første klasse og 0, hvis alle rækker er økonomiklasse 2. Attributten er medtaget for at kunne ændre skellet mellem økonomi- og første klasse fra afgang til afgang. Alternativt kunne man have tilføjet en boolsk attribut på Seats-sættet (ex: iseconomy), men så ville klassen være knyttet direkte til sædet og derved ikke kunne ændres fra afgang til afgang! ETickets: En e-billet har et unikt nummer og knytter sig med nødvendighed til en afgang (Schedule) og en passager (Passengers). Desuden har ETickets en relation til Seats. Denne relationen kræver ikke referentiel integritet, da en E-ticket uden et tilknyttet i dette system betragtes som en booking på en afgang. En E-ticket, som er tilknyttet et sæde fungerer som en konkret reservation og dermed som boarding pass. Overvejelser i forbindelse med modellen Et luftfartsselskab er noget, der findes i den fysiske verden. Derfor er det også relativt let at være tro overfor virkeligheden, hvilket jeg har forsøgt i forbindelse med udarbejdelsen af modellen for Air Crash systemet. Som omtalt er entitetssættet Addresses indført for at undgå redundans, hvis flere passagerer bor på samme adresse. Det giver derimod ikke mindre redundans i henhold til Airports, da relationen hér er én-til-én, og det derfor havde været lige så effektivt at lade attributterne fra Addresses være attributter direkte i Airports. Alligevel har jeg valgt at være konsekvent og lade al adresseinformation være i Addresses og ZipCodes (i henhold til BCNF, som nævnt ovenfor). Ved entitetssættet Passengers benytter jeg attributten freqflyerno. Alternativt kunne man have benyttet en isa -relation for at skelne almindelige passagerer og frequent flyers: nam e id To ETickets Passengers isa freqflyern o To Addresses Da systemet ikke skal kunne andet end at skelne passagerer fra frequent flyers, finder jeg dog den valgte løsning mest anvendelig. Attributten freqflyerno indeholder et nummer for frequent flyers, mens den blot er NULL ved 2 Se desuden afsnittet Single-Value begrænsninger, s af 28 - FrequentFlyer Illustration 2: Alternativ løsning med "isa"-relation.

7 almindelige passagerer. Man kan således sige, at Use null values -strategien er benyttet til konvertering fra subklasser til ét entitetssæt (Garcia-Molina et al. 2002, p. 76). Modellen er i alle tilfælde forsøgt holdt så simpel som muligt. Det ses eksempelvis ved, at jeg alle steder har kunnet nøjes med binære relationer. Desuden er alle attributter simple, atomiske datatyper (jf. afsnittet Relationelt database-schema & domæner, s. 7 for valgte datatyper). Entitetssættet Addresses er eksempelvis fremkommet, da en adresse er kompleks og derved ikke bør behandles som en simpel datatype (én streng med værdierne fra alle attributter). Der er forsøgt valgt løsninger, der understøtter et fleksibelt bookingscenarie, samt rekonfiguration af sæder m.v. - 5 af 28 -

8 C O N S T R A I N T S, D A T A B A S E - S C H E M A & D O M Æ N E R Med udgangspunkt i ovenstående E/R-diagram er der flere simple constraints i modellen. Nøgler For de 7 stærke entitetssæt er nøglerne valgt, så de entydigt kan identificere enhver entitet. Entitetssættet Seats er svagt og kan derfor først unikt identificeres gennem relationen til Aircrafts (via nøglen i Aircrafts). Derfor er relationen contains omringet af dobbeltramme (der er tale om et supporting relationship). Single-Value begrænsninger Alle pile fra relationer i E/R-diagrammet angiver single-value constraints, da der hermed menes maksimalt én (eller præcis én ved udfyldte pile). For passagerer gælder det, at den mulige NULL-værdi i freqflyerno er dén ene værdi, der kan angive, at den specifikke passager ikke er frequent flyer. Yderligere gælder det, at -1 er dén ene værdi, der i Schedules kan angive, at alle sæder er økonomiklasse. Der er således også tale om en single-value constraint. Referentiel integritet Relationen nextto ved entitetssættet Seats skal have referentiel integritet ved begge rolle (rightseat og leftseat). Det er på den måde altid muligt at afgøre, om to sæder er placeret ved siden af hinanden, samt om et sæde er en vinduesplads (som omtalt er et sæde, der ikke indgår i nextto-relationen med en rightseat-rolle en vinduesplads i flyets venstre side; det er ikke højre sæde for noget andet sæde). I E/R-diagrammet er referentiel integritet indikeret med udfyldte pile. Således er reserves -relationen mellem ETickets og Seats eneste relation, der ikke påkræver referentiel integritet (jf. punktet ETickets, s. 4). Andre begrænsninger Som angivet på E/R-diagrammet kan en Aircraft-entitet have en relation til mellem 5 og 20 sæder. - 6 af 28 -

9 Relationelt database-schema & domæner Alle E/R-relationer er transformeret ind i de schema'er, der er entitetssæt i E/R-diagrammet. Undtaget herfra er dog nextto-relationen, der har et selvstændigt schema. Primærnøgler er skrevet med kapitalærer: Aircrafts( NUM: string) Seats( AIRCRAFTNUM: string, R: int, LETTER: {'A','B','C','D'}) Passengers( ID: int, name: string, freqflyerno: int, addrstreet: string, addrzip: int, addrcountry: string) Addresses( STREET: string, ZIP: int, COUNTRY: string) ZipCodes( ZIP: int, COUNTRY: string, city: string, state: string) Airports( CODE: string, name: string, addrstreet: string, addrzip: int, addrcountry: string) Schedules( ID: string, fcendsrow: int, arrival: timestamp, departure: timetamp, aircraftnum: string, airportfliesfrom: string, airportfliesto: string) ETickets( ENUMBER: int, passengerid: int, scheduleid: string, seatr: int, seatletter: {'A','B','C','D'}, aircraftnum: string) nextto( AIRCRAFTNUM: string, R: int, LLETTER: {'A','B','C','D'}, RLETTER: {'A','B','C','D'}) - 7 af 28 -

10 F D ' E R & R E L A T I O N E L A L G E B R A Herunder følger funktionelle afhængigheder (Functional Dependencies) for alle relationer i modellen, samt løsninger på opgaverne i relationel algebra (ugeseddel 3). Funktionelle afhængigheder For den relationelle datamodel har jeg identificeret følgende ikke-trivielle FD'er: Addresses: Som tidligere omtalt, var by og stat oprindeligt attributter på Addressesrelationen, hvilket gav følgende FD'er 3 : a) street zip country city state b) zip country city state Da zip og country ikke i sig selv er en nøgle for Addresses, blev relationen opdelt i henholdsvis Addresses(street, zip, country) og ZipCodes(zip, country, city, state). Det betyder, at den ikke-trivielle FD (b) nu findes i relationen ZipCodes, hvor dens venstreside udgør relationens nøgle. Hermed opfylder relationen BCNF. Airports: c) code name addrstreet addrzip addrcountry d) addrstreet addrzip addrcountry code name Venstresiden af (d) er også nøgler for Airports, men code er den valgte primærnøgle. Begge nøgler (venstresiderne i (c) og (d)) er minimale og derfor lige gode bud på primærnøgler (jf. Garcia-Molina et al. 2002, p. 86). Passengers: e) id name freqflyerno addrstreet addrzip addrcountry f) freqflyerno id name addrstreet addrzip addrcountry FD'en (f) kun gælder, hvis freqflyerno ikke er NULL. Derfor kan freqflyerno ikke være en nøgle, og (f) afføder ingen ændringer i databasens schema. Schedules: g) id fcendsrow arrival departure aircraftnumber airportfliesfrom airportfliesto h) departure aircraftnumber id fcendsrow arrival airportfliesfrom airportfliesto i) arrival aircraftnumber id fcendsrow departure airportfliesfrom airportfliesto Også her gælder det, at venstresiderne i både (h) og (i) kunne være primærnøgler i relationen, men jeg har valgt attributten id, da det synes mest logisk. 3 FD'en state country er ikke medtaget, da jeg ikke er sikker på, at navnet på en stat nødvendigvis er unik på verdensplan. - 8 af 28 -

11 ETickets: j) enumber passengerid scheduleid seatrow seatletter aircraftnumber k) passengerid scheduleid enumber seatrow seatletter aircraftnumber l) scheduleid seatrow seatletter aircraftnumber passengerid enumber Venstresiden i (k) er en nøgle for relationen. FD'en (l) gælder kun som (f) ved Passengers hvis der er tilknyttet et sæde til en given E-Ticket. Derfor kan venstresiden af (l) ikke være en nøgle. Kun Addresses brød med Boyce-Codd normalformen, hvorfor relationen som nævnt blev ændret og udvidet med relationen ZipCodes. Hermed opfylder alle relationer BCNF og dermed normalformerne til og med 3. niveau. Relationel algebra (opgaver fra ugeseddel) A) Antallet af passagerer, der har booket plads på en given afgang (hér: AC-1234), men endnu ikke har reserveret et sæde, kan findes med: COUNT scheduleid=' AC 1234 ' seatr IS NULL ETickets Relationen ETickets indeholder netop reservationer uden nødvendigvis at være knyttet til et sæde. B) For at finde passagerer, der har fløjet med Air Crash flere end 10 gange inden for det seneste år, skal man først finde passengerid og scheduleid for det sidste års afgange. Det gøres via en natural join på ETickets og Schedules: D pid, sid := passengerid,id departure DATE ' ' departure DATE ETickets scheduleid=id Schedules Herefter grupperes der på pid og antallet af tupler i hver gruppering summeres op: C pid,ctpass := ctpass 10 pid, COUNT pid ctpass D Da vi ønsker specifik passagerinformation, vælger jeg at lave en natural join på Passengers: Answer id, name, ff, as, az,ac, pid, ctpass := Passengers id = pid C - 9 af 28 -

12 C) Fly, der ikke er overbookede og flyver fra Viborg ( DK-VIB ) til Odense ( DK-ODE ) inden for de næste 3 dage, findes ved først at finde scheduleid og aircraftnum på de afgange, der opfylder betingelserne: SA sid, num := scheduleid, aircraftnum airportfliesfrom=' DK VIB' airportfliesto=' DK ODE ' Schedules DATE departure DATE ' ' Herefter summeres antallet af sæder på de fundne afgange: C1 sid, num, ctseats :=SA num,ctseats aircraftnum, COUNT aircraftnum ctseats Seats C1 indeholder nu sid (scheduleid), num (aircraftnum) og ctseats (antallet af sæder for hver afgang). På tilsvarende måde tælles antallet af reservationer for hver afgang. I denne omgang kigger jeg på alle Eticket-entiteter, da jeg alligevel skal joine med C1. C2 sid, cttick := scheduleid,count enumber cttick ETickets C2 indeholder således antallet af reservationer for enhver afgang, der har mindst én ETicket. Det er ligemeget, om en ETicket er knyttet til et sæde, da en booking også vil omfatte et sæde før eller siden og således skal tælles med. Jeg udtrækker nu alle scheduleid'er, hvor der stadig er flere sæder end reservationer: Sc sid := sid C1 cttick ctseats C2 Dette resultat kan joines direkte med Schedules: Answer id, fcendsrow, arrival,departure,aircraftnum, airportfliesfrom, airportfliesto := Schedules Sc D) For at finde to ledige sæder ved siden af hinanden økonomiklasse, afgang AC-1234 henter jeg først aircraftnum og fcendsrow fra Schedules: A num, fc := aircraftnum, fcendsrow id=' AC 1234 ' Schedules Hermed har jeg mulighed for at finde de Seats, hvis row er større end fc (det skal jo være på økonomiklasse): S1 n,r, l := aircraftnum,r,letter A num=aircraftnum fc r Seats Det vil sige, at S1 nu har en struktur, der svarer til Seats. Det samme vil jeg finde i de ETickets, der er knyttet til et sæde på afgang AC-1234: S2 n,r, l := aircraftnum,r,letter scheduleid =' AC 1234' seatr IS NOT NULL ETickets Ledige sæder (S) kan nu findes som S1 EXCEPT S2: S n, r,l :=S1 S2-10 af 28 -

13 Herefter joiner jeg S med nextto-relationen i leftseat-rollen: L n,r,lletter,rletter := S l=lletter nextto Resultatet er nu de entiter i S, hvor l er lig rletter fra L. Her vil ikke være dupletter i form af par af sæder, da det ikke er to Seats der joines, men to joins med Seats på nextto (jf. Garcia- Molina et al. 2002, p. 257). Answer n,r, lletter,rletter := S l=rletter L I dette resultat vil være alle ledige sædepar på afgang AC-1234, hvis der er nogle af 28 -

14 S Q L, I N D E K S E R & S I K R I N G M O D O V E R B O O K I N G I dette afsnit er database-schema'et fra s. 7 blevet oversat til SQL. Herudover vises, hvilke indekser jeg har lavet i databasen, samt hvordan en assertion kan sikre mod overbooking på en flyafgang. I sidste del findes løsninger på SQL-opgaverne fra ugeseddel 4. Oprettelse af tabeller og constraints i SQL I forbindelse med oprettelse af tabellerne i Oracle-databasen, har jeg angivet primærnøgler, fremmednøgler, samt NOT NULL- og CHECK-constraints. Jeg har ikke haft behov for DEFAULT values, da jeg forkastede en idé om, at departure i Schedules kunne være det nuværende tidspunkt, hvis ikke andet blev angivet. Det virkede for søgt og kom derfor ikke med i den endelige model: Aircrafts: Her er ingen contraints, da en primærnøgle aldrig kan være NULL. CREATE TABLE Aircrafts ( num CHAR(10) PRIMARY KEY ); Seats: Da alle attributter er nøgler, har jeg ikke benyttet NULL-constriants. Attributten r ( row ) skal være mellem 1 og 20, mens letter skal indeholde karakteren A, B, C eller D. Intet fly må have flere end 20 sæder, hvilket nedenstående CHECK-constraint sikrer 4. CREATE TABLE Seats ( aircraftnum CHAR(10) NOT NULL REFERENCES Aircrafts(num), r INT CHECK (r >= 1 AND r <= 20), letter CHAR(1) CHECK (letter IN ('A','B','C','D')), PRIMARY KEY (aircraftnum, r, letter), CHECK (20 >= ALL (SELECT COUNT(*) FROM Seats GROUP BY aircraftnum) ) ); Addresses: Sidste linie angiver en fremmednøgle-constraint til ZipCodes. CREATE TABLE Addresses ( street VARCHAR(255), zip INT NOT NULL, country VARCHAR(50) NOT NULL, PRIMARY KEY(street, zip, country), FOREIGN KEY (zip, country) REFERENCES ZipCodes(zip, country) ); 4 Dette CHECK er ikke medtaget i den aktuelle Oracle-database, da det gav en ret kryptisk fejl. Hverken jeg eller Rune (TA) har været i stand til at identificere fejlen. I stedet er dette CHECK blevet udformet som en trigger, jf. afsnittet Assertions & triggers, s. 22. Problemstillingen behandles desuden i afsnittet Problemer, s af 28 -

15 ZipCodes: I denne tabel må kun state være NULL. Attributten zip skal være et tal på maksimalt 6 tegn. Jeg har desuden vedtaget, at det ikke må være tallet CREATE TABLE ZipCodes ( zip INT CHECK (zip < AND zip <> 666 AND zip > 0), country VARCHAR(50), city VARCHAR(50) NOT NULL, state VARCHAR(15), PRIMARY KEY(zip, country) ); Airports: En lufthavn skal have et unikt navn, som endvidere ikke må være NULL. Det er ligeledes et krav, at fremmednøgler i Addresses eksisterer. CREATE TABLE Airports ( code CHAR(9) PRIMARY KEY, name VARCHAR(30) NOT NULL UNIQUE, addrstreet VARCHAR(255) NOT NULL, addrzip INT NOT NULL, addrcountry VARCHAR(50) NOT NULL, FOREIGN KEY (addrstreet, addrzip, addrcountry) REFERENCES Addresses(street, zip, country) ); Passengers: Hvis en passager har er frequent flyer, skal attributten freqflyerno være unik. Alle passagerer kan dog have NULL som værdi for denne attribut, hvis de blot er almindelige passagerer. Ligesom for Airports gælder det, at fremmednøgler i Addresses skal eksistere, samt at name ikke må være NULL. CREATE TABLE Passengers ( id INT PRIMARY KEY, name VARCHAR(255) NOT NULL, freqflyerno INT UNIQUE, addrstreet VARCHAR(255) NOT NULL, addrzip INT NOT NULL, addrcountry VARCHAR(50) NOT NULL, FOREIGN KEY (addrstreet, addrzip, addrcountry) REFERENCES Addresses(street, zip, country) ); Schedules: Som omtalt ved punktet Schedules, s. 3, kræves der referentiel integritet ved attributten aircraftnum, hvorfor den ikke må være NULL. Attributterne airportfliesto og airportfliesfrom er fremmednøgler fra tabellen Airports 6. Ved planlægning af en flyafgang giver det ikke mening ikke at angive tidspunkter for afgang og ankomst. Derfor må disse attributter ikke være NULL desuden benyttes der et CHECK til at sikre, at ankomsttidspunktet er senere end afgangtidspunktet. Som tidligere omtalt skal der være mulighed for at sætte fcendsrow til -1, men ikke andre negative tal. 5 Dette er udelukkende for at lave en alternativ constraint det har ingen praktisk betydning. 6 Jeg overvejede constrainten CHECK (airportfliesfrom <> airportfliesto). Den blev dog forkastet, da jeg fandt det plausiblet, at Air Crash måske også skulle kunne tilbyde rundflyvninger (det er trods alt små fly etc.) af 28 -

16 CREATE TABLE Schedules ( id INT PRIMARY KEY, fcendsrow INT CHECK (fcendsrow >= -1 AND fcendsrow < 20), arrival TIMESTAMP NOT NULL, departure TIMESTAMP NOT NULL, aircraftnum CHAR(10) NOT NULL REFERENCES Aircrafts(num), airportfliesfrom CHAR(9) NOT NULL REFERENCES Airports(code), airportfliesto CHAR(9) NOT NULL REFERENCES Airports(code), CHECK (arrival > departure) ); ETickets: For e-billetter gælder det, at fremmednøglerne fra både Aircrafts, Passengers og Schedules skal være opretholdt (aircraftnum er en del af nøglen for den svage relation Seats). Som omtalt, kan en e-billet godt findes uden at være tilknyttet et sæde (hvilket sker via attributterne seatr, seatletter og aircraftnum). Hvis blot én værdi er NULL skal alle 3 attributter dog være det, da det ellers ikke er en gyldig relation til et sæde (nøglen i Seats er minimal). Gennem denne constraint bliver det muligt at tjekke om en e-billet gælder som reservation af et sæde via enhver af de 3 nævnte attributter. En anden constraint er, at en E- ticket skal være unik mht. scheduleid og sæde (kun én e-billet kan knytte sig til et specifikt sæde pr. afgang). CREATE TABLE ETickets ( enumber INT PRIMARY KEY, passengerid INT NOT NULL REFERENCES Passengers(id), scheduleid INT NOT NULL REFERENCES Schedules(id), seatr INT, seatletter CHAR(1), aircraftnum CHAR(10), UNIQUE(scheduleId, seatr, seatletter, aircraftnum), FOREIGN KEY (seatr, seatletter, aircraftnum) REFERENCES Seats (r, letter, aircraftnum), CHECK ( (seatr IS NULL AND seatletter IS NULL AND aircraftnum IS NULL) OR (seatr IS NOT NULL AND seatletter IS NOT NULL AND aircraftnum IS NOT NULL) ) ); nextto: De to sæder, der refereres til i nextto-relationen vil nødvendigvis være placeret i samme fly. Der er derfor ikke grund til at lade aircraftnum og r ( row ) optræde to gange. Gennem en CHECK-constraint sikres det, at de to Seat-entiteter, der omfattes af relationen, har tilstødende bogstaver (attributten letter) af 28 -

17 Indekser CREATE TABLE nextto ( aircraftnum CHAR(10) NOT NULL, r INT NOT NULL, lletter CHAR(1) NOT NULL, rletter CHAR(1) NOT NULL, PRIMARY KEY(aircraftNum, r, lletter, rletter), FOREIGN KEY (aircraftnum, r, lletter) REFERENCES Seats (aircraftnum, r, letter), FOREIGN KEY (aircraftnum, r, rletter) REFERENCES Seats (aircraftnum, r, letter), CHECK ( (lletter = 'A' AND rletter = 'B') OR (lletter = 'B' AND rletter = 'C') OR (lletter = 'C' AND rletter = 'D') ) ); SQL sørger for, at der oprettes indekser for alle nøgler (både primære og unikke). Ud over disse indekser har jeg fundet det relevant at oprette følgende: CREATE INDEX PassNameIndex ON Passengers(name); CREATE INDEX SchedDepartIndex ON Schedules(departure); CREATE INDEX SchedAirportIndex ON Schedules(airportFliesFrom, airportfliesto); CREATE INDEX ETickPassIndex ON ETickets(passengerId); CREATE INDEX ETickSchedIndex ON ETickets(scheduleId); Ræsonnementet bag disse indekser er, at de implicerede attributter ofte benyttes ved queries, hvor de benyttes som relationer, samt i søgninger. Eksempelvis vil SchedDepartIndex kunne benyttes i queries, hvor samtlige afgange i det seneste år skal findes etc. SchedAirportIndex omfatter to attributter. Attributten airportfliesfrom er bevidst nævnt først i definitionen af indekset, da indekset således også kan benyttes som indeks på denne attribut alene (jf. Garcia-Molina et al. 2002, p. 296). Jeg har vurderet, at dette vil benyttes mere end et selvstændigt indeks på airportfliesto. Sikring mod overbooking For at sikre, at en flyafgang ikke overbookes, kan følgende assertion benyttes. Oracle understøtter ikke assertions. Det vender jeg tilbage til i afnittet Assertions & triggers, s. 22. CREATE ASSERTION NoOverbookCheck CHECK (aircraftnum NOT IN ( SELECT aircraftnum FROM ( ( SELECT COUNT(*) AS cntseats, aircraftnum FROM Seats GROUP BY aircraftnum ) NATURAL JOIN ( SELECT COUNT(*) AS cntpass, s.aircraftnum FROM ETickets e, Schedules s WHERE e.scheduleid = s.id GROUP BY s.aircraftnum ) ) WHERE cntseats <= cntpass ) ); - 15 af 28 -

18 Idéen er, at man tæller antallet af sæder på ethvert fly og foretager et natural join med de billetter, der er knyttet til det enkelte fly. Da en e-billet ikke nødvendigvis er en reservation af et specifikt sæde, kan der være tupler i ETickets, hvor aircraftnum er NULL. Det er derfor nødvendigt at joine ETickets med Schedules for også at medtælle passagerer, som endnu ikke har reserveret et sæde (de skal jo have et sæde før eller siden). Oversættelse af relationel algebra til SQL (opgaver fra ugeseddel) Opgaverne i relationel algebra fra ugeseddel 3 kan oversættes til SQL-queries som følger (se afsnittet Relationel algebra (opgaver fra ugeseddel), s. 9 for grundigere opgavebeskrivelse): A) Antal passagerer uden sædereservation: SELECT COUNT(*) AS cntpass FROM ETickets WHERE scheduleid = 'AC-1234' AND seatr IS NULL;! BEMÆRK: I det følgende benytter jeg en lidt speciel notation for at øge læsbarheden. Således er subqueries navngivne og benyttes i følgende queries. De følgende queries kan oversættes til korrekt SQL ved at substituere henvisninger til disse subqueries. 7 B) Passagerer, der har fløjet med Air Crash flere end 10 gange inden for det seneste år: D := SELECT passengerid pid, scheduleid sid FROM (SELECT * FROM ETickets, Schedules WHERE scheduleid = id) WHERE departure > CURRENT_DATE INTERVAL '1' YEAR AND departure <= CURRENT_DATE D er hermed en tabel indeholdende alle passengerid og scheduleid for det seneste år. C := SELECT pid, ctpass FROM (SELECT pid, COUNT(pId) AS ctpass FROM D GROUP BY pid) WHERE ctpass > 10 C indeholder nu ID og antal flyvninger for alle passagerer, der har fløjet flere end 10 gange. SELECT * FROM Passengers, C WHERE id = pid; Passagerinformation findes ved at joine C og Passengers. 7 Man kunne også eksplicit have kreeret views til dette formål, men den valgte syntaks skulle være relativt let at forstå af 28 -

19 C) Fly, der ikke er overbookede og flyver fra Viborg ( DK-VIB ) til Odense ( DK-ODE ) inden for de næste 3 dage. Jeg antager til denne opgave, at den skitserede assertion til sikring mod overbooking er implementeret, hvorved opgaven bliver ret simpel (og viser styrken af constraints til at sikre sig, at data der ikke er ugyldige data): SELECT aircraftnum FROM Schedules WHERE airportfliesfrom = 'DK-VIB' AND airportfliesto = 'DK-ODE' AND departure > CURRENT_DATE AND departure <= CURRENT_DATE + INTERVAL '3' DAY; D) At finde to ledige sæder ved siden af hinanden økonomiklasse, afgang AC-1234 kræver, først og fremmest, at man finder de økonomiklasse-sæder på afgangen: S1 := SELECT aircraftnum AS n, r, letter AS l FROM (SELECT aircraftnum AS num, fcendsrow AS fc FROM Schedules WHERE id = 'AC-1234'), Seats WHERE num = aircraftnum AND fc < r Ligeledes skal reserverede sæder på afgangen findes: S2 := SELECT aircraftnum AS n, r, letter AS l FROM ETickets WHERE scheduleid = 'AC-1234' AND seatr IS NOT NULL Ledige sæder på økonomiklasse er nu de sæder i S1, der ikke indgår i S2: S := SELECT S1 EXCEPT 8 S2 Herefter joines først med sæder fra nextto-relationen, hvor sædet har rollen som leftseat: L := SELECT n, r, lletter, rletter FROM S, nextto WHERE l = lletter Ved dernæst at joine resultatet af ovenstående (L) med S, hvor sædet har rollen som rightseat, ender man man ledige sæder på økonomiklassen, der er placeret ved siden af hinanden: SELECT n, r, lletter, rletter FROM S, L WHERE l = rletter; Yderligere opgaver fra ugesedlen E) For at finde antal afgang og det totale antal solgte billetter for hver lufthavn, hvortil der kan flyves fra Horsens ( DK-HORS ) inden for den næste uge, kan følgende query benyttes. Resultatet er sorteret i faldende orderen efter antallet af afgange: A := SELECT * FROM Schedules WHERE departure > CURRENT_DATE AND departure <= CURRENT_DATE + INTERVAL '7' DAY AND airportfliesfrom = 'DK-HORS' A indeholder nu alle afgange i den næste uge, der afgår fra Horsens. B := SELECT airportfliesto AS destination, COUNT(airportFliesTo) AS cnttickets FROM ETickets, A WHERE scheduleid = id GROUP BY airportfliesto A joines med ETickets for at tælle billetter for hver afgang. 8 EXCEPT hedder MINUS i Oracle, men jeg har valgt SQL-navnet for læsbarhedens skyld af 28 -

20 C := SELECT airportfliesto AS destination, COUNT(airportFliesTo) AS cntflights FROM A GROUP BY airportfliesto Herefter indeholder C alle lufthavnsdestinationer og antallet af afgang dertil. Det endelige resultat findes gennem et natural join på B og C og sorteres efter antallet af afgange i faldende orden: SELECT * FROM B NATURAL JOIN C ORDER BY cntflights DESC; F) Frequent flyers med mindst 10 flyvninger findes ved at joine Passengers og ETickets, hvor freqflyerno i Passengers er forskellig fra NULL: SELECT name, COUNT(eNumber) AS cntflights FROM Passengers, ETickets WHERE freqflyerno IS NOT NULL AND id = passengerid GROUP BY passengerid HAVING COUNT(eNumber) >= 10; - 18 af 28 -

21 J A V A - I N T E R F A C E T, P R O B L E M E R & T R A N S A K T I O N E R I læsegruppen har vi udviklet et tekstbaseret Java-interface, hvorigennem Air Crash Booking System kan benyttes. I det følgende beskrives dette interface, samt de problemer, der har været forbundet med udviklingen deraf. I forbindelse med denne del af projektet, blev der ikke brug for yderligere assertions (foruden den føromtalte, jf. Sikring mod overbooking, s. 15. Brug af Java-interfacet Det var et krav, at interfacet kunne håndtere 3 forskellige brugssituationer: 1. Bestilling af ny billet. 2. Booking af sæde og udskrivning (til skærm) af boarding pass. 3. Administration (herunder oprettelse af afgange og håndtering af frequent flyers). Interfacet er baseret på klassen CmdInterface, der giver brugeren adgang til systemets 3 facetter. Denne klasse er den eneste med en main-metode. Interfacet bruges ved at indtaste nummeret på det ønskede menupunkt, samt data efter forespørgslen fra programmet. Når en handling er udført, vender programmet tilbage til udgangspositionen. Vi har vurderet, at det ekstra arbejde, der er forbundet med Swing ikke kunne betale sig, da et tekstbaseret interface giver tilstrækkelige muligheder. Programmet er meget intuitivt i brug og viser i flere tilfælde gyldige værdier inden indtastning. Dette er dog ikke tilfældet, når brugeren skal indtaste afgangs- og billetnumre. Problemer Flere steder i databasen er der brugt strenge af typen CHAR (jf. afsnittet Oprettelse af tabeller og constraints i SQL, s. 12). Denne datatype kan indeholde en streng af en fast længde, modsat VARCHAR, hvis længde er indholdets maksimale længde. Det viste sig at være et problem, hvis en attribut af typen CHAR indeholder en streng, der er kortere end attributtens definerede længde. I et sådant tilfælde bliver der tilføjet mellemrum til enden af strengen, hvorved eksempelvis name i Airports (af typen CHAR(9)) kommer til at indeholder DK-KBH, når man indsætter DK-KBH. Interne relationer påvirkes ikke af denne opførsel (da refererende attributter har samme definition), men det er et problem, når brugerinput skal sammenlignes med værdier i databasen. Problemet er blevet løst ved at bruge SQLfunktionen TRIM(), der fjerner mellemrum i begge ender af en streng. Alternativt kunne man have ændret typen til VARCHAR. I administrationsinterfacet opførte Oracle sig ret underligt ved menupunkt 5 ( Find most frequent flyer(s) in period ). I første omgang forsøgte jeg at benytte en query, der - 19 af 28 -

22 indbefattede... cnt HAVING cnt = MAX(cnt)..., men det ville ikke fungere. Idéen var, at alle passagerer med samme antal flyvninger (cnt) skulle vises i stedet for blot dén ene passager, der tilfældigvis havde det mindste ID, første navn eller andet. Problemet var, at Oracle ikke lod til at fortolke HAVING-delen, hvorfor forespørgslen nu er ændret til en væsentlig længere version. Som omtalt i afsnittet Oprettelse af tabeller og constraints i SQL, s. 12, var vi ved oprettelse af tabellen Seats tvunget til at fjerne den constraint, der skulle sikre, at intet fly havde flere end 20 sæder: CREATE TABLE Seats ( aircraftnum CHAR(10) NOT NULL REFERENCES Aircrafts(num), r INT CHECK (r >= 1 AND r <= 20), letter CHAR(1) CHECK (letter IN ('A','B','C','D')), PRIMARY KEY (aircraftnum, r, letter), CHECK (20 >= ALL (SELECT COUNT(*) FROM Seats GROUP BY aircraftnum) ) ); Tanken var, at constraint'en skulle være sand så længe ethvert fly har 20 eller færre sæder, men Oracle vil ikke tillade denne constraint. Løsningen er blevet, at denne constraint nu er udformet som en trigger, jf. afsnittet Assertions & triggers, s. 22. Brug af transaktioner Der er to aspekter i en transaktion: Serialisérbarhed og atomicitet. Et sæt af operationer siges at udføres serielt, hvis de udføres fuldstændigt før enhver anden operation. Serialisérbarhed er således et udtryk for, at operationer opfører sig som serielle handlinger, selv om der er overlap i tiden. Atomicitet betyder, at et sæt af operationer enten skal udføres komplet eller slet ikke. Således vil atomicitet sikre, at en operation, der består af to eller flere queries aldrig afbrydes og derved efterlader databasen i en inkonsistent tilstand. Konkret sikres atomicitet ved, at operationerne udføres lokalt og derefter commit'es. Man kan vælge at slække på kravet til serialisérbarhed for en transaktion, hvis der er tale om operationer, der ikke ændrer data i databasen (såkaldte read-only operationer). Det er i dette tilfælde op til SQL-systemet at afgøre, hvorvidt dette slækkede krav kan benyttes til at tillade parallelle handlinger (Garcia-Molina et al. 2002, p. 403). Enhver query er automatisk en transaktion og udføres derfor serielt og atomisk. Af samme grund har der kun været brug for at benytte transaktioner eksplicit i de tilfælde, hvor en funktion benytter sig af flere queries. Et sådant tilfælde findes i administrationsinterfacet (menupunkt 0, Schedule a new flight ), hvor afgangens ID beregnes ved at lægge én til det samlede antal af afgange. I denne sammenhæng er det vigtigt, at det samlede sæt af queries - 20 af 28 -

23 behandles serielt, så man ikke risikerer, at det fundne ID er ugyldigt. Det kunne blive tilfældet i den situation, hvor to brugere forsøger at oprette nye afgange på samme tidspunkt og derved kunne få genereret samme ID. I de tilfælde, hvor vi har brugt transaktioner er de af typen read/write, da det netop er den serielle opførsel, vi agter at sikre. Da vores transaktioner består af en læsning og derefter en skrivning er det derimod ikke så vigtigt, at der er atomicitet (skrivningen foregår jo som det sidste). Transaktionstypen read/write er standardtypen for transaktioner, da det er den strengeste. Det samme gælder isolation levels, hvor udgangspunktet er serializable. Det betyder, at dirty reads ikke er tilladt det vil sige, at en query i transaktionen ikke kan læse data, der ikke er blevet committed af 28 -

24 D I S K U S S I O N A F D E S I G N & Æ N D R I N G E R Løbende ændringer & revideringer Databasen til Air Crash systemet har naturligvis udviklet sig i takt med, at der kom nye krav dertil. Som udgangspunkt har selve strukturen været relativt stabil med entitetssættene Aircrafts, Seats, Schedules, Airports, ETickets, Passengers og Addresses. I forbindelse med udryddelse af anomalier og redundans blev det klart, at et selvstændigt entitetssæt til ZipCodes ville være den korrekte løsning. Modelleringen af sædekonfiguration har være emne for en del mindre justeringer i takt med de stigende krav til de mulige forespørgslers kompleksitet. I første omgang havde vi i gruppen modelleret to relationer til og fra Seats for at kunne finde nabosæder. Det viste sig hurtigt meget redundant, hvorefter vi endte med nextto-relationen, der fungerer tilfredsstillende til de nuværende systemkrav. I takt med de stigende krav til datakonsistens, er flere og flere relationer mellem entitetssæt kommet til at påkræve referentiel integritet. Således er det nu kun reserves mellem ETickets og Seats, der ikke kræver referentiel integritet. Dette skyldes, at en ETicket både tjener som booking på en afgang og som konkret sædereservation (boarding pass). Da ændringerne er blevet foretaget løbende har det været overkommeligt. Til gengæld har det ofte medført, at modeller, relationel algebra og queries fra tidligere uger også måtte revideres. Det er klart, at man i dag har et større indblik i, hvordan man starter rigtigt, men jeg ser ikke behov for gennemgribende ændringer som sådan, da modellen virker logisk og relativt simpel. Denne påstand mener jeg underbygges af, at jeg i meget få tilfælde har behov for flere selvstændige queries langt de fleste opgaver kan klares med ren SQL og subqueries. Man kan indvende, at aircraftnum er redundant i ETickets, da en e-billet altid er knyttet til en afgang (der påkræves referentiel integritet fra ETickets til Schedules). Derfor kan man altid finde aircraftnum via Schedules, men jeg har valgt at beholde attributten, da den tjener som en del af nøglen for det potentielle sæde ikke direkte som indikator for e-billettens tilknyttede fly. Assertions & triggers Som nævnt i afsnittet Sikring mod overbooking, s. 15, havde vi i gruppen udarbejdet følgende assertions til at sikre ethvert fly mod overbooking: - 22 af 28 -

25 CREATE ASSERTION NoOverbookCheck CHECK (aircraftnum NOT IN ( SELECT aircraftnum FROM ( ( SELECT COUNT(*) AS cntseats, aircraftnum FROM Seats GROUP BY aircraftnum ) NATURAL JOIN ( SELECT COUNT(*) AS cntpass, s.aircraftnum FROM ETickets e, Schedules s WHERE e.scheduleid = s.id GROUP BY s.aircraftnum ) ) WHERE cntseats <= cntpass ) ); Da Oracle ikke understøtter assertions må den omskrives til en trigger. En trigger er langt mere specifik end en assertion, da den omfatter enten update, insert eller delete. I modsætning hertil evalueres en assertion ved enhver modifikation af de implicerede tabeller. For at slippe for en masse gentagen SQL, vil jeg først oprette to views, der kan gøre det følgende mere overskueligt. Først og fremmest et view, der blot indeholder antallat af sæder: CREATE VIEW AcSeatCnt AS SELECT COUNT(*) AS cnt FROM Seats GROUP BY aircraftnum; Dernæst et view, der indeholder overbookede fly (og derfor altid bør være tom): CREATE VIEW OverbookedAcs AS SELECT aircraftnum FROM ( ( SELECT COUNT(*) AS cntseats, aircraftnum FROM Seats GROUP BY aircraftnum ) NATURAL JOIN ( SELECT COUNT(*) AS cntpass, s.aircraftnum FROM ETickets e, Schedules s WHERE e.scheduleid = s.id GROUP BY s.aircraftnum ) ) WHERE cntseats < cntpass ; Første mulighed for at overbooke et fly opstår, hvis man forsøger at slette et sæde. Derfor genindsættes et sæde, hvis det kommer til at betyde, at flyet har færre sæder end der er reservationer: CREATE TRIGGER DeleteSeatTrigger AFTER DELETE ON Seats REFERENCING OLD TABLE AS oldt FOR EACH STATEMENT WHEN (5 > ANY (SELECT cnt FROM AcSeatCnt) OR EXISTS (SELECT * FROM OverbookedAcs)) INSERT INTO Seats (SELECT * FROM oldt WHERE (aircraftnum, r, letter) NOT IN Seats); Denne trigger sørger desuden for, at intet fly kan ende med at have færre end 5 sæder (jf. afsnittet Problemer, s af 28 -

26 Dernæst kan et fly blive overbooket, hvis man ændrer aircraftnum på et sæde (det er måske ikke så realistisk, at man forsøger at flytte et sæde fra ét fly til et andet denne trigger er dog nødvendig for til enhver tid at kunne sikre en konsistent database). I dette tilfælde sørger jeg desuden for, at ethvert fly altid har mellem 5 og 20 sæder (jf. ovenfor): CREATE TRIGGER UpdateSeatAcTrigger AFTER UPDATE OF aircraftnum ON Seats REFERENCING OLD TABLE AS oldt, NEW TABLE AS newt FOR EACH STATEMENT WHEN (5 > ANY (SELECT cnt FROM AcSeatCnt) OR 20 < ANY (SELECT cnt FROM AcSeatCnt) OR EXISTS OverbookedAcs) BEGIN DELETE FROM Seats WHERE (aircraftnum, r, letter) IN newt; INSERT INTO Seats (SELECT * FROM oldt); END; For nu at afrunde sikringen af, at ethvert fly har mellem 5 og 20 sæder, vælger jeg også at oprette en trigger, der gælder ved indsættelse af et sæde: CREATE TRIGGER InsertSeatTrigger AFTER INSERT ON Seats REFERENCING NEW ROW AS newr FOR EACH ROW WHEN (20 < ANY (SELECT cnt FROM AcSeatCnt)) DELETE FROM Seats s WHERE s.aircraftnum = newr.aircraftnum AND s.r = newr.e AND s.letter = newr.letter; Hvis en afgang skal befordres af et andet fly, er det også nødvendigt at tjekke for overbooking. Det gøres med en trigger på ændring af aircraftnum i Schedules: CREATE TRIGGER UpdateScheduleAcTrigger AFTER UPDATE OF aircraftnum ON Schedules REFERENCING OLD TABLE AS oldt, NEW TABLE AS newt FOR EACH STATEMENT WHEN (EXISTS (SELECT * FROM OverbookedAcs)) BEGIN DELETE FROM Schedules WHERE (id, fcendsrow, arrival, departure, aircraftnum, airportfliesfrom, airportfliesto) IN newt; INSERT INTO Schedules (SELECT * FROM oldt); END; Desuden er det nødvendigt at tjekke ved indsættelse i ETickets: CREATE TRIGGER InsertETicketTrigger AFTER INSERT ON ETicket REFERENCING NEW ROW AS newr FOR EACH ROW WHEN (EXISTS (SELECT * FROM OverbookedAcs)) DELETE FROM ETickets e WHERE e.enumber = newr.enumber; Sidste scenario omfatter, at scheduleid ændres for en e-billet. Også i dette tilfælde vælger jeg at genoprette databasen som den var før ændringen: - 24 af 28 -

27 CREATE TRIGGER UpdateETicketSchTrigger AFTER UPDATE OF scheduleid ON ETickets REFERENCING OLD TABLE AS oldt, NEW TABLE AS newt FOR EACH STATEMENT WHEN (EXISTS (SELECT * FROM OverbookedAcs)) BEGIN DELETE FROM ETickets WHERE (enumber, passengerid, scheduleid, seatr, seatletter, aircraftnum) IN newt; INSERT INTO ETickets (SELECT * FROM oldt); END; Alt i alt skulle det nu betyde, at databasens tilstand altid er tilfredsstillende mht. antal sæder i ethvert fly, samt sikring mod overbooking. Bemærk, at ovenstående triggers er skrevet efter SQL-specifikationen ikke efter Oracle's syntaks, der indeholder mindre variationer. Brugere & autorisationer Hvis Air Crash systemet skulle have 3 brugertyper, fordelt som: a) Rejseselskaber, der skal kunne bestille billetter, b) Ansatte, der skal kunne udstede boarding passes, og c) Administratorer, der kunne oprette afgange og håndtere frequent flyers, vil det være oplagt at give dem forskellige rettigheder i systemet. Med det nuværende system vil disse rettigheder (privileges) skulle gives som: SELECT a) Passengers, ETickets, Schedules og Airports. Dertil kommer view'et nsfree, der afføder nsrightisfree, nsleftisfree, nsthisisfree, nsall, nsthisisused, nextto og Seats. b) ETickets og Schedules. Dertil kommer views: allinfo, nsfree og nsnotfree, der afføder numbers, passname, fliestoname, fliesfromname, Passengers, Airports, nsrightisfree, nsleftisfree, nsthisisfree, nsall, nsthisisused, nextto, Seats, nsnotfree og alle aw*-views. c) Airports, Aircrafts, Schedules, Passengers, ETickets. INSERT a) ETickets. b) (ingen rettigheder) c) Schedules af 28 -

28 UPDATE a) (ingen rettigheder) b) ETickets. c) Passengers. REFERENCES (gælder for alle brugertyper): Addresses (via Airports og Passengers); Passengers, Schedules og Seats (via ETickets); Airports og Aircrafts (via Schedules). TRIGGER: Hvis man tolker administratorgrupper som ansatte i Air Crash, der skal bruge Admin-interfacet, skal ikke engang denne gruppe have rettigheder til at oprette triggers. I denne sammenhæng er det en opgave for databaseadministratoren. De relationer, der omfattes af en trigger skal være tilgængelige for den bruger, der opretter den, men ikke for brugere, som udfører en handling, der vækker en trigger (Garcia-Molina et al. 2002, p. 411). Angivelsen af ovenstående rettigheder tager udgangspunkt i den aktuelle implementation med de funktionaliteter, der kræves i hvert af de 3 moduler af 28 -

29 K O N K L U S I O N & D I S K U S S I O N Gennem arbejdet med Air Crash Booking System, har vi i gruppen lavet en databasemodel, der kan løse de givne fordringer. Derudover mener jeg, at den endelige løsning er relativt fleksibel og i høj grad afspejler virkeligheden. I løbet af kurset er der sket flere ændringer i modellen efterhånden som vi er blevet klogere og problemerne er blevet mere komplekse. Denne udvikling er behandlet ovenfor. Der er benyttet constraints til at sikre, at databasen altid er i en gyldig tilstand. Desuden benytter vi i Java-interfacet transaktioner i de tilfælde, hvor flere queries skal udføres serielt, samt komplet eller slet ikke. Også hér er målet at sikre konsistens i databasens informationer. Det er min intention, at denne rapport skal vise motivationen og rationalet bag beslutninger i forbindelse med databasens design, samt de metoder, der er benyttet til at sikre konsistens. Alle queries og udtryk i relationel algebra er kommenteret. Dette er ligeledes for at tydeliggøre ræsonnementet bag hvert skridt. Alt i alt er jeg tilfreds med resultatet, da det opfylder de stillede krav. Desuden finder jeg modellen logisk og i overensstemmelse med mine tanker om, hvordan et bookingsystem bør fungere af 28 -

30 R E F E R E N C E R Garcia-Molina, H., J. D. Ullman & J. Widom. (2002). Database Systems: The Complete Book. Upper Saddle River, NJ: Prentice Hall, Inc af 28 -

Databasesystemer. IT Universitetet i København 7. juni 2005

Databasesystemer. IT Universitetet i København 7. juni 2005 Databasesystemer IT Universitetet i København 7. juni 2005 Eksamenssættet består af 5 opgaver med 13 spørgsmål, fordelt på 6 sider (inklusiv denne side). Vægten af hver opgave er angivet. Du har 4 timer

Læs mere

Søren Løbner (lobner) ddb Databaser 2007 10 10

Søren Løbner (lobner) ddb Databaser 2007 10 10 ddb Excercise Week 4 Fra relationships til relations Nu når vi har fået vores skemaer på plads, kan SQL udtrykkene til konstruktion af relationerne laves Det foregår ved at vi tager en 1 til 1 oversættelse

Læs mere

Begrænsninger i SQL. Databaser, efterår 2002. Troels Andreasen

Begrænsninger i SQL. Databaser, efterår 2002. Troels Andreasen Databaser, efterår 2002 Begrænsninger i SQL Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk

Læs mere

Databasesystemer. IT Universitetet i København 16. januar 2006

Databasesystemer. IT Universitetet i København 16. januar 2006 Databasesystemer IT Universitetet i København 16. januar 2006 Eksamenssættet består af 5 opgaver med 16 spørgsmål, fordelt på 6 sider (inklusiv denne side), samt et svarark, hvor visse spørgsmål skal besvares.

Læs mere

Views etc. Databaser

Views etc. Databaser Views etc. Databaser Views Med Views kan vi gemme nogle af de lange select sætninger. I vores eksempel fra tidligere er det f.eks. forbundet med en del besvær at finde telefon nr og bilmærker for en sælger

Læs mere

Skriftlig eksamen i. Databaser. Vinter 2002/2003. Vejledende løsninger

Skriftlig eksamen i. Databaser. Vinter 2002/2003. Vejledende løsninger Skriftlig eksamen i Databaser Vinter 2002/2003 Vejledende løsninger Dette eksamenssæt består af 5 nummererede sider (incl. denne). Der er 5 opgaver, som ved bedømmelsen tillægges følgende vægte: Opgave

Læs mere

Data lagring. 2. iteration (implement backend)

Data lagring. 2. iteration (implement backend) Data lagring 2. iteration (implement backend) Emner Grundlæggende database begreber. Data definitionskommandoer ER-diagrammer og cardinalitet/relationer mellem tabeller Redundant data og Normalisering

Læs mere

Skriftlig eksamen i Databaser, Vinter 2001/2002. Pa opfordring har jeg udarbejdet mulige lsninger pa eksamensopgaverne, men

Skriftlig eksamen i Databaser, Vinter 2001/2002. Pa opfordring har jeg udarbejdet mulige lsninger pa eksamensopgaverne, men Roskilde Universitetscenter Skriftlig eksamen i Databaser, Vinter 2001/2002 Opgaver med lsninger Pa opfordring har jeg udarbejdet mulige lsninger pa eksamensopgaverne, men har ikke haft tid til at polere

Læs mere

Introduktion til SQL queries

Introduktion til SQL queries Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til SQL queries Denne artikel beskriver nogle forskellige muligheder i SQL queries. Eksemplerne skulle gerne være standard SQL og virke i

Læs mere

Relationel Algebra og SQL

Relationel Algebra og SQL Relationel Algebra og SQL Indholdsfortegnelse Relationel Algebra og SQL...1 Indholdsfortegnelse...1 De oprindelige mængdeoperationer...2 1. UNION (foreningsmængde)...2 2. INTERSECTION (fællesmængde)...2

Læs mere

Skriftlig eksamen i kurset. Informationssystemer

Skriftlig eksamen i kurset. Informationssystemer 6. semester sundhedsteknologi Skriftlig eksamen i kurset Informationssystemer Der er 3 timer til at besvare opgaven. Alle hjælpemidler er tilladte. Skriv kort og præcist. Referer gerne til kursuslitteraturen.

Læs mere

Databaser Obligatorisk opgave 1

Databaser Obligatorisk opgave 1 University of Southern Denmark Department of Mathematics and Computer Science Databaser Obligatorisk opgave 1 Afleveres senest: Lørdag d. 23. marts kl 23.59 Introduction Denne obligatoriske opgave indeholder

Læs mere

Sidste forelæsning. Jacob Aae Mikkelsen. 28. april 2013 IMADA. Jacob Aae Mikkelsen (IMADA) Sidste forelæsning 28.

Sidste forelæsning. Jacob Aae Mikkelsen. 28. april 2013 IMADA. Jacob Aae Mikkelsen (IMADA) Sidste forelæsning 28. Sidste forelæsning Jacob Aae Mikkelsen IMADA 28. april 2013 Jacob Aae Mikkelsen (IMADA) Sidste forelæsning 28. april 2013 1 / 36 Outline 1 Brugere og Sikkerhed Jacob Aae Mikkelsen (IMADA) Sidste forelæsning

Læs mere

Skriftlig eksamen i. Datalogi. Databaser. Sommer 2001

Skriftlig eksamen i. Datalogi. Databaser. Sommer 2001 Skriftlig eksamen i Datalogi Databaser Sommer 2001 Dette eksamenssæt består af 4 nummererede sider (incl. denne). Der er 4 opgaver, som ved bedømmelsen tillægges følgende vægte: Opgave 1: 20% Opgave 2:

Læs mere

De vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML

De vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML SQL kap 6-7 + 17-20 DDL og DML 1 De vigtigste SQL-sætninger Data Definition Language (DDL) create table: opretter en ny tabel create unique index: tilføjer et index til en tabel drop table : sletter en

Læs mere

En opsamling af artefakter for Hotel Databasen som REST-service Bygger på Hotel opgaven i 8 trin

En opsamling af artefakter for Hotel Databasen som REST-service Bygger på Hotel opgaven i 8 trin En opsamling af artefakter for Hotel Databasen som REST-service Bygger på Hotel opgaven i 8 trin Trin 1: Lav en Domain model Opgave beskrivelse - Scandic hotel kæde Lav en domain model af Hotel-kæden.

Læs mere

! Kia Dahlen. Kamilla Klein, Pia Jensen og Maria Korshøj Andersen.

! Kia Dahlen. Kamilla Klein, Pia Jensen og Maria Korshøj Andersen. Copenhagen Business Academy Multimediedesigner 3. semester - 1. projekt, september 2014 Gruppe 1 - MulA Kia Dahlen. Kamilla Klein, Pia Jensen og Maria Korshøj Andersen. Study: Multimedia Design Project:

Læs mere

Assignment #5 Toolbox Contract

Assignment #5 Toolbox Contract Assignment #5 Toolbox Contract Created by: René Kragh Trine Randløv E mail address cph rk70@cphbusiness.dk 23 11 2014 1 Introduktion Dette dokument indeholder en vertikal kontrakt for et system som skal

Læs mere

Jayne Alice Jensen cph-jj208@cphbusiness.dk [Link til portfolio]

Jayne Alice Jensen cph-jj208@cphbusiness.dk [Link til portfolio] DATABASE Projekt: Projekt 1, 3. semester Website: http://kostecki.dk/cph/projektdb/ Dato: 08/09/14-21/09/14 Skole: Copenhagen Business Academy Klasse: Multimediedesigner - Mulb Gruppe: MULB1 Undervisere:

Læs mere

Eksamen, DSDS, forår 2009

Eksamen, DSDS, forår 2009 Eksamen, DSDS, forår 2009 Introduktion til Scripting, Databaser og Systemarkitektur Jonas Holbech IT Universitetet i København 3. juni 2009 Alle hjælpemidler er tilladte, dog ikke computer og kommunikationsmidler.

Læs mere

! Kia Dahlen. Kamilla Klein, Pia Jensen og Maria Korshøj Andersen.

! Kia Dahlen. Kamilla Klein, Pia Jensen og Maria Korshøj Andersen. Copenhagen Business Academy Multimediedesigner 3. semester - 1. projekt, september 2014 Gruppe 1 - MulA Kia Dahlen. Kamilla Klein, Pia Jensen og Maria Korshøj Andersen. Study: Multimedia Design Project:

Læs mere

Afleveringsopgave. Efterår 2001

Afleveringsopgave. Efterår 2001 Datalogi Database-kurset Efterår 2001 Afleveringsopgave Baseret på opgavetekst forfattet af Troels Andreasen, forår 2001 Let redigeret af Henning Christiansen, oktober 2001 Aflevering Opgaven afleveres

Læs mere

Skriftlig eksamen i. Databaser. Vinter 2002/2003

Skriftlig eksamen i. Databaser. Vinter 2002/2003 Skriftlig eksamen i Databaser Vinter 2002/2003 Dette eksamenssæt består af 5 nummererede sider (incl. denne). Der er 5 opgaver, som ved bedømmelsen tillægges følgende vægte: Opgave 1: 15% Opgave 2: 30%

Læs mere

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form Database-sproget SQL SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form SELECT A1,, Ar FROM R1,, Rk WHERE B med attributter A1,, Ar relationer R1,, Rk betingelse B (logisk

Læs mere

Datalagring og formater

Datalagring og formater Datalagring og formater IT Universitetet i København 4. januar 2011 Eksamenssættet består af 6 opgaver med 15 spørgsmål, fordelt på 11 sider (inklusiv denne side). Det anbefales at læse opgaverne i rækkefølge,

Læs mere

DML, Foresprgsler Relationel algebra + noget mere! af skemaer (overlap m. DDL)

DML, Foresprgsler Relationel algebra + noget mere! af skemaer (overlap m. DDL) SQL Stuctured Query Language, spiller roller som DDL, denere relationsskemaer m.v. DML, Foresprgsler Relationel algebra + noget mere! Opdatering af relationer af skemaer (overlap m. DDL) Hvem bruger SQL

Læs mere

Projekt 1 Database. Cphbusiness Lyngby Multimediedesigner, 3. semester mul-a12e, gruppe 1

Projekt 1 Database. Cphbusiness Lyngby Multimediedesigner, 3. semester mul-a12e, gruppe 1 Projekt 1 Database Cphbusiness Lyngby Multimediedesigner, 3. semester mul-a12e, gruppe 1 CREATE TABLE IF NOT EXISTS `3sempro1`.`cu `customer_id` INT(5) NOT NULL AUTO_INCR `name` VARCHAR(45) NULL DEFAULT

Læs mere

(fig.1. Eksempel på en almindelig entity)

(fig.1. Eksempel på en almindelig entity) Formål Formålet med denne opgave var, at designe et database system for et fiktivt universitet, ved hjælp af ER-model, for derefter at oversætte det til SQL tabeller. Og dernæst lave en assertion så der

Læs mere

Databasesystemer fra forskellige synsvinkler

Databasesystemer fra forskellige synsvinkler Databasesystemer fra forskellige synsvinkler Kim Skak Larsen kslarsen@imada.sdu.dk IMADA DM534 Introduktion til datalogi, 8/10 2015 p.1/60 Oversigt Introduktion Del 1: en designers synsvinkel Del 2: en

Læs mere

Database optimering - Indeks

Database optimering - Indeks Database optimering - Indeks Alle kender til dette irritations moment, hvor programmet man sidder og arbejder med, bare ikke er hurtigt nok. Selvom det kun drejer sig om få sekunder man sidder og venter,

Læs mere

1. Basal select med (stjerne)

1. Basal select med (stjerne) 1. Basal select med (stjerne) 1. List alle øltyper. a. select * from oltyper 2. List alle bryggerier a. select * from bryggeri 3. List alle Danmarks postnumre samt tilhørende by, landsdel og antal indbyggere

Læs mere

Database. lv/

Database. lv/ Database 1 Database Design Begreber 1 Database: En fælles samling af logiske relaterede data (informationer) DBMS (database management system) Et SW system der gør det muligt at definer, oprette og vedligeholde

Læs mere

Obligatorisk opgave 2. SQL, relationel algebra og relationel kalkyle

Obligatorisk opgave 2. SQL, relationel algebra og relationel kalkyle DM26 Obligatorisk opgave 2 SQL, relationel algebra og relationel kalkyle Jacob Christiansen 130282 moffe42 Thomas Duerlund 040980 duerlund Side 1 af 9 Opgave 1: Formål: Ud fra en database omhandlende en

Læs mere

DATABASE Projekt 1-3. semester

DATABASE Projekt 1-3. semester DATABASE Projekt 1-3. semester Gruppe 2- CLmul-a12e Projekt URL http://www.lucasperch.dk/projekter/database.pdf Gruppe 2 Lucas Perch-Nielsen cph-lp14@cphbusiness.dk http://lucasperch.dk/skole.php Niclas

Læs mere

Eksamen 2013. Uden hjælpemidler - normeret til 60 minutter

Eksamen 2013. Uden hjælpemidler - normeret til 60 minutter ksamen 2013 Uden hjælpemidler - normeret til 60 minutter 1 er-diagram 1 /R iagram til relationelle model xported at: Mon May 13 2013 22:43:32 GMT+0200 (ST) Untitled etragt Page figur 1. Hvordan oversættes

Læs mere

3. semester, 2. projekt: Database

3. semester, 2. projekt: Database 3. semester, 2. projekt: Database MulA - Gruppe 1 7. september 2015-20. september 2015 Vejledere - IRF / TUJE FAKTAARK PROJEKTTITEL Database URL http://moodings.com Mette Line Tarp Jørgensen Email cph-mj420@cphbusiness.dk

Læs mere

DOCUMENTATION FULLY DRESSED USE-CASE. 29. oktober 2012 [ TEMA PERSISTENS DOKUMENTATION] Use-case: Process Order

DOCUMENTATION FULLY DRESSED USE-CASE. 29. oktober 2012 [ TEMA PERSISTENS DOKUMENTATION] Use-case: Process Order DOCUMENTATION FULLY DRESSED USE-CASE Use-case: Process Order Omfang og niveau: Dette omhandler en ordre der går gennem systemet Primær aktør: Sælger Pre betingelser: At der ikke er registret kunder Post

Læs mere

Databasesystemer. IT Universitetet i København 8. juni 2006

Databasesystemer. IT Universitetet i København 8. juni 2006 Databasesystemer IT Universitetet i København 8. juni 2006 Eksamenssættet består af 5 opgaver med 16 spørgsmål, fordelt på 7 sider (inklusiv denne side), samt et svarark, hvorpå visse spørgsmål skal besvares.

Læs mere

Anvisning i aflevering af bitemporale data

Anvisning i aflevering af bitemporale data UDKAST udgivet juni 2019 Anvisning i aflevering af bitemporale data Baggrund Aflevering af data fra it-systemer til et offentligt arkiv er baseret på aflevering af en arkiveringsversion i en relationel

Læs mere

DB undervisning 01-01

DB undervisning 01-01 Databaser... 2 Tabeller... 2 Redundans... 3 Første regel... 4 Anden regel... 4 Tredje regel... 5 Relationer... 5 Opskrift... 6 SQL sætninger til at oprette tabeller... 7 SQL sætninger til at indsætte data...

Læs mere

CLmul-b14e Gruppe 2 2. Database projekt

CLmul-b14e Gruppe 2 2. Database projekt 1 2 CLmul-b14e Gruppe 2 2. Database projekt JONAS FALK sniller27@hotmail.com Projekt vejledere Ivan Rosenvinge Frederiksen CHRISTIAN BRAMS halkjaer-brams@hotmail.com Tue Becher LINE RASMUSSEN line-rasmussen@live.com

Læs mere

JAR Øvelse nr. 2. JAR-Manual, Version 1.0. Avanceret søgning. Regionsvejledning

JAR Øvelse nr. 2. JAR-Manual, Version 1.0. Avanceret søgning. Regionsvejledning JAR Øvelse nr. 2 Avanceret søgning Regionsvejledning JAR-Manual, Version 1.0 Øvelse ID: 2 Øvelsesemne: Avanceret søgning Øvelsesbeskrivelse: Gør dig i stand til at bygge avancerede søgninger op. Formål:

Læs mere

Views. Et view er en relation defined ud fra gemte tabeller ( base tables ) og andre views To typer:

Views. Et view er en relation defined ud fra gemte tabeller ( base tables ) og andre views To typer: Views 1 Views Et view er en relation defined ud fra gemte tabeller ( base tables ) og andre views To typer: 1. Virtual = Ikke gemt i databasen; kun definitionen af den 2. Materialized = Date konstrueret

Læs mere

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel: Denne guide er oprindeligt udgivet på Eksperten.dk SQL og ASP En artikel omkring simpel SQL og hvordan disse opbygges, udformes og udføres, sådan at man kan få et brugbart resultat i ASP. Dette ligefra

Læs mere

Database design for begyndere

Database design for begyndere Denne guide er oprindeligt udgivet på Eksperten.dk Database design for begyndere Denne artikel beskriver hvordan man kommer fra ide til database design. Den stopper inden normal former. Den forudsætter

Læs mere

Eksamen, DSDS, efterår 2008

Eksamen, DSDS, efterår 2008 Eksamen, DSDS, efterår 2008 Introduktion til Scripting, Databaser og Systemarkitektur Jonas Holbech IT Universitetet i København 6. januar 2009 Alle hjælpemidler er tilladte, dog ikke computer og kommunikationsmidler.

Læs mere

Side 1. Databaser og SQL. Dagens gang. Databasebegreber. Introduktion til SQL Kap 1-5

Side 1. Databaser og SQL. Dagens gang. Databasebegreber. Introduktion til SQL Kap 1-5 Databaser og SQL Introduktion til SQL Kap 1-5 1 Dagens gang Databaser Database begreber Mapning af klasser til relationel model Normalisering Opgaver til næste gang 2 Databasebegreber A database is a:

Læs mere

Database programmerings tips

Database programmerings tips Denne guide er oprindeligt udgivet på Eksperten.dk Database programmerings tips Denne artikel vil introducere nogle problem stillinger med flere samtidige brugere, som man skal tænke på, når man udvikler

Læs mere

Manglende konsistens i datamodellen og upræcise SQLsætninger er årsagen til, at mange IT-systemer fejler.

Manglende konsistens i datamodellen og upræcise SQLsætninger er årsagen til, at mange IT-systemer fejler. Manglende konsistens i datamodellen og upræcise SQLsætninger er årsagen til, at mange IT-systemer fejler. Af Seniorkonsulent Carsten Saastamoinen-Jakobsen Skal datamodellen blot være på 3NF (normalform)?

Læs mere

Projekt: Database. Multimedia Design: Semester 3 - projekt 01. Sabine Larsen cph-sl176@cphbusiness.dk. Anastasia Keller cph-ak186@cphbusiness.

Projekt: Database. Multimedia Design: Semester 3 - projekt 01. Sabine Larsen cph-sl176@cphbusiness.dk. Anastasia Keller cph-ak186@cphbusiness. Anslag: 21284 Multimedia Design: Semester 3 - projekt 01 Projekt: Database Projektperiode: 07. September 20. September 2015 Gruppe nummer: MulB07 Vejledere: Ivan Rosenvinge Frederiksen & Tuje Becher MULA

Læs mere

A11: Last Year s Exam

A11: Last Year s Exam A11: Last Year s Exam Agenda Design of Site map and Web- structure (3) Design of data model (1) Design of database transactions (2) Construction of HTML and PHP scripts (3) Exercise 3: Design of Site map

Læs mere

Database kursus Forår 2013

Database kursus Forår 2013 Database kursus Forår 2013 Jacob Aae Mikkelsen Database design og programmering/databaser fra Organisationsorienteret softwareudvikling 1 Praktisk info Lærebog Database Systems: The Complete Book Skema

Læs mere

Efterår 2002 Note 10. Temaopgave

Efterår 2002 Note 10. Temaopgave Datalogi Database-kurset Efterår 2002 Note 10 Temaopgave Formålet med temaopgaven er at I skal arbejde med vigtige dele af kursusstoffet indenfor et specifikt problemområde/tema. Temaopgaven omfatter 4

Læs mere

En Kort Introduktion til Oracle

En Kort Introduktion til Oracle En Kort Introduktion til Oracle Henrik Bulskov 12. februar 2001 bulskov@ruc.dk 1 Start SQL*Plus... 1 1.1 TELNET... 1 1.2 WINDOWS SQL PLUS... 2 2 Kør et SQL-script... 3 3 Hjælp i SQL*Plus... 3 4 Editering

Læs mere

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach (jeans@ruc.dk) 2002

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach (jeans@ruc.dk) 2002 Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach (jeans@ruc.dk) 2002 På datalogi har vi en databaseserver, som de studerende på datalogi kan benytte til projekter og som også benyttes i forbindelse

Læs mere

Eksamen, DSDS, efterår 2007

Eksamen, DSDS, efterår 2007 Eksamen, DSDS, efterår 2007 Introduktion til Scripting, Databaser og Systemarkitektur Jonas Holbech og Martin Elsman IT Universitetet i København 7. januar 2008 Alle hjælpemidler er tilladte, dog ikke

Læs mere

Databasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002

Databasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002 Databaser, efterår 2002 Databasesystemer Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk

Læs mere

Projekt titel. Projekt navn. Gruppe medlemmer. Klasse/Gruppenummer. Databaseprojekt 1. Ferrari

Projekt titel. Projekt navn. Gruppe medlemmer. Klasse/Gruppenummer. Databaseprojekt 1. Ferrari Projekt titel Databaseprojekt 1 Projekt navn Ferrari Gruppe medlemmer Christian Lund (christiandevries.dk) Alexander Kofod (thisisalex.dk) Mark Halding (haldingweb.dk) Klasse/Gruppenummer MulA - gruppe

Læs mere

Få sin querystring til at fungere. (Nybegyndere)

Få sin querystring til at fungere. (Nybegyndere) Denne guide er oprindeligt udgivet på Eksperten.dk Få sin querystring til at fungere. (Nybegyndere) Artikelen henvender sig til nybegyndere der har problemer med at få sin querystring til at fungere (Access/ASP).

Læs mere

Modul 2 Database projekt Multimediedesign 3. semester Gruppe 3 IRF/TUJE

Modul 2 Database projekt Multimediedesign 3. semester Gruppe 3 IRF/TUJE Modul 2 Database projekt Multimediedesign 3. semester Gruppe 3 IRF/TUJE Fact sheet Indholdsfortegnelse Fact Sheet Gantt kort Valgt af virksomhed Brainstorm Attribut tabel ER-diagram Skitse MySQLWorkbench

Læs mere

Fra ER-Diagram til Relationel model i 7 step

Fra ER-Diagram til Relationel model i 7 step Fra ER-Diagram til Relationel model i 7 step STEP 1: For regular entity type E in ER schema, create a relation R that includes all the simple attributes, and component attributes of composite attributes.

Læs mere

Databaseadgang fra Java

Databaseadgang fra Java Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,

Læs mere

MsSQL: Basal performance tuning, part 1

MsSQL: Basal performance tuning, part 1 Denne guide er oprindeligt udgivet på Eksperten.dk MsSQL: Basal performance tuning, part 1 Hvordan man skriver "God SQL" for bedre performance. Skrevet den 03. Feb 2009 af trer I kategorien Databaser /

Læs mere

Projekt database. http://bysileha.com/3.semester/database-eshop/index.html (vores htmlside)

Projekt database. http://bysileha.com/3.semester/database-eshop/index.html (vores htmlside) Projekt database http://bysileha.com/3.semester/database-eshop/index.html (vores htmlside) Amanda Lindschouw - cph-al144@cphbusiness.dk http://ahldesign.dk/learningthird.html Charlotte Øberg - cph-co74@cphbusiness.dk

Læs mere

3. SEMESTER 2. PROJECT MULB Gruppe 1. 20. september 2015

3. SEMESTER 2. PROJECT MULB Gruppe 1. 20. september 2015 PROJECT DATABASE 3. SEMESTER 2. PROJECT MULB Gruppe 1. 20. september 2015 Ved at underskrive dette dokument bekræfter vi, at det indsendte materiale alt sammen er vores eget materiale og arbejde. Andreas

Læs mere

Projekt database. 3 Semester - Mul a Projekt 1. Yaser Osman cph-mo102@cphbusiness.dk. Dan Eskildsen cph-de32@cphbusiness.dk

Projekt database. 3 Semester - Mul a Projekt 1. Yaser Osman cph-mo102@cphbusiness.dk. Dan Eskildsen cph-de32@cphbusiness.dk Projekt database 3 Semester - Mul a Projekt 1 Yaser Osman cph-mo102@cphbusiness.dk Dan Eskildsen cph-de32@cphbusiness.dk Ammar Al-Basri cph-aa140@cphbusiness.dk Emre Kandemir cph-ek68@cphbusiness.dk Lotte

Læs mere

Import af rekursivt (parent-child) hierarki i Palo

Import af rekursivt (parent-child) hierarki i Palo Import af rekursivt (parent-child) hierarki i Palo Dette dokument beskriver hvordan et simpelt rekursivt (parent-child) hierarki kan importeres ind i Palo på forskellige måder via SQL og samtidig bibeholde

Læs mere

Projekt Database, Gruppe 4A. Projekt 1, 3. Semester D A T A B A S E. Klasse MulA13 Gruppenummer: A4

Projekt Database, Gruppe 4A. Projekt 1, 3. Semester D A T A B A S E. Klasse MulA13 Gruppenummer: A4 Projekt Database, Gruppe 4A 0 Projekt 1, 3. Semester D A T A B A S E Klasse MulA13 Gruppenummer: A4 Projekt Database, Gruppe 4A 1 Fakta-ark Klasse MulA13, Gruppenummer: A4 Gruppemedlemmer: Amalie Ardahl

Læs mere

PAKKEREJSE-ANKENÆVNET

PAKKEREJSE-ANKENÆVNET PAKKEREJSE-ANKENÆVNET 1 K E N D E L S E i sag nr. 2015/0220 afsagt den 16. februar 2016 ****************************** KLAGER JPK (2 personer) SALGSBUREAU ARRANGØR Rejsefeber ApS (Bengt-Martins Rejser

Læs mere

Dorthes Bog Centrum har ca forskellige bøger (bibliografiske enheder), som alle skal være søgbare fra prototypen.

Dorthes Bog Centrum har ca forskellige bøger (bibliografiske enheder), som alle skal være søgbare fra prototypen. Afleveringsopgave Hermed afleveringsopgaven for kurset. Besvarelsen, der gerne må udfærdiges i grupper, er del af den mundtlige eksamen (som i øvrigt er individuel). Problemet Efter flere møder med firmaet

Læs mere

CPH: 1 million flere rejsende i Københavns Lufthavn i 2015

CPH: 1 million flere rejsende i Københavns Lufthavn i 2015 KØBENHAVNS LUFTHAVNE A/S - København CPH: 1 million flere rejsende i Københavns Lufthavn i 2015 I 2015 rejste flere end 26,6 millioner gennem Københavns Lufthavn. Det er en stigning på en million sammenlignet

Læs mere

Introduktion til programmering

Introduktion til programmering Introduktion til programmering Databaser Uge 38 L. Ingemann: SQL databaser på nettet, kap 2-4. Kompendium L. Ingemann: SQL databaser på nettet, kap 6-20, Kompendium Sidste gang Databaser Relationelle databaser

Læs mere

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

Øvelse 9. Klasser, objekter og sql-tabeller insert code here Øvelse 9. Klasser, objekter og sql-tabeller Denne opgave handler om hvordan man opbevarer data fra databasekald på en struktureret måde. Den skal samtidig give jer erfaringer med objekter, der kommer til

Læs mere

Databasesystemer. IT Universitetet i København 8. juni 2006

Databasesystemer. IT Universitetet i København 8. juni 2006 Databasesystemer IT Universitetet i København 8. juni 2006 Eksamenssættet består af 5 opgaver med 16 spørgsmål, fordelt på 10 sider (inklusiv denne side), samt et svarark, hvorpå visse spørgsmål skal besvares.

Læs mere

PAKKEREJSE-ANKENÆVNET

PAKKEREJSE-ANKENÆVNET PAKKEREJSE-ANKENÆVNET K E N D E L S E i sag nr. 180/2007 afsagt den ****************************** REJSEMÅL: Firenze, Italien. 14.4.-21.4.2007 PRIS: KLAGEN ANGÅR: KRAV: 11.562 kr. (ekskl. forsikringer)

Læs mere

Relationel Algebra...1. Indholdsfortegnelse...1. Operationer på den relationelle model...2

Relationel Algebra...1. Indholdsfortegnelse...1. Operationer på den relationelle model...2 Relationel Algebra Indholdsfortegnelse Relationel Algebra...1 Indholdsfortegnelse...1 Operationer på den relationelle model...2 Mængdeoperationerne...2 Union...2 Difference...2 Intersection...3 Hvilke

Læs mere

OIOREST webservice design. Guideline til design af REST-baserede webservices. Udgivet af: IT- & Telestyrelsen

OIOREST webservice design. Guideline til design af REST-baserede webservices. Udgivet af: IT- & Telestyrelsen > OIOREST webservice design. Guideline til design af REST-baserede webservices. Udgivet af: IT- & Telestyrelsen Publikationen kan også hentes på IT- & Telestyrelsens Hjemmeside: http://www.itst.dk ISBN

Læs mere

Samspillet mellem databaser og kort styres af GeoCAD programmet GeoDB.

Samspillet mellem databaser og kort styres af GeoCAD programmet GeoDB. GeoCad modul GeoDB I GeoCAD er det muligt at koble relationsdatabase til GeoEDIT. Her igennem er det muligt at lagre forskellige oplysninger i databasen og koble disse oplysninger til objekter i kortet.

Læs mere

Projekt 1 - Database. Cphbusiness Lyngby Multimediedesigner, 3. semester. MulB13e, gruppe 4

Projekt 1 - Database. Cphbusiness Lyngby Multimediedesigner, 3. semester. MulB13e, gruppe 4 Cphbusiness Lyngby Multimediedesigner, 3. semester MulB13e, gruppe 4 September 2014 http://www.designduck.dk/cph/trorodvin create table costumers ( cno INT(4) Primary key AUTO_INCREMENT, cname VARCHAR(30)

Læs mere

KEMIguiden Vejledning. Rev. udgave april 2010

KEMIguiden Vejledning. Rev. udgave april 2010 KEMIguiden Vejledning Rev udgave april 2010 KEMIguiden Vejledning april 2010 2 Indholdsfortegnelse 1 Indledning 3 2 Arbejdsgange i KemiGuiden 4 21 Oprettelse af en leverandør 4 22 Oprettelse af kategorier

Læs mere

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form Database-sproget SQL SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form SELECT A1,, Ar FROM R1,, Rk WHERE B med attributter A1,, Ar relationer R1,, Rk betingelse B (logisk

Læs mere

Conceptual, logic, physical

Conceptual, logic, physical Conceptual, logic, physical Conceptual er et billede af virkeligheden. Entity names og attributter relaterer til den faktiske verden. Physical er i SQL databasen, her skriver vi de navne på tabeller og

Læs mere

Instruks om Air Greenlands virksomhedsportal til billetbestilling Sektion 5.3

Instruks om Air Greenlands virksomhedsportal til billetbestilling Sektion 5.3 Air Greenland har et billetbestillingssystem, kaldet virksomhedsportalen. Systemet bliver betjent via internettet. Betjening af systemet. Billetbestillingssystemet kan betjenes af en person fra en vilkårlig

Læs mere

Indholdsfortegnelse. 1. Installation af LØN... 1. 2. Introduktion til LØN... 2. 3. Indtastning af lønseddel... 7. 4. Udskrifter...

Indholdsfortegnelse. 1. Installation af LØN... 1. 2. Introduktion til LØN... 2. 3. Indtastning af lønseddel... 7. 4. Udskrifter... Løn til Windows Indholdsfortegnelse 1. Installation af LØN... 1 2. Introduktion til LØN... 2 2.1. Første start af LØN...2 2.1.1. Ét eller flere distrikter...2 2.1.2. Lønperioder...3 2.1.3. Kartoteker...4

Læs mere

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON Data load og udtræk 2. iteration: implmentation (test af backend) 1 PHP mysql Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON 2 Data udtræk PHP mysql: Processen 1. Forbind til MySQL server

Læs mere

Sådan opsætter du dit CompuBook bookingsystem med henblik på online salg via TouristOnline. Manual 2010 - version 2.0

Sådan opsætter du dit CompuBook bookingsystem med henblik på online salg via TouristOnline. Manual 2010 - version 2.0 Sådan opsætter du dit CompuBook bookingsystem med henblik på online salg via TouristOnline Manual 2010 - version 2.0 INDHOLDSFORTEGNELSE 1. INDLEDENDE FORKLARING...3 2. SÅDAN STARTER DU!...3 3. ADGANG

Læs mere

Erhvervs- og Boligstyrelsen

Erhvervs- og Boligstyrelsen Erhvervs- og Boligstyrelsen Analyse af vejnavnesammenfald Undersøgelse af problemer mht. flere forekomster af samme vejnavn i kommunen - efter en kommunesammenlægning Februar 2004 www.carlbro.com INDHOLDSFORTEGNELSE

Læs mere

SQL Server 2016 Data Adgang

SQL Server 2016 Data Adgang SQL Server 2016 Data Adgang MSBIP, 5. OKTOBER, 2015 Agenda SQL Server 2016 CTP 2.3 Pragmatisk Data Adgangskontrol Row Level Security Dynamic Masking Kombination af begge Alternativet Hvem er jeg Selvstændig

Læs mere

Se en verden fra oven

Se en verden fra oven Se en verden fra oven En helt speciel oplevelse! Den bog, du nu holder i hænderne, har et budskab: personen, som forærede den til dig, ønsker at give dig en speciel gave - en oplevelse. Hvilken oplevelse

Læs mere

Database "opbygning"

Database opbygning Database "opbygning" Dette områder falder mest under en DBA's ansvarsområde. Det kan sagtens tænkes at en database udvikler i nogle situationer vil blive nød til at oprette produktions og test) databaser,

Læs mere

Nyhedsmodul brugermanual

Nyhedsmodul brugermanual Nyhedsmodul brugermanual version 6 Indholdsfortegnelse 1. Kategorier... 02 1.1. Hvordan opretter jeg en kategori?... 02 1.2. Hvordan viser jeg en nyhedskategori på websitet?... 02 2. Oprettelse/redigering

Læs mere

Sundhedskampagne. Skadelig brug af teknologi 27-04-2016. Jakob Hannibal

Sundhedskampagne. Skadelig brug af teknologi 27-04-2016. Jakob Hannibal Sundhedskampagne Skadelig brug af teknologi 27-04-2016 Jakob Hannibal Indhold Opgavebeskrivelse:... 2 Markedsbeskrivelse:... 3 Problemstillingen... 4 Præcisering af målgruppen... 4 Brugerundersøgelse /

Læs mere

Introduktion til OPC Access

Introduktion til OPC Access Introduktion til OPC Access OPC Access anvendes til at kommunikere med jeres produktionsudstyr via OPC. OPC Access kombinerer en SQL Server med OPC, således at jeres produktionsudstyr kobles sammen med

Læs mere

SQL-opgaver 5 løsning

SQL-opgaver 5 løsning SQL-opgaver 5 løsning Diagrammet herunder viser, hvordan kildetabellerne gerne skal se ud efter at have løst de tidligere opgaver. Scriptet opgave_5.txt indeholder også disse tabelstrukturer og alle data,

Læs mere

RUTruteplanlægningsvejledning. Folkekirkens Nødhjælp Sogneindsamling 2015

RUTruteplanlægningsvejledning. Folkekirkens Nødhjælp Sogneindsamling 2015 RUTruteplanlægningsvejledning Folkekirkens Nødhjælp Sogneindsamling 2015 Indhold 1. Introduktion til RUT... 2 1.1 Om vejledningen... 2 2. Log på RUT... 4 3. Sådan planlægger du ruter... 6 4. Sådan finder

Læs mere

Introduktion til programmering

Introduktion til programmering Introduktion til programmering Databaser Uge 37 Computer Science, kap 9. Hugh Darwen: what a database really is, G. Riccardi: Princples of database systems, kap 2., kompendium. Plan Oprette jer på IMV

Læs mere

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0 Program Dokumentation PC Software Skrevet af Gruppen. Version 1.0 Indholds fortegnelse 1. INDLEDNING...3 1.1. FORMÅL...3 1.2. REFERENCER...3 1.3. VERSIONSHISTORIE...3 1.4. DEFINITIONER...3 1.5. DOKUMENTATIONENS

Læs mere

Dokumentation af programmering i Python 2.75

Dokumentation af programmering i Python 2.75 Dokumentation af programmering i Python 2.75 Af: Alexander Bergendorff Jeg vil i dette dokument, dokumentere det arbejde jeg har lavet i løbet opstarts forløbet i Programmering C. Jeg vil forsøge, så vidt

Læs mere

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in... 2. RefWorks-databasen... 2

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in... 2. RefWorks-databasen... 2 RefWorks vejledning Indhold Oprettelse af konto/log in... 2 RefWorks-databasen... 2 Import af referencer... 2 Pubmed... 3 Embase/Psycinfo/Medline (Ovid)... 4 Cinahl... 5 RefGrab-it... 6 Organisering af

Læs mere