## Objekte im Schema HOTEL

Nach dem Laden der Demo-Daten in die Demo-Datenbank befinden sich die Tabellen CITY, CUSTOMER, HOTEL, ROOM, RESERVATION, EMPLOYEE und weitere Datenbankobjekte im Schema HOTEL. Eigentümer des Schemas HOTEL und seiner Objekte ist der Benutzer MONA. Die Tabellen sind mit Demo-Daten gefüllt.

### Tabellen

#### CITY (Ortstabelle)

Jede Tabellenzeile enthält folgende Ortsinformationen: Postleitzahl, Name des Ortes, Abkürzung des Staatsnamens, in dem sich der Ort befindet.

CREATE TABLE city
(zip CHAR(5) PRIMARY KEY CONSTRAINT zip_cons CHECK
SUBSTR(zip,1,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,2,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,3,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,4,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,5,1) BETWEEN '0' AND '9',
name CHAR(30) NOT NULL,
state CHAR(2) NOT NULL)

Die Spalte zip ist die Primärschlüsselspalte.

Durch die Angabe des Constraints zip_cons wird gewährleistet, dass nur Zeichen zwischen 0 und 9 für die Angabe der Postleitzahl verwendet werden können.

In die Spalten Name des Ortes name und Abkürzung des Staatsnamens state dürfen keine NULL-Werte eingetragen werden.

#### CUSTOMER (Kundentabelle)

Jede Tabellenzeile enthält folgende Kundeninformationen: eine Nummer zur eindeutigen Identifizierung des Kunden, die Anrede zur Verwendung für Anschreiben, den Kundenvor- und Nachnamen, die Kundenadresse bestehend aus Postleitzahl, Straße und Hausnummer.

CREATE TABLE customer
(cno FIXED(4) PRIMARY KEY CONSTRAINT cno_cons CHECK cno > 0,
title CHAR(7) CONSTRAINT title_cons CHECK title IN ('Mr', 'Mrs', 'Company'),
firstname CHAR(20),
name CHAR(40) NOT NULL,
zip CHAR(5) CONSTRAINT zip_cons CHECK
SUBSTR(zip,1,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,2,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,3,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,4,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,5,1) BETWEEN '0' AND '9',
address CHAR(40) NOT NULL,
FOREIGN KEY customer_zip_in_city (zip) REFERENCES city ON DELETE RESTRICT)

Die Spalte cno ist die Primärschlüsselspalte.

Durch die Angabe des Constraint cno_cons wird gewährleistet, dass die Kundennummer größer als Null gewählt wird.

Durch die Angabe des Constraint title_cons wird gewährleistet, dass als Titel Mr, Mrs oder Company gewählt wird.

In die Spalten name und address dürfen keine NULL-Werte eingetragen werden.

Durch die Angabe des Constraint zip_cons wird gewährleistet, dass nur Zeichen zwischen 0 und 9 für die Angabe der Postleitzahlen verwendet werden können.

Die Spalte zip ist Fremdschlüsselspalte. Die Schlüsselwörter ON DELETE RESTRICT bewirken, dass Sie beim Löschen von Zeilen in der Ortstabelle CITY eine Warnung erhalten, wenn in der Tabelle CUSTOMER eine Zeile existiert, die mit der Postleitzahl der zu löschenden Zeile übereinstimmt.

#### HOTEL (Hoteltabelle)

Jede Tabellenzeile enthält folgende Hotelinformationen: eine Nummer zur eindeutigen Identifizierung des Hotels, den Hotelnamen und die Hoteladresse (Postleitzahl, Straße und Hausnummer) sowie Informationen zum Hotel.

CREATE TABLE hotel
(hno FIXED(4) PRIMARY KEY CONSTRAINT hno_cons CHECK hno > 0,
name CHAR(50) NOT NULL,
zip CHAR(5) CONSTRAINT zip_cons CHECK
SUBSTR(zip,1,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,2,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,3,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,4,1) BETWEEN '0' AND '9' AND
SUBSTR(zip,5,1) BETWEEN '0' AND '9',
address CHAR(40) NOT NULL,
info LONG,
FOREIGN KEY hotel_zip_in_city (zip) REFERENCES city ON DELETE RESTRICT)

Die Spalte hno ist die Primärschlüsselspalte.

Durch die Angabe des Constraint hno_cons wird gewährleistet, dass die Hotelnummer größer als Null gewählt wird.

In die Spalten name und address dürfen keine NULL-Werte eingetragen werden.

Durch die Angabe des Constraint zip_cons wird gewährleistet, dass nur Zeichen zwischen 0 und 9 für die Angabe der Postleitzahlen verwendet werden können.

