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



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

Views etc. Databaser

Fra ER-Diagram til Relationel model i 7 step

Databaser Aflevering 2

Introduktion til SQL queries

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

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

Data lagring. 2. iteration (implement backend)

Database design for begyndere

Databaser Obligatorisk opgave 1

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

Database. lv/

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

User Manual for LTC IGNOU

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

DET KONGELIGE BIBLIOTEK NATIONALBIBLIOTEK OG KØBENHAVNS UNIVERSITETS- BIBLIOTEK. Index

Subject to terms and conditions. WEEK Type Price EUR WEEK Type Price EUR WEEK Type Price EUR WEEK Type Price EUR

Eksamen, DSDS, efterår 2007

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

Trolling Master Bornholm 2015

Eksamen, DSDS, efterår 2008

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

Relationel Algebra og SQL

Databasesystemer fra forskellige synsvinkler

DB undervisning 01-01

Database kursus Forår 2013

IBM Network Station Manager. esuite 1.5 / NSM Integration. IBM Network Computer Division. tdc - 02/08/99 lotusnsm.prz Page 1

DSB s egen rejse med ny DSB App. Rubathas Thirumathyam Principal Architect Mobile

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

UDKAST & et tidligt kig | Tog i Danmark | K20 | DSB

UDKAST & et tidligt kig | Tog i Danmark | K20 | Opdateret 4 September 2019 | DSB

Anne Randorff Højen

Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach 2002

POST IT! Cph Business Academy Multimediedesign 2. Semester flow april Kirstine Marie Rasmussen cph-

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

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Introduktion til programmering

Basic statistics for experimental medical researchers

3. semester, 2. projekt: Database

Anvisning i aflevering af bitemporale data

Trolling Master Bornholm 2016 Nyhedsbrev nr. 8

PARALLELIZATION OF ATTILA SIMULATOR WITH OPENMP MIGUEL ÁNGEL MARTÍNEZ DEL AMOR MINIPROJECT OF TDT24 NTNU

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

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

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

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

Fejlbeskeder i SMDB. Business Rules Fejlbesked Kommentar. Validate Business Rules. Request- ValidateRequestRegist ration (Rules :1)

InterCity og InterCityLyn

Trolling Master Bornholm 2016 Nyhedsbrev nr. 7

Business Opening. Very formal, recipient has a special title that must be used in place of their name

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

Terese B. Thomsen 1.semester Formidling, projektarbejde og webdesign ITU DMD d. 02/

Project Step 7. Behavioral modeling of a dual ported register set. 1/8/ L11 Project Step 5 Copyright Joanne DeGroat, ECE, OSU 1

Trolling Master Bornholm 2015

Hvor er mine runde hjørner?

Åbenrå Orienteringsklub

LUL s Flower Power Vest dansk version

SQL-opgaver 5 løsning

OPDATERET | InterCity og InterCityLyn | Åbning af København - Køge - Ringsted banen den 1 Juni | K19 | DSB

Business Rules Fejlbesked Kommentar

Boligsøgning / Search for accommodation!

How Long Is an Hour? Family Note HOME LINK 8 2

Fejlbeskeder i Stofmisbrugsdatabasen (SMDB)

Business Opening. Very formal, recipient has a special title that must be used in place of their name

Databaser Obligatorisk opgave 2 Vejledende løsning

Jayne Alice Jensen [Link til portfolio]

SAS Corporate Program Website

Skriftlig Eksamen Diskret matematik med anvendelser (DM72)

QUICK START Updated:

Timetable will be aviable after sep. 5. when the sing up ends. Provicius timetable on the next sites.

Tagwall med Php & MySQL

Aktivering af Survey funktionalitet

Unitel EDI MT940 June Based on: SWIFT Standards - Category 9 MT940 Customer Statement Message (January 2004)

3. SEMESTER 2. PROJECT MULB Gruppe september 2015

Trolling Master Bornholm 2013

MsSQL: Basal performance tuning, part 1

