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);