a u kurac
This commit is contained in:
@@ -1,149 +0,0 @@
|
||||
-- =============================================================================
|
||||
-- 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))
|
||||
);
|
||||
186
sql/schema.sql
186
sql/schema.sql
@@ -1,186 +0,0 @@
|
||||
CREATE DATABASE IF NOT EXISTS ewc2025
|
||||
CHARACTER SET utf8mb4
|
||||
COLLATE utf8mb4_unicode_ci;
|
||||
|
||||
USE ewc2025;
|
||||
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
-- LOOKUP TABLES
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
CREATE TABLE game (
|
||||
game_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
game_type VARCHAR(50) NOT NULL,
|
||||
platform VARCHAR(50) NOT NULL,
|
||||
PRIMARY KEY (game_id),
|
||||
UNIQUE KEY uq_game_name (name)
|
||||
);
|
||||
|
||||
CREATE TABLE country (
|
||||
country_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
region VARCHAR(50) NOT NULL,
|
||||
gold_medals TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
silver_medals TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
bronze_medals TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
total_medals TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
total_players SMALLINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
top_game VARCHAR(100),
|
||||
PRIMARY KEY (country_id),
|
||||
UNIQUE KEY uq_country_name (name)
|
||||
);
|
||||
|
||||
CREATE TABLE point_system (
|
||||
point_system_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
placement TINYINT UNSIGNED NOT NULL,
|
||||
points SMALLINT UNSIGNED NOT NULL,
|
||||
system_type ENUM('Standard', 'Co-Placement', 'Extended', 'Special') NOT NULL,
|
||||
description VARCHAR(50),
|
||||
PRIMARY KEY (point_system_id),
|
||||
UNIQUE KEY uq_placement_type (placement, system_type)
|
||||
);
|
||||
|
||||
CREATE TABLE prize_pool_category (
|
||||
prize_category_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
category VARCHAR(100) NOT NULL,
|
||||
amount_usd INT UNSIGNED NOT NULL,
|
||||
percentage DECIMAL(5,2) NOT NULL,
|
||||
description VARCHAR(200),
|
||||
num_recipients INT UNSIGNED,
|
||||
PRIMARY KEY (prize_category_id),
|
||||
UNIQUE KEY uq_category (category)
|
||||
);
|
||||
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
-- CORE ENTITIES
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
CREATE TABLE organization (
|
||||
organization_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
name VARCHAR(150) NOT NULL,
|
||||
region VARCHAR(50),
|
||||
country_id INT UNSIGNED,
|
||||
club_partner_status ENUM('Current', 'New', 'None') NOT NULL DEFAULT 'None',
|
||||
top_8_2024 BOOLEAN,
|
||||
founded_year SMALLINT UNSIGNED,
|
||||
hq_location VARCHAR(150),
|
||||
ceo VARCHAR(150),
|
||||
social_media_followers_m DECIMAL(6,2),
|
||||
PRIMARY KEY (organization_id),
|
||||
UNIQUE KEY uq_org_name (name),
|
||||
CONSTRAINT fk_org_country FOREIGN KEY (country_id) REFERENCES country (country_id)
|
||||
);
|
||||
|
||||
CREATE TABLE tournament (
|
||||
tournament_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
game_id INT UNSIGNED NOT NULL,
|
||||
event_name VARCHAR(200) NOT NULL,
|
||||
start_date DATE NOT NULL,
|
||||
end_date DATE NOT NULL,
|
||||
prize_pool_usd INT UNSIGNED NOT NULL,
|
||||
num_participants TINYINT UNSIGNED NOT NULL,
|
||||
winner VARCHAR(200),
|
||||
runner_up VARCHAR(200),
|
||||
club_championship_points BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
gender ENUM('Open', 'Men', 'Women') NOT NULL DEFAULT 'Open',
|
||||
PRIMARY KEY (tournament_id),
|
||||
CONSTRAINT fk_tournament_game FOREIGN KEY (game_id) REFERENCES game (game_id)
|
||||
);
|
||||
|
||||
CREATE TABLE schedule (
|
||||
schedule_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
tournament_id INT UNSIGNED NOT NULL,
|
||||
week_number TINYINT UNSIGNED NOT NULL,
|
||||
venue VARCHAR(200) NOT NULL,
|
||||
time_zone VARCHAR(10) NOT NULL,
|
||||
duration_days TINYINT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (schedule_id),
|
||||
UNIQUE KEY uq_schedule_tournament (tournament_id),
|
||||
CONSTRAINT fk_schedule_tournament FOREIGN KEY (tournament_id) REFERENCES tournament (tournament_id)
|
||||
);
|
||||
|
||||
CREATE TABLE player (
|
||||
player_id VARCHAR(20) NOT NULL,
|
||||
player_name VARCHAR(100) NOT NULL,
|
||||
country_id INT UNSIGNED,
|
||||
region VARCHAR(50),
|
||||
organization_id INT UNSIGNED,
|
||||
game_id INT UNSIGNED,
|
||||
role VARCHAR(50),
|
||||
age TINYINT UNSIGNED,
|
||||
experience_years TINYINT UNSIGNED,
|
||||
previous_team VARCHAR(150),
|
||||
tournament_place TINYINT UNSIGNED,
|
||||
prize_earned_usd INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
social_media_followers_k INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (player_id),
|
||||
CONSTRAINT fk_player_country FOREIGN KEY (country_id) REFERENCES country (country_id),
|
||||
CONSTRAINT fk_player_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id),
|
||||
CONSTRAINT fk_player_game FOREIGN KEY (game_id) REFERENCES game (game_id)
|
||||
);
|
||||
|
||||
CREATE TABLE medalist (
|
||||
medalist_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
tournament_id INT UNSIGNED NOT NULL,
|
||||
medal ENUM('Gold', 'Silver', 'Bronze') NOT NULL,
|
||||
organization_id INT UNSIGNED,
|
||||
player_name VARCHAR(100) NOT NULL,
|
||||
country_id INT UNSIGNED,
|
||||
role VARCHAR(50),
|
||||
PRIMARY KEY (medalist_id),
|
||||
CONSTRAINT fk_medalist_tournament FOREIGN KEY (tournament_id) REFERENCES tournament (tournament_id),
|
||||
CONSTRAINT fk_medalist_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id),
|
||||
CONSTRAINT fk_medalist_country FOREIGN KEY (country_id) REFERENCES country (country_id)
|
||||
);
|
||||
|
||||
-- team_1 / team_2 / winner are VARCHAR because individual-game matches
|
||||
-- (Chess, StarCraft II, fighting games) use player names instead of org names
|
||||
CREATE TABLE match_result (
|
||||
match_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
tournament_id INT UNSIGNED NOT NULL,
|
||||
match_type VARCHAR(50) NOT NULL,
|
||||
team_1 VARCHAR(200) NOT NULL,
|
||||
team_2 VARCHAR(200) NOT NULL,
|
||||
winner VARCHAR(200),
|
||||
score VARCHAR(20),
|
||||
map VARCHAR(100),
|
||||
duration_minutes SMALLINT UNSIGNED,
|
||||
mvp VARCHAR(100),
|
||||
PRIMARY KEY (match_id),
|
||||
CONSTRAINT fk_match_tournament FOREIGN KEY (tournament_id) REFERENCES tournament (tournament_id)
|
||||
);
|
||||
|
||||
CREATE TABLE club_championship_standing (
|
||||
standing_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
|
||||
organization_id INT UNSIGNED NOT NULL,
|
||||
`rank` TINYINT UNSIGNED NOT NULL,
|
||||
total_points SMALLINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
prize_money_usd INT UNSIGNED NOT NULL DEFAULT 0,
|
||||
tournament_wins TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
top_8_finishes TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
||||
eligible_to_win BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
PRIMARY KEY (standing_id),
|
||||
UNIQUE KEY uq_standing_org (organization_id),
|
||||
CONSTRAINT fk_standing_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id)
|
||||
);
|
||||
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
-- JUNCTION TABLES
|
||||
-- ─────────────────────────────────────────────────────────────────────────────
|
||||
|
||||
CREATE TABLE organization_game_competing (
|
||||
organization_id INT UNSIGNED NOT NULL,
|
||||
game_id INT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (organization_id, game_id),
|
||||
CONSTRAINT fk_ogc_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id),
|
||||
CONSTRAINT fk_ogc_game FOREIGN KEY (game_id) REFERENCES game (game_id)
|
||||
);
|
||||
|
||||
CREATE TABLE organization_game_won (
|
||||
organization_id INT UNSIGNED NOT NULL,
|
||||
game_id INT UNSIGNED NOT NULL,
|
||||
PRIMARY KEY (organization_id, game_id),
|
||||
CONSTRAINT fk_ogw_org FOREIGN KEY (organization_id) REFERENCES organization (organization_id),
|
||||
CONSTRAINT fk_ogw_game FOREIGN KEY (game_id) REFERENCES game (game_id)
|
||||
);
|
||||
Reference in New Issue
Block a user