Transkript:

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 af skemaerne, og sørger for at indarbejde de krævede constraints De understregede koverteres til Keys eller Uniques, som er single value constraints Da der udelukkende kan eksistere unikke tupler af disse Unique dog med undtagelsen af NULL værdier, da disse godt kan optræde for denne type Til stort set alle attributer er tilføjet en constraint med NOT NULL som ikke tillader indsættelse af en tuppel hvor disse attributer mangler Enkelte steder, som feks level attibutten, må gerne være NULL For enkelte relationer er der således CHECK's af om disse constraints er overholdt Teoretisk virker de ligesom assertions, ved at værdier som ikke evaluere til TRUE, ikke tillades at blive indsat i relationen I vores DBMS, som er MySQL med phpmyadmin som frontend, lader disse constraints dog ikke til at blive overholdt Ikke destomindre er de med Den første transformation er simpel: Wagons(ID) Skemaet konverteres så til en SQL statement: CREATE TABLE Wagons( wagon_id INT PRIMARY KEY Så er det Seats entiteten som konverteres I denne har jeg i mit E/R diagram og skema en Boolean isasleep, som så har en isa relation til Sleep entiteten Denne Sleep entitet har fire attributter, hvor af de tre bare er duplikater fra Seats relationen, og så attributten level Den entitet er tydeligvis redundant, og derfor befandt level sig noget smartere under selve Seats entiteten Og hvis der ikke specificeret en level (hvis den er NULL) så er det ikke en soveplads Seats(Letter, Row, SeatClass, isasleep, wagon_id) SeatClass: er enten '1 klasse' eller 'standard' level: Soveplads niveau 1 eller 0, eller null hvis sæde wagon_id: er togvognens unikke ID Da ROW er en kommando i SQL er attributnavnet blevet _row og attributten isasleep fra skemaet er byttet ud med level CREATE TABLE Seats( _row letter p 1 7

