Files
IPZ_1/sql/datamart_schema.sql
2026-05-17 20:32:58 +02:00

134 lines
6.3 KiB
SQL

-- =============================================================================
-- HOTEL RESERVATIONS — DATA MART (STAR SCHEMA)
-- Target: Oracle (university lab schema)
-- Based on A.24 Revenue Data Mart — Dimensional Modelling by Example
-- =============================================================================
-- -----------------------------------------------------------------------------
-- DIMENSION TABLES
-- -----------------------------------------------------------------------------
-- YYYYMMDD integer key — cheap date range predicates, no JOIN to calendar needed
CREATE TABLE DIM_DATE (
date_key NUMBER(8,0) NOT NULL,
full_date DATE NOT NULL,
year NUMBER(4,0) NOT NULL,
quarter NUMBER(1,0) NOT NULL,
month NUMBER(2,0) NOT NULL,
month_name VARCHAR2(10) NOT NULL,
week_number NUMBER(2,0) NOT NULL,
day_of_month NUMBER(2,0) NOT NULL,
day_name VARCHAR2(10) NOT NULL,
is_weekend NUMBER(1,0) NOT NULL,
is_business_day NUMBER(1,0) NOT NULL,
season VARCHAR2(10) NOT NULL, -- Peak / High / Low / Off
CONSTRAINT pk_dim_date PRIMARY KEY (date_key),
CONSTRAINT ck_dim_date_wknd CHECK (is_weekend IN (0,1)),
CONSTRAINT ck_dim_date_bday CHECK (is_business_day IN (0,1))
);
CREATE TABLE DIM_COUNTRY (
country_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
country_id NUMBER(10,0) NOT NULL,
code CHAR(2) NOT NULL,
name VARCHAR2(100) NOT NULL,
currency VARCHAR2(10) NOT NULL,
CONSTRAINT pk_dim_country PRIMARY KEY (country_key),
CONSTRAINT uq_dim_cntry_id UNIQUE (country_id)
);
CREATE TABLE DIM_STAR_RATING (
star_rating_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
star_rating_id NUMBER(10,0) NOT NULL,
code NUMBER(1,0) NOT NULL,
description VARCHAR2(20) NOT NULL,
CONSTRAINT pk_dim_star PRIMARY KEY (star_rating_key),
CONSTRAINT uq_dim_star_id UNIQUE (star_rating_id)
);
CREATE TABLE DIM_HOTEL_CHAIN (
hotel_chain_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
hotel_chain_id NUMBER(10,0) NOT NULL,
code VARCHAR2(10) NOT NULL,
name VARCHAR2(100) NOT NULL,
CONSTRAINT pk_dim_chain PRIMARY KEY (hotel_chain_key),
CONSTRAINT uq_dim_chain_id UNIQUE (hotel_chain_id)
);
CREATE TABLE DIM_HOTEL (
hotel_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
hotel_id NUMBER(10,0) NOT NULL,
hotel_chain_key NUMBER(10,0),
country_key NUMBER(10,0) NOT NULL,
star_rating_key NUMBER(10,0) NOT NULL,
code VARCHAR2(20) NOT NULL,
name VARCHAR2(150) NOT NULL,
city VARCHAR2(100) NOT NULL,
CONSTRAINT pk_dim_hotel PRIMARY KEY (hotel_key),
CONSTRAINT uq_dim_hotel_id UNIQUE (hotel_id),
CONSTRAINT fk_dh_chain FOREIGN KEY (hotel_chain_key) REFERENCES DIM_HOTEL_CHAIN (hotel_chain_key),
CONSTRAINT fk_dh_country FOREIGN KEY (country_key) REFERENCES DIM_COUNTRY (country_key),
CONSTRAINT fk_dh_star FOREIGN KEY (star_rating_key) REFERENCES DIM_STAR_RATING (star_rating_key)
);
CREATE TABLE DIM_ROOM (
room_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
room_id NUMBER(10,0) NOT NULL,
hotel_key NUMBER(10,0) NOT NULL,
room_number VARCHAR2(10) NOT NULL,
floor NUMBER(3,0) NOT NULL,
room_type_code VARCHAR2(20) NOT NULL,
room_type_desc VARCHAR2(100) NOT NULL,
smoking_yn NUMBER(1,0) NOT NULL,
standard_rate NUMBER(10,2) NOT NULL,
CONSTRAINT pk_dim_room PRIMARY KEY (room_key),
CONSTRAINT uq_dim_room_id UNIQUE (room_id),
CONSTRAINT fk_dr_hotel FOREIGN KEY (hotel_key) REFERENCES DIM_HOTEL (hotel_key),
CONSTRAINT ck_dim_room_smk CHECK (smoking_yn IN (0,1))
);
CREATE TABLE DIM_GUEST (
guest_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
guest_id NUMBER(10,0) NOT NULL,
country_key NUMBER(10,0),
name VARCHAR2(150) NOT NULL,
city VARCHAR2(100),
CONSTRAINT pk_dim_guest PRIMARY KEY (guest_key),
CONSTRAINT uq_dim_guest_id UNIQUE (guest_id),
CONSTRAINT fk_dg_country FOREIGN KEY (country_key) REFERENCES DIM_COUNTRY (country_key)
);
-- -----------------------------------------------------------------------------
-- FACT TABLE
-- -----------------------------------------------------------------------------
-- Grain: one row per room_booking
-- Revenue measures: nightly_rate, total_amount, nights_stayed
CREATE TABLE FACT_ROOM_BOOKING (
fact_id NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
-- foreign keys
hotel_key NUMBER(10,0) NOT NULL,
hotel_chain_key NUMBER(10,0),
room_key NUMBER(10,0) NOT NULL,
guest_key NUMBER(10,0) NOT NULL,
country_key NUMBER(10,0),
star_rating_key NUMBER(10,0) NOT NULL,
checkin_date_key NUMBER(8,0) NOT NULL,
checkout_date_key NUMBER(8,0) NOT NULL,
-- degenerate dimensions
booking_status VARCHAR2(20) NOT NULL,
-- measures
nights_stayed NUMBER(4,0) NOT NULL,
nightly_rate NUMBER(10,2) NOT NULL,
total_amount NUMBER(12,2) NOT NULL,
CONSTRAINT pk_fact_rb PRIMARY KEY (fact_id),
CONSTRAINT fk_frb_hotel FOREIGN KEY (hotel_key) REFERENCES DIM_HOTEL (hotel_key),
CONSTRAINT fk_frb_chain FOREIGN KEY (hotel_chain_key) REFERENCES DIM_HOTEL_CHAIN (hotel_chain_key),
CONSTRAINT fk_frb_room FOREIGN KEY (room_key) REFERENCES DIM_ROOM (room_key),
CONSTRAINT fk_frb_guest FOREIGN KEY (guest_key) REFERENCES DIM_GUEST (guest_key),
CONSTRAINT fk_frb_country FOREIGN KEY (country_key) REFERENCES DIM_COUNTRY (country_key),
CONSTRAINT fk_frb_star FOREIGN KEY (star_rating_key) REFERENCES DIM_STAR_RATING (star_rating_key),
CONSTRAINT fk_frb_checkin FOREIGN KEY (checkin_date_key) REFERENCES DIM_DATE (date_key),
CONSTRAINT fk_frb_checkout FOREIGN KEY (checkout_date_key) REFERENCES DIM_DATE (date_key)
);