272 lines
13 KiB
SQL
272 lines
13 KiB
SQL
CREATE TABLE users (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(120) NOT NULL,
|
|
email VARCHAR(160) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
role ENUM('admin','delegate','public') NOT NULL DEFAULT 'public',
|
|
active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE tournaments (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(160) NOT NULL,
|
|
category ENUM('Masculino','Femenino','Mixto') NOT NULL,
|
|
age_subcategory VARCHAR(80),
|
|
format ENUM('Liga','Eliminacion directa','Doble eliminacion','Grupos + playoffs') NOT NULL,
|
|
status ENUM('draft','active','finished') NOT NULL DEFAULT 'draft',
|
|
starts_at DATE,
|
|
ends_at DATE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_tournaments_status (status),
|
|
INDEX idx_tournaments_category (category)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE teams (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
tournament_id BIGINT UNSIGNED NOT NULL,
|
|
name VARCHAR(160) NOT NULL,
|
|
logo_path VARCHAR(255),
|
|
coach_name VARCHAR(160),
|
|
delegate_user_id BIGINT UNSIGNED,
|
|
registration_token CHAR(32) NOT NULL UNIQUE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_teams_tournament FOREIGN KEY (tournament_id) REFERENCES tournaments(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_teams_delegate FOREIGN KEY (delegate_user_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
UNIQUE KEY uq_team_tournament_name (tournament_id, name),
|
|
INDEX idx_teams_tournament (tournament_id)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE players (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
team_id BIGINT UNSIGNED NOT NULL,
|
|
first_name VARCHAR(120) NOT NULL,
|
|
last_name VARCHAR(120) NOT NULL,
|
|
document_id VARCHAR(60) NOT NULL,
|
|
birth_date DATE,
|
|
jersey_number TINYINT UNSIGNED,
|
|
position ENUM('Armador','Opuesto','Central','Punta','Libero','Universal'),
|
|
photo_path VARCHAR(255),
|
|
active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_players_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,
|
|
UNIQUE KEY uq_player_document_team (team_id, document_id),
|
|
UNIQUE KEY uq_player_number_team (team_id, jersey_number),
|
|
INDEX idx_players_team (team_id)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE courts (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(120) NOT NULL,
|
|
address VARCHAR(220),
|
|
active BOOLEAN NOT NULL DEFAULT TRUE
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE referees (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(140) NOT NULL,
|
|
license VARCHAR(80),
|
|
phone VARCHAR(60),
|
|
active BOOLEAN NOT NULL DEFAULT TRUE
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE matches (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
tournament_id BIGINT UNSIGNED NOT NULL,
|
|
phase VARCHAR(80) NOT NULL DEFAULT 'regular',
|
|
scheduled_at DATETIME,
|
|
court_id BIGINT UNSIGNED,
|
|
home_team_id BIGINT UNSIGNED NOT NULL,
|
|
away_team_id BIGINT UNSIGNED NOT NULL,
|
|
status ENUM('scheduled','live','finished','cancelled') NOT NULL DEFAULT 'scheduled',
|
|
winner_team_id BIGINT UNSIGNED,
|
|
home_sets TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
away_sets TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_matches_tournament FOREIGN KEY (tournament_id) REFERENCES tournaments(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_matches_court FOREIGN KEY (court_id) REFERENCES courts(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_matches_home FOREIGN KEY (home_team_id) REFERENCES teams(id),
|
|
CONSTRAINT fk_matches_away FOREIGN KEY (away_team_id) REFERENCES teams(id),
|
|
CONSTRAINT fk_matches_winner FOREIGN KEY (winner_team_id) REFERENCES teams(id) ON DELETE SET NULL,
|
|
CONSTRAINT chk_different_teams CHECK (home_team_id <> away_team_id),
|
|
INDEX idx_matches_tournament_status (tournament_id, status),
|
|
INDEX idx_matches_schedule (scheduled_at)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE match_referees (
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
referee_id BIGINT UNSIGNED NOT NULL,
|
|
role VARCHAR(80) NOT NULL DEFAULT 'principal',
|
|
PRIMARY KEY (match_id, referee_id),
|
|
CONSTRAINT fk_match_referees_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_match_referees_referee FOREIGN KEY (referee_id) REFERENCES referees(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE match_sets (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
set_number TINYINT UNSIGNED NOT NULL,
|
|
home_points TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
away_points TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
winner_team_id BIGINT UNSIGNED,
|
|
side_state ENUM('normal','switched') NOT NULL DEFAULT 'normal',
|
|
CONSTRAINT fk_sets_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_sets_winner FOREIGN KEY (winner_team_id) REFERENCES teams(id) ON DELETE SET NULL,
|
|
UNIQUE KEY uq_set_match_number (match_id, set_number)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE match_events (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
set_number TINYINT UNSIGNED NOT NULL,
|
|
team_id BIGINT UNSIGNED,
|
|
player_id BIGINT UNSIGNED,
|
|
event_type ENUM('serve','point','error','ace','block','attack','rotation','substitution','timeout','libero','yellow_card','red_card','mvp','audit','signature') NOT NULL,
|
|
points_home TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
points_away TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
notes VARCHAR(255),
|
|
created_by BIGINT UNSIGNED,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_events_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_events_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_events_player FOREIGN KEY (player_id) REFERENCES players(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_events_user FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
|
|
INDEX idx_events_match_created (match_id, created_at),
|
|
INDEX idx_events_player_type (player_id, event_type)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE rotations (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
team_id BIGINT UNSIGNED NOT NULL,
|
|
set_number TINYINT UNSIGNED NOT NULL,
|
|
position_number TINYINT UNSIGNED NOT NULL,
|
|
player_id BIGINT UNSIGNED NOT NULL,
|
|
is_libero BOOLEAN NOT NULL DEFAULT FALSE,
|
|
CONSTRAINT fk_rotations_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_rotations_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_rotations_player FOREIGN KEY (player_id) REFERENCES players(id) ON DELETE CASCADE,
|
|
UNIQUE KEY uq_rotation_slot (match_id, team_id, set_number, position_number)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE match_liberos (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
team_id BIGINT UNSIGNED NOT NULL,
|
|
player_id BIGINT UNSIGNED NOT NULL,
|
|
set_number TINYINT UNSIGNED NOT NULL,
|
|
is_starting BOOLEAN NOT NULL DEFAULT FALSE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_liberos_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_liberos_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_liberos_player FOREIGN KEY (player_id) REFERENCES players(id) ON DELETE CASCADE,
|
|
UNIQUE KEY uq_match_team_set_libero (match_id, team_id, set_number, player_id)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE substitutions (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
team_id BIGINT UNSIGNED NOT NULL,
|
|
set_number TINYINT UNSIGNED NOT NULL,
|
|
player_out_id BIGINT UNSIGNED NOT NULL,
|
|
player_in_id BIGINT UNSIGNED NOT NULL,
|
|
reason VARCHAR(120),
|
|
created_by BIGINT UNSIGNED,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_substitutions_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_substitutions_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_substitutions_out FOREIGN KEY (player_out_id) REFERENCES players(id),
|
|
CONSTRAINT fk_substitutions_in FOREIGN KEY (player_in_id) REFERENCES players(id),
|
|
CONSTRAINT fk_substitutions_user FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
|
|
INDEX idx_substitutions_match_set (match_id, set_number, team_id)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE timeouts (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
team_id BIGINT UNSIGNED NOT NULL,
|
|
set_number TINYINT UNSIGNED NOT NULL,
|
|
points_home TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
points_away TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
requested_by VARCHAR(120),
|
|
created_by BIGINT UNSIGNED,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_timeouts_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_timeouts_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_timeouts_user FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
|
|
INDEX idx_timeouts_match_set (match_id, set_number, team_id)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE rally_history (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
set_number TINYINT UNSIGNED NOT NULL,
|
|
rally_number INT UNSIGNED NOT NULL,
|
|
serving_team_id BIGINT UNSIGNED,
|
|
winning_team_id BIGINT UNSIGNED,
|
|
result_type ENUM('point','error','ace','block','attack') NOT NULL DEFAULT 'point',
|
|
points_home TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
points_away TINYINT UNSIGNED NOT NULL DEFAULT 0,
|
|
notes VARCHAR(255),
|
|
created_by BIGINT UNSIGNED,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_rally_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_rally_serving_team FOREIGN KEY (serving_team_id) REFERENCES teams(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_rally_winning_team FOREIGN KEY (winning_team_id) REFERENCES teams(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_rally_user FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL,
|
|
UNIQUE KEY uq_rally_number (match_id, set_number, rally_number)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE referee_audit_logs (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
user_id BIGINT UNSIGNED,
|
|
action VARCHAR(80) NOT NULL,
|
|
payload JSON,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_audit_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_audit_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
INDEX idx_audit_match_created (match_id, created_at)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE referee_signatures (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
referee_id BIGINT UNSIGNED,
|
|
signer_name VARCHAR(140) NOT NULL,
|
|
role VARCHAR(80) NOT NULL DEFAULT 'principal',
|
|
signature_hash CHAR(64) NOT NULL,
|
|
signed_payload JSON,
|
|
signed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_signatures_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_signatures_referee FOREIGN KEY (referee_id) REFERENCES referees(id) ON DELETE SET NULL,
|
|
UNIQUE KEY uq_signature_match_role (match_id, role)
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE sanctions (
|
|
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
|
|
match_id BIGINT UNSIGNED NOT NULL,
|
|
team_id BIGINT UNSIGNED,
|
|
player_id BIGINT UNSIGNED,
|
|
card_type ENUM('yellow','red') NOT NULL,
|
|
reason VARCHAR(255),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_sanctions_match FOREIGN KEY (match_id) REFERENCES matches(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_sanctions_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_sanctions_player FOREIGN KEY (player_id) REFERENCES players(id) ON DELETE SET NULL
|
|
) ENGINE=InnoDB;
|
|
|
|
CREATE TABLE team_standings (
|
|
tournament_id BIGINT UNSIGNED NOT NULL,
|
|
team_id BIGINT UNSIGNED NOT NULL,
|
|
played INT UNSIGNED NOT NULL DEFAULT 0,
|
|
won INT UNSIGNED NOT NULL DEFAULT 0,
|
|
lost INT UNSIGNED NOT NULL DEFAULT 0,
|
|
sets_for INT UNSIGNED NOT NULL DEFAULT 0,
|
|
sets_against INT UNSIGNED NOT NULL DEFAULT 0,
|
|
points INT UNSIGNED NOT NULL DEFAULT 0,
|
|
PRIMARY KEY (tournament_id, team_id),
|
|
CONSTRAINT fk_standings_tournament FOREIGN KEY (tournament_id) REFERENCES tournaments(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_standings_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE
|
|
) ENGINE=InnoDB;
|