wagon_id INT NOT NULL REFERENCES Wagons(wagon_id), UNIQUE(_row, letter, wagon_id), seatclass CHAR(10) NOT NULL, level INT, CHECK(seatclass IN ('1 klasse','standard')), CHECK(level IN ('0','1',NULL)) Så laver jeg et INDEX over sæderne, da de bliver refereret hver gang der bliver lavet et kald til NextToSeat relationen CREATE UNIQUE INDEX SeatIndex ON Seats(_row, letter, wagon_id Og så NextToSeat relationen, som dannes ud fra flg skema: NextToSeat(r_Letter, r_row, r_wagon_id, l_letter, l_row, l_wagon_id) r_: er sædet til venstre for l_: er sædet til højre for Alle keys er referencer til Seats relationen CREATE TABLE NextToSeat( r_row r_letter l_row l_letter wagon_id FOREIGN KEY(r_row, r_letter, wagon_id) REFERENCES Seats(_row, letter, wagon_id), FOREIGN KEY(l_row, l_letter, wagon_id) REFERENCES Seats(_row, letter, wagon_id), CHECK(NOT((r_row = l_row) AND (r_letter = l_letter))) Derefter Stations relationen Den havde jeg glemt at få med i mit skema, men da jeg begyndte at tænke over strukturen, indså jeg at den var nødvendig Den har et skema som ser sådan he ud: Stations(name, location) Og relationen: CREATE TABLE Stations( name VARCHAR(50) PRIMARY KEY, location VARCHAR(50) NOT NULL Hver gang der skal bruges et startpoint eller endpoint skal der laves opslag i Stations, derfor laves der et INDEX dertil CREATE UNIQUE INDEX StationNameIndex ON Stations(name p 2 7

Herefter er det skemaet for Connections som har flg skema Connections(Departure, Arrival, ChildRebate, OldRebate, StdRebate, StartName, EndName, wagon_id) Det er jeg også i stand til at følge, og producere en relation ud fra Da rabatterne er procentsatser, skal deres værdi befinde sig mellem 0 og 100 Og alle priserne mellem alle byerne er 42, Jeg er ikke klar over om man logisk kan sammenligne TIMESTAMP's, men da MySQL, som tidligere nævnt, ikke rigtigt retter sig efter disse tjeks, har det ikke noget problem med det CREATE TABLE Connections( departure TIMESTAMP, TIMESTAMP, start_name VARCHAR(50) REFERENCES Station(Name), end_name VARCHAR(50) REFERENCES Station(Name), UNIQUE(departure,, start_name, end_name), childrebate oldrebate std_rebate wagon_id CHECK(start_name <> end_name) CHECK(departure < ), CHECK( 0 >= (childrebate AND oldrebate AND oldrebate) <= 100) E Tickets er en simpel relation, med kun en ID attribut CREATE TABLE E_Tickets( eticket_id INT PRIMARY KEY Herefter Passengers relationen ud fra skemaet Passengers(ID, Name, Age, OrdreNo) Age: er et positivt tal ID: er unikt pr person OrdreNo: er de billetter som er købt i denne persons navn Med flg relation CREATE TABLE Passengers( id INT NOT NULL PRIMARY KEY, name CHAR(255) NOT NULL, age ordreno INT NOT NULL REFERENCES E_Tickets(eticket_id) p 3 7

Til sidst danner jeg relationerne ud fra mine relationships Her er alle attributterne referencer fra mine entity sets CREATE TABLE Spans( departure TIMESTAMP NOT NULL, TIMESTAMP NOT NULL, start_name VARCHAR(50) NOT NULL, end_name VARCHAR(50) NOT NULL, FOREIGN KEY(departure,, start_name, end_name) REFERENCES Connections(depart, arrive, start_name, end_name), eticket_id INT NOT NULL REFERENCES E_Tickets(eticket_id) CREATE TABLE RunsOn( wagon_id INT NOT NULL REFERENCES Wagons(wagon_id), departure TIMESTAMP NOT NULL, TIMESTAMP NOT NULL, start_name VARCHAR(50) NOT NULL, end_name VARCHAR(50) NOT NULL, FOREIGN KEY(departure,, start_name, end_name) REFERENCES Connections(depart, arrive, start_name, end_name) CREATE TABLE Reservations( eticket_id INT NOT NULL REFERENCES E_Tickets(eticket_id), departure TIMESTAMP NOT NULL, TIMESTAMP NOT NULL, start_name VARCHAR(50) NOT NULL, end_name VARCHAR(50) NOT NULL, FOREIGN KEY(departure,, start_name, end_name) REFERENCES Connections(depart, arrive, start_name, end_name), _row letter wagon_id FOREIGN KEY(_row, letter, wagon_id) REFERENCES Seats(_row, letter, wagon_id) Jeg synes det er blevet til noget værre mudder MySQL understøtter ikke REFERENCES til at opretholde integriteten med Og MySQL v4 har heller ikke TRIGGERS, så jeg kan på ingen måde opretholde en konsistent database Og ligeledes er det noget af et møjsomt arbejde at tilføje og ændre på de forskellige relationer og attributter p 4 7

Queries: De queries der blev oprettet som relationel algebra, bliver som følger når de er oversat til SQL: 1) How many seats are still available (ie not booked) on today's 10am direct connection between Vejle and Fredericia? SELECT COUNT(Connectionswagon_id) AS FreeSeats FROM Connections NATURAL JOIN Seats WHERE ( _row!= ( SELECT _row FROM Reservations WHERE start_name = 'Vejle' AND end_name = 'Fredericia' AND departure 10am $TODAY AND wagon_id = Connectionswagon_id ) OR letter!= ( SELECT letter FROM Reservations WHERE start_name = 'Vejle' AND end_name = 'Fredericia' AND departure = 10am $TODAY AND wagon_id = Connectionswagon_id ) ) Tidsbegrænsningerne er pseudosyntaks i det ovenstående og de efterfølgende, da jeg ikke lige ved hvordan MySQL sammenligner TIMESTAMP typer 2) Find all ways together with their price to reach Aalborg from Frederikshavn today with at most one stop in between SELECT Departstart_name AS _FROM,Arrivestart_name AS _STOP,Arriveend_name AS _TO FROM Connections AS Depart, Connections AS Arrive WHERE Departstart_name = 'Aalborg' AND Departend_name = Arrivestart_name AND Arriveend_name = 'Frederikshavn' AND Departdeparture = $TODAY AND Arrive = $TODAY AND Departdeparture < Arrive AND Departwagon_id = Arrivewagon_id p 5 7

3) When should I leave Aarhus the latest if I want to be in Randers before 2PM today with at most one stop? SELECT max(adeparture) FROM Connection AS _FROM, Connection AS _TO WHERE _FROMstart = "Aarhus" AND _FROMend = _TOstart AND _TOend = "Randers" AND _TO < 2pm $TODAY 4) Find 2 neighbouring seats (if possible) all the way along the following route: Aarhus Vejle Kolding anytime today provided the waiting time in Vejle is less than 1 hour SELECT * FROM Connections as A, Connections AS B WHERE Astart = "Århus" AND Aslut = Bstart = "Vejle" AND Bslut = "Kolding" AND (Bdeparture - A) < 1 hour - Nummer 4 her kunne jeg simpelthen ikke få til at lykkes Men det jeg gerne ville var, at finde alle sæderne fra i alle vognene fra Århus til Vejle Og dernæst joine med relationen NextToSeat for at få de sæder som er naboer dertil Dernæst ville jeg finde ud af hvilke, hvis nogen, der var optagede, og vælge dem fra Nye Queries 1) Give the total number of tickets sold for each destination reachable from Vejle during the next 7 days Sort them in decreasing order of price and include only destinations that are not fully booked SELECT Reservationsstart_Name,COUNT(*) AS n FROM Connections INNER JOIN Reservations USING (wagon_id, departure,, start_name, end_name) WHERE Reservationsstart_Name = 'Vejle' AND n < 4 GROUP BY start_name p 6 7

2) Give a list of stations with their full names, their total number of s, and total number of departures during next week Order them in lexicographical order SELECT DISTINCT start_name AS station, (SELECT COUNT( * ) AS number_of_departures FROM `Connections` WHERE start_name = station) AS starts_from, (SELECT COUNT( * ) AS number_of_s FROM `Connections` WHERE end_name = station) AS ends_at FROM Connections ORDER BY station p 7 7