Datamart schema
This commit is contained in:
149
sql/datamart_schema.sql
Normal file
149
sql/datamart_schema.sql
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
-- =============================================================================
|
||||||
|
-- EWC 2025 — DATA MART STAR SCHEMA
|
||||||
|
-- Target: Oracle (university lab schema)
|
||||||
|
-- =============================================================================
|
||||||
|
--
|
||||||
|
-- 3 Fact tables x 5 Dimension tables
|
||||||
|
--
|
||||||
|
-- FACT_TOURNAMENT — one row per tournament (prize, participants, duration)
|
||||||
|
-- FACT_MEDAL_AWARD — one row per player-medal (257 rows)
|
||||||
|
-- FACT_CLUB_STANDING — snapshot of final Club Championship standings (24 rows)
|
||||||
|
--
|
||||||
|
-- DIM_DATE
|
||||||
|
-- |
|
||||||
|
-- DIM_ORGANIZATION — FACT_TOURNAMENT — DIM_GAME
|
||||||
|
--
|
||||||
|
-- DIM_COUNTRY ─┐
|
||||||
|
-- DIM_ORG ─┤── FACT_MEDAL_AWARD ── DIM_GAME
|
||||||
|
-- DIM_MEDAL ─┘ │
|
||||||
|
-- DIM_DATE
|
||||||
|
--
|
||||||
|
-- DIM_ORGANIZATION ── FACT_CLUB_STANDING
|
||||||
|
--
|
||||||
|
-- =============================================================================
|
||||||
|
|
||||||
|
-- -----------------------------------------------------------------------------
|
||||||
|
-- DIMENSION TABLES
|
||||||
|
-- -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- date_key is YYYYMMDD integer — avoids JOIN to a calendar table for simple
|
||||||
|
-- filters and makes date range predicates cheap.
|
||||||
|
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,
|
||||||
|
CONSTRAINT pk_dim_date PRIMARY KEY (date_key)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE DIM_GAME (
|
||||||
|
game_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
|
||||||
|
game_id NUMBER(10,0) NOT NULL,
|
||||||
|
name VARCHAR2(100) NOT NULL,
|
||||||
|
game_type VARCHAR2(50) NOT NULL,
|
||||||
|
platform VARCHAR2(50) NOT NULL,
|
||||||
|
CONSTRAINT pk_dim_game PRIMARY KEY (game_key),
|
||||||
|
CONSTRAINT uq_dim_game_id UNIQUE (game_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE DIM_COUNTRY (
|
||||||
|
country_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
|
||||||
|
country_id NUMBER(10,0) NOT NULL,
|
||||||
|
name VARCHAR2(100) NOT NULL,
|
||||||
|
region VARCHAR2(50) NOT NULL,
|
||||||
|
CONSTRAINT pk_dim_country PRIMARY KEY (country_key),
|
||||||
|
CONSTRAINT uq_dim_cntry_id UNIQUE (country_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE DIM_ORGANIZATION (
|
||||||
|
org_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
|
||||||
|
org_id NUMBER(10,0) NOT NULL,
|
||||||
|
name VARCHAR2(150) NOT NULL,
|
||||||
|
region VARCHAR2(50),
|
||||||
|
country VARCHAR2(100),
|
||||||
|
club_partner_status VARCHAR2(10),
|
||||||
|
founded_year NUMBER(4,0),
|
||||||
|
social_media_followers_m NUMBER(6,2),
|
||||||
|
CONSTRAINT pk_dim_org PRIMARY KEY (org_key),
|
||||||
|
CONSTRAINT uq_dim_org_id UNIQUE (org_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE DIM_MEDAL (
|
||||||
|
medal_key NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
|
||||||
|
medal_type VARCHAR2(10) NOT NULL, -- Gold / Silver / Bronze
|
||||||
|
medal_rank NUMBER(1,0) NOT NULL, -- 1 / 2 / 3
|
||||||
|
CONSTRAINT pk_dim_medal PRIMARY KEY (medal_key),
|
||||||
|
CONSTRAINT uq_dim_medal_tp UNIQUE (medal_type)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- -----------------------------------------------------------------------------
|
||||||
|
-- FACT TABLES
|
||||||
|
-- -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- Grain: one row per tournament
|
||||||
|
-- Supports: prize analysis by game type / platform / week / gender
|
||||||
|
CREATE TABLE FACT_TOURNAMENT (
|
||||||
|
fact_id NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
|
||||||
|
game_key NUMBER(10,0) NOT NULL,
|
||||||
|
start_date_key NUMBER(8,0) NOT NULL,
|
||||||
|
end_date_key NUMBER(8,0) NOT NULL,
|
||||||
|
winner_org_key NUMBER(10,0), -- NULL for individual-winner events
|
||||||
|
-- degenerate dimensions
|
||||||
|
event_name VARCHAR2(200) NOT NULL,
|
||||||
|
gender VARCHAR2(10) NOT NULL, -- Open / Men / Women
|
||||||
|
-- measures
|
||||||
|
prize_pool_usd NUMBER(12,0) NOT NULL,
|
||||||
|
num_participants NUMBER(5,0) NOT NULL,
|
||||||
|
duration_days NUMBER(3,0) NOT NULL,
|
||||||
|
has_club_points NUMBER(1,0) NOT NULL,
|
||||||
|
CONSTRAINT pk_fact_tourn PRIMARY KEY (fact_id),
|
||||||
|
CONSTRAINT fk_ft_game FOREIGN KEY (game_key) REFERENCES DIM_GAME (game_key),
|
||||||
|
CONSTRAINT fk_ft_sdate FOREIGN KEY (start_date_key) REFERENCES DIM_DATE (date_key),
|
||||||
|
CONSTRAINT fk_ft_edate FOREIGN KEY (end_date_key) REFERENCES DIM_DATE (date_key),
|
||||||
|
CONSTRAINT fk_ft_winner FOREIGN KEY (winner_org_key) REFERENCES DIM_ORGANIZATION (org_key),
|
||||||
|
CONSTRAINT ck_ft_pts CHECK (has_club_points IN (0, 1))
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Grain: one row per player-medal
|
||||||
|
-- Supports: medal count and medal points by country / region / game / org
|
||||||
|
CREATE TABLE FACT_MEDAL_AWARD (
|
||||||
|
fact_id NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
|
||||||
|
game_key NUMBER(10,0) NOT NULL,
|
||||||
|
medal_key NUMBER(10,0) NOT NULL,
|
||||||
|
country_key NUMBER(10,0),
|
||||||
|
org_key NUMBER(10,0),
|
||||||
|
date_key NUMBER(8,0), -- tournament start date
|
||||||
|
-- degenerate dimension
|
||||||
|
player_name VARCHAR2(100) NOT NULL,
|
||||||
|
-- measures
|
||||||
|
medal_count NUMBER(3,0) DEFAULT 1 NOT NULL,
|
||||||
|
medal_points NUMBER(3,0) NOT NULL, -- Gold=3, Silver=2, Bronze=1
|
||||||
|
CONSTRAINT pk_fact_medal PRIMARY KEY (fact_id),
|
||||||
|
CONSTRAINT fk_fm_game FOREIGN KEY (game_key) REFERENCES DIM_GAME (game_key),
|
||||||
|
CONSTRAINT fk_fm_medal FOREIGN KEY (medal_key) REFERENCES DIM_MEDAL (medal_key),
|
||||||
|
CONSTRAINT fk_fm_country FOREIGN KEY (country_key) REFERENCES DIM_COUNTRY (country_key),
|
||||||
|
CONSTRAINT fk_fm_org FOREIGN KEY (org_key) REFERENCES DIM_ORGANIZATION (org_key),
|
||||||
|
CONSTRAINT fk_fm_date FOREIGN KEY (date_key) REFERENCES DIM_DATE (date_key)
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Grain: one row per club (end-of-season snapshot)
|
||||||
|
-- Supports: club performance comparison by region / partner status / eligibility
|
||||||
|
CREATE TABLE FACT_CLUB_STANDING (
|
||||||
|
fact_id NUMBER(10,0) GENERATED ALWAYS AS IDENTITY,
|
||||||
|
org_key NUMBER(10,0) NOT NULL,
|
||||||
|
-- measures
|
||||||
|
final_rank NUMBER(3,0) NOT NULL,
|
||||||
|
total_points NUMBER(6,0) NOT NULL,
|
||||||
|
prize_money_usd NUMBER(12,0) NOT NULL,
|
||||||
|
tournament_wins NUMBER(3,0) NOT NULL,
|
||||||
|
top_8_finishes NUMBER(3,0) NOT NULL,
|
||||||
|
eligible_to_win NUMBER(1,0) NOT NULL,
|
||||||
|
CONSTRAINT pk_fact_club PRIMARY KEY (fact_id),
|
||||||
|
CONSTRAINT fk_fcs_org FOREIGN KEY (org_key) REFERENCES DIM_ORGANIZATION (org_key),
|
||||||
|
CONSTRAINT ck_fcs_elig CHECK (eligible_to_win IN (0, 1))
|
||||||
|
);
|
||||||
Reference in New Issue
Block a user