70 lines
2.9 KiB
SQL
70 lines
2.9 KiB
SQL
CREATE TABLE IF NOT EXISTS users (
|
|
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
email VARCHAR(255) NOT NULL UNIQUE,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
name VARCHAR(120) NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS teams (
|
|
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
name VARCHAR(160) NOT NULL,
|
|
created_by BIGINT NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_teams_created_by FOREIGN KEY (created_by) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS team_members (
|
|
user_id BIGINT NOT NULL,
|
|
team_id BIGINT NOT NULL,
|
|
role ENUM('owner','admin','member') NOT NULL DEFAULT 'member',
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (user_id, team_id),
|
|
CONSTRAINT fk_team_members_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_team_members_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS tasks (
|
|
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
team_id BIGINT NOT NULL,
|
|
title VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
status ENUM('todo','in_progress','done') NOT NULL DEFAULT 'todo',
|
|
assignee_id BIGINT NULL,
|
|
created_by BIGINT NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_tasks_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_tasks_assignee FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL,
|
|
CONSTRAINT fk_tasks_created_by FOREIGN KEY (created_by) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS task_history (
|
|
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
task_id BIGINT NOT NULL,
|
|
changed_by BIGINT NOT NULL,
|
|
field_name VARCHAR(64) NOT NULL,
|
|
old_value TEXT,
|
|
new_value TEXT,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_task_history_task FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_task_history_changed_by FOREIGN KEY (changed_by) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS task_comments (
|
|
id BIGINT PRIMARY KEY AUTO_INCREMENT,
|
|
task_id BIGINT NOT NULL,
|
|
user_id BIGINT NOT NULL,
|
|
body TEXT NOT NULL,
|
|
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
CONSTRAINT fk_task_comments_task FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE,
|
|
CONSTRAINT fk_task_comments_user FOREIGN KEY (user_id) REFERENCES users(id)
|
|
);
|
|
|
|
CREATE INDEX idx_team_members_team_role ON team_members(team_id, role);
|
|
CREATE INDEX idx_tasks_team_status_assignee ON tasks(team_id, status, assignee_id, created_at);
|
|
CREATE INDEX idx_tasks_team_created_by_created_at ON tasks(team_id, created_by, created_at);
|
|
CREATE INDEX idx_tasks_assignee_team ON tasks(assignee_id, team_id);
|
|
CREATE INDEX idx_task_history_task_created_at ON task_history(task_id, created_at);
|
|
CREATE INDEX idx_task_comments_task_created_at ON task_comments(task_id, created_at);
|