Die Spalte zip ist Fremdschlüsselspalte. Die Schlüsselwörter ON DELETE RESTRICT bewirken, dass Sie beim Löschen von Zeilen in der Ortstabelle CITY eine Warnung erhalten, wenn in der Tabelle HOTEL eine Zeile existiert, die mit der Postleitzahl der zu löschenden Zeile übereinstimmt. In diesem Fall wird die Zeile nicht gelöscht.

#### ROOM (Zimmertabelle)

Jede Tabellenzeile enthält folgende Zimmerinformationen: eine Nummer zur eindeutigen Identifizierung des Hotels, in dem sich das Zimmer befindet, eine Angabe zum Zimmertyp (Einzel, Doppel, Suite), die Anzahl der freien Zimmer und den Preis pro Zimmer.

CREATE TABLE room
(hno FIXED(4) CONSTRAINT hno_cons CHECK hno > 0,
type CHAR(6) CONSTRAINT type_cons CHECK type IN ('single','double','suite'), PRIMARY KEY (hno,type),
free FIXED(3,0) CONSTRAINT free_cons CHECK free >= 0,
price FIXED(6,2) CONSTRAINT price_cons CHECK price BETWEEN 0.00 AND 5000.00,
FOREIGN KEY room_hno_in_hotel (hno) REFERENCES hotel ON DELETE CASCADE)

Die Spalten hno und type bilden den Primärschlüssel.

Durch die Angabe des Constraint hno_cons wird gewährleistet, dass die Hotelnummer größer als Null gewählt wird.

Durch die Angabe des Constraint type_cons wird gewährleistet, dass als Zimmertyp single, double oder suite gewählt wird.

Durch die Angabe des Constraint free_cons wird gewährleistet, dass die Anzahl der freien Zimmer größer als Null gewählt wird.

Durch die Angabe des Constraint price_cons wird gewährleistet, dass der Zimmerpreis mit einem Wert zwischen 0 und 5000 gewählt wird.

Die Spalte hno ist Fremdschlüsselspalte. Die Schlüsselwörter ON DELETE CASCADE bewirken, dass beim Löschen von Zeilen in der Hoteltabelle HOTEL die Zeilen der Tabelle ROOM gelöscht werden, die eine mit der zu löschenden Zeile übereinstimmende Hotelnummer aufweisen.

#### RESERVATION (Buchungstabelle)

Jede Tabellenzeile enthält folgende Buchungsinformationen: eine Nummer zur eindeutigen Identifizierung der Buchung, eine Nummer zur eindeutigen Identifizierung des Kunden, eine Nummer zur eindeutigen Identifizierung des Hotels, eine Angabe zum Zimmertyp (Einzel, Doppel, Suite), das Datum der Ankunft und der Abreise.

CREATE TABLE reservation
(rno FIXED(4) PRIMARY KEY CONSTRAINT rno_cons CHECK rno > 0,
cno FIXED(4) CONSTRAINT cno_cons CHECK cno > 0,
hno FIXED(4) CONSTRAINT hno_cons CHECK hno > 0,
type CHAR(6) CONSTRAINT type_cons CHECK type IN ('single','double','suite'),
arrival DATE NOT NULL,
departure DATE NOT NULL, CONSTRAINT staying CHECK departure > arrival,
FOREIGN KEY reservation_cno_in_customer (cno) REFERENCES customer ON DELETE CASCADE
FOREIGN KEY reservation_info_in_room (hno,type) REFERENCES room ON DELETE CASCADE)

Die Spalte rno ist die Primärschlüsselspalte.

Durch die Angabe des Constraint rno_cons wird gewährleistet, dass die Buchungsnummer größer als Null gewählt wird.

Durch die Angabe des Constraint cno_cons wird gewährleistet, dass die Kundennummer größer als Null gewählt wird.

Durch die Angabe des Constraint hno_cons wird gewährleistet, dass die Hotelnummer größer als Null gewählt wird.

Durch die Angabe des Constraint type_cons wird gewährleistet, dass als Zimmertyp single, double oder suite gewählt wird.

In die Spalten arrival und departure dürfen keine NULL-Werte eingetragen werden.

Durch die Angabe des Constraint staying wird gewährleistet, dass als Abfahrtsdatum ein Datum nach dem Ankunftsdatum gewählt wird.

Die Spalte cno ist Fremdschlüsselspalte. Die Schlüsselwörter ON DELETE CASCADE bewirken, dass beim Löschen von Zeilen in der Kundentabelle CUSTOMER die Zeilen der Tabelle RESERVATION gelöscht werden, die eine mit der zu löschenden Zeile übereinstimmende Kundennummer aufweisen.

Die Spalten hno und type bilden einen Fremdschlüssel. Die Schlüsselwörter ON DELETE CASCADE bewirken, dass beim Löschen von Zeilen in der Zimmertabelle ROOM die Zeilen der Tabelle RESERVATION gelöscht werden, die mit der zu löschenden Zeile in Hotelnummer und Zimmertyp übereinstimmen.

