Files
cs348project/backend/migrations/init.sql

67 lines
2.5 KiB
SQL

SET sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- USERS
CREATE TABLE IF NOT EXISTS users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) NOT NULL UNIQUE,
pass_bcrypt VARBINARY(60) NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;
-- CONVERSATIONS (one tree-ish DAG per conversation)
CREATE TABLE IF NOT EXISTS conversations (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
owner_id BIGINT NOT NULL,
title VARCHAR(255),
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_conversations_owner
FOREIGN KEY (owner_id) REFERENCES users(id)
ON DELETE CASCADE
) ENGINE=InnoDB;
-- NODES = commits (plain numeric IDs). author_kind for display only.
CREATE TABLE IF NOT EXISTS nodes (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
conversation_id BIGINT NOT NULL,
author_kind ENUM('user','assistant') NOT NULL,
content MEDIUMTEXT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_nodes_conversation
FOREIGN KEY (conversation_id) REFERENCES conversations(id)
ON DELETE CASCADE
) ENGINE=InnoDB;
-- EDGES (parent -> child). Acyclic enforced in application.
CREATE TABLE IF NOT EXISTS edges (
parent_id BIGINT NOT NULL,
child_id BIGINT NOT NULL,
PRIMARY KEY (parent_id, child_id),
CONSTRAINT fk_edges_parent
FOREIGN KEY (parent_id) REFERENCES nodes(id)
ON DELETE CASCADE,
CONSTRAINT fk_edges_child
FOREIGN KEY (child_id) REFERENCES nodes(id)
ON DELETE CASCADE
) ENGINE=InnoDB;
-- BRANCHES (named pointers to any node within a conversation)
CREATE TABLE IF NOT EXISTS branches (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
conversation_id BIGINT NOT NULL,
name VARCHAR(128) NOT NULL,
head_node_id BIGINT NOT NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uq_branch_name (conversation_id, name),
CONSTRAINT fk_branches_conversation
FOREIGN KEY (conversation_id) REFERENCES conversations(id)
ON DELETE CASCADE,
CONSTRAINT fk_branches_head
FOREIGN KEY (head_node_id) REFERENCES nodes(id)
ON DELETE CASCADE
) ENGINE=InnoDB;
CREATE INDEX idx_nodes_conv_created ON nodes (conversation_id, created_at, id);
CREATE INDEX idx_edges_child ON edges (child_id);
CREATE INDEX idx_edges_parent ON edges (parent_id);
CREATE INDEX idx_branches_conv_head ON branches (conversation_id, head_node_id);