Files
arboris-novel/backend/db/schema.sql
2025-10-21 09:51:27 +08:00

180 lines
6.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 全量数据库建表脚本,适用于 MySQL 8.x
-- 如需重建,请先根据需要执行 DROP TABLE再运行本脚本
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(64) NOT NULL UNIQUE,
email VARCHAR(128) UNIQUE,
hashed_password VARCHAR(255) NOT NULL,
external_id VARCHAR(255) UNIQUE,
is_admin TINYINT(1) DEFAULT 0,
is_active TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS novel_projects (
id CHAR(36) PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
initial_prompt TEXT,
status VARCHAR(32) DEFAULT 'draft',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_novel_projects_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS novel_conversations (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id CHAR(36) NOT NULL,
seq INT NOT NULL,
role VARCHAR(32) NOT NULL,
content LONGTEXT NOT NULL,
metadata JSON NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_conversations_project FOREIGN KEY (project_id) REFERENCES novel_projects(id) ON DELETE CASCADE,
UNIQUE KEY uq_conversations_project_seq (project_id, seq)
);
CREATE TABLE IF NOT EXISTS novel_blueprints (
project_id CHAR(36) PRIMARY KEY,
title VARCHAR(255) NULL,
target_audience VARCHAR(255) NULL,
genre VARCHAR(128) NULL,
style VARCHAR(128) NULL,
tone VARCHAR(128) NULL,
one_sentence_summary TEXT NULL,
full_synopsis LONGTEXT NULL,
world_setting JSON NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_blueprints_project FOREIGN KEY (project_id) REFERENCES novel_projects(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS blueprint_characters (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id CHAR(36) NOT NULL,
name VARCHAR(255) NOT NULL,
identity VARCHAR(255) NULL,
personality TEXT NULL,
goals TEXT NULL,
abilities TEXT NULL,
relationship_to_protagonist TEXT NULL,
extra JSON NULL,
position INT DEFAULT 0,
CONSTRAINT fk_characters_project FOREIGN KEY (project_id) REFERENCES novel_projects(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS blueprint_relationships (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id CHAR(36) NOT NULL,
character_from VARCHAR(255) NOT NULL,
character_to VARCHAR(255) NOT NULL,
description TEXT NULL,
position INT DEFAULT 0,
CONSTRAINT fk_relationships_project FOREIGN KEY (project_id) REFERENCES novel_projects(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS chapter_outlines (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id CHAR(36) NOT NULL,
chapter_number INT NOT NULL,
title VARCHAR(255) NOT NULL,
summary TEXT NULL,
CONSTRAINT fk_outlines_project FOREIGN KEY (project_id) REFERENCES novel_projects(id) ON DELETE CASCADE,
UNIQUE KEY uq_outline_project_chapter (project_id, chapter_number)
);
CREATE TABLE IF NOT EXISTS chapters (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
project_id CHAR(36) NOT NULL,
chapter_number INT NOT NULL,
real_summary TEXT NULL,
status VARCHAR(32) DEFAULT 'not_generated',
word_count INT DEFAULT 0,
selected_version_id BIGINT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_chapters_project FOREIGN KEY (project_id) REFERENCES novel_projects(id) ON DELETE CASCADE,
UNIQUE KEY uq_chapter_project_number (project_id, chapter_number)
);
CREATE TABLE IF NOT EXISTS chapter_versions (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
chapter_id BIGINT NOT NULL,
version_label VARCHAR(64) NULL,
provider VARCHAR(64) NULL,
content LONGTEXT NOT NULL,
metadata JSON NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_versions_chapter FOREIGN KEY (chapter_id) REFERENCES chapters(id) ON DELETE CASCADE
);
ALTER TABLE chapters
ADD CONSTRAINT fk_chapter_selected_version
FOREIGN KEY (selected_version_id) REFERENCES chapter_versions(id)
ON DELETE SET NULL;
CREATE TABLE IF NOT EXISTS chapter_evaluations (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
chapter_id BIGINT NOT NULL,
version_id BIGINT NULL,
decision VARCHAR(32) NULL,
feedback TEXT NULL,
score DECIMAL(5,2) NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT fk_evaluations_chapter FOREIGN KEY (chapter_id) REFERENCES chapters(id) ON DELETE CASCADE,
CONSTRAINT fk_evaluations_version FOREIGN KEY (version_id) REFERENCES chapter_versions(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS llm_configs (
user_id INT PRIMARY KEY,
llm_provider_url TEXT NULL,
llm_provider_api_key TEXT NULL,
llm_provider_model TEXT NULL,
CONSTRAINT fk_llm_configs_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS prompts (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
title VARCHAR(255) NULL,
content LONGTEXT NOT NULL,
tags VARCHAR(255) NULL,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE IF NOT EXISTS system_configs (
`key` VARCHAR(100) PRIMARY KEY,
value TEXT NOT NULL,
description VARCHAR(255) NULL
);
CREATE TABLE IF NOT EXISTS admin_settings (
`key` VARCHAR(64) PRIMARY KEY,
value TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS user_daily_requests (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
request_date DATE NOT NULL,
request_count INT DEFAULT 0,
UNIQUE KEY uq_user_request_date (user_id, request_date),
CONSTRAINT fk_daily_requests_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS usage_metrics (
`key` VARCHAR(64) PRIMARY KEY,
value INT NOT NULL DEFAULT 0
);
CREATE TABLE IF NOT EXISTS update_logs (
id INT AUTO_INCREMENT PRIMARY KEY,
content TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by VARCHAR(64) NULL,
is_pinned TINYINT(1) DEFAULT 0
);