#### EMPLOYEE (Angestelltentabelle)

Jede Tabellenzeile enthält folgende Angestellteninformationen: eine Nummer zur eindeutigen Identifizierung des Hotels, eine Nummer zur eindeutigen Identifizierung des Angestellten, die Anrede zur Verwendung für Anschreiben, den Angestelltenvor- und Nachnamen, eine Nummer zur Zuordnung des Vorgesetzten.

CREATE TABLE employee
(hno FIXED(4),
eno FIXED(4), PRIMARY KEY (hno,eno),
title CHAR(7) CONSTRAINT title_cons CHECK title IN ('Mr','Mrs'),
firstname CHAR(20),
name CHAR(20) NOT NULL,
manager_eno FIXED(4),
FOREIGN KEY employee_hno_in_hotel (hno) REFERENCES hotel ON DELETE CASCADE)

Die Spalten hno und eno bilden den Primärschlüssel.

Durch die Angabe des Constraint title_cons wird gewährleistet, dass als Titel Mr oder Mrs gewählt wird.

In die Spalten name dürfen keine NULL-Werte eingetragen werden.

Die Spalte hno ist Fremdschlüsselspalte. Die Schlüsselwörter ON DELETE CASCADE bewirken, dass beim Löschen von Zeilen in der Hoteltabelle HOTEL die Zeilen der Tabelle EMPLOYEE gelöscht werden, die eine mit der zu löschenden Zeile übereinstimmende Hotelnummer aufweisen.

### View-Tabellen

#### CUSTOMER_ADDR (Kundenadressen)

Jede Zeile der View-Tabelle enthält folgende Kundeninformationen: eine Nummer zur eindeutigen Identifizierung des Kunden, die Anrede zur Verwendung für Anschreiben, den Kundennachnamen, die Kundenadresse bestehend aus Postleitzahl, Name des Ortes, Abkürzung des Staatsnamens, Straße und Hausnummer.

CREATE VIEW customer_addr (cno, title, name, zip, city, state, address)
AS SELECT customer.cno, customer.title, customer.name, customer.zip,
city.name, city.state, customer.address
FROM customer, city
WHERE customer.zip = city.zip WITH CHECK OPTION

Die erforderlichen Informationen werden den Tabellen customer und city entnommen.

Die Schlüsselwörter WITH CHECK OPTION bewirken, dass durch eine INSERT- oder UPDATE-Anweisung in der View-Tabelle keine Zeilen erzeugt werden können, die anschließend nicht mehr über die View-Tabelle selektierbar sind, d.h. resultierende Zeilen müssen die Suchbedingung der View-Tabelle erfüllen.

#### HOTEL_ADDR (Hoteladressen)

Jede Zeile der View-Tabelle enthält folgende Hotelinformationen: eine Nummer zur eindeutigen Identifizierung des Hotels, den Hotelnamen, die Hoteladresse bestehend aus Postleitzahl, Name des Ortes, Abkürzung des Staatsnamens, Straße und Hausnummer.

CREATE VIEW hotel_addr (hno, name, zip, city, state, address)
AS SELECT hotel.hno, hotel.name, hotel.zip,
city.name, city.state, hotel.address
FROM hotel, city
WHERE hotel.zip = city.zip WITH CHECK OPTION

Die erforderlichen Informationen werden den Tabellen hotel und city entnommen.

Die Schlüsselwörter WITH CHECK OPTION bewirken, dass durch eine INSERT- oder UPDATE-Anweisung in der View-Tabelle keine Zeilen erzeugt werden können, die anschließend nicht mehr über die View-Tabelle selektierbar sind, d.h. resultierende Zeilen müssen die Suchbedingung der View-Tabelle erfüllen.

#### CUSTOM_HOTEL (Hotelreservierungen)

Jede Zeile der View-Tabelle enthält folgende Informationen: den Kundennachnamen, Wohnort des Kunden, Name des Hotels, Ort des Hotels.

CREATE VIEW custom_hotel (customname, customcity, hotelname, hotelsity)
AS SELECT customer_addr.name, customer_addr.city,
hotel_addr.name, hotel_addr.city
FROM customer_addr, hotel_addr, reservation
WHERE customer_addr.cno = reservation.cno
AND hotel_addr.hno = reservation.hno

Die erforderlichen Informationen werden den View-Tabellen customer_addr und hotel_addr der Tabelle reservation entnommen.

Es werden die Kunden angezeigt, die in den Hotels gebucht haben.

### Indizes

#### Einspaltiger Index

CREATE INDEX city_state ON city (state)

Auf die Spalte state der Tabelle city wird der Sekundärindex city_state gelegt.

#### Mehrspaltiger Index

CREATE INDEX full_name_index ON customer (name, firstname)

Auf die Spalten name und firstname der Tabelle customer wird der Sekundärindex full_name_index gelegt.