-- InsightFlow Phase 3 - Database Schema -- 支持知识生长与多文件融合 -- 项目表 CREATE TABLE IF NOT EXISTS projects ( id TEXT PRIMARY KEY, name TEXT NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 文件/转录表 CREATE TABLE IF NOT EXISTS transcripts ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, filename TEXT, full_text TEXT, type TEXT DEFAULT 'audio', -- 'audio' 或 'document' created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (project_id) REFERENCES projects(id) ); -- 全局实体表(跨文件共享) CREATE TABLE IF NOT EXISTS entities ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, name TEXT NOT NULL, canonical_name TEXT, -- 规范名称(用于对齐) type TEXT, definition TEXT, aliases TEXT, -- JSON 数组:["别名1", "别名2"] embedding TEXT, -- JSON 数组:实体名称+定义的 embedding created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (project_id) REFERENCES projects(id) ); -- 实体提及表(文件中的具体位置) CREATE TABLE IF NOT EXISTS entity_mentions ( id TEXT PRIMARY KEY, entity_id TEXT NOT NULL, transcript_id TEXT NOT NULL, start_pos INTEGER, end_pos INTEGER, text_snippet TEXT, confidence REAL DEFAULT 1.0, FOREIGN KEY (entity_id) REFERENCES entities(id), FOREIGN KEY (transcript_id) REFERENCES transcripts(id) ); -- 实体关系表 CREATE TABLE IF NOT EXISTS entity_relations ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, source_entity_id TEXT NOT NULL, target_entity_id TEXT NOT NULL, relation_type TEXT, -- "belongs_to", "works_with", "depends_on" 等 evidence TEXT, -- 关系来源文本 transcript_id TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (project_id) REFERENCES projects(id), FOREIGN KEY (source_entity_id) REFERENCES entities(id), FOREIGN KEY (target_entity_id) REFERENCES entities(id) ); -- 术语表(项目级热词,用于 ASR 优化) CREATE TABLE IF NOT EXISTS glossary ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, term TEXT NOT NULL, pronunciation TEXT, -- 发音提示,如 "K8s" -> "Kubernetes" frequency INTEGER DEFAULT 1, FOREIGN KEY (project_id) REFERENCES projects(id) ); -- Phase 5: 属性模板表 CREATE TABLE IF NOT EXISTS attribute_templates ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, name TEXT NOT NULL, type TEXT NOT NULL, -- text/number/date/select/multiselect description TEXT, options TEXT, -- JSON 数组,用于 select/multiselect 类型 is_required INTEGER DEFAULT 0, default_value TEXT, sort_order INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (project_id) REFERENCES projects(id) ); -- Phase 5: 实体属性值表 CREATE TABLE IF NOT EXISTS entity_attributes ( id TEXT PRIMARY KEY, entity_id TEXT NOT NULL, template_id TEXT, name TEXT NOT NULL, type TEXT NOT NULL, -- text/number/date/select/multiselect value TEXT, -- 存储实际值 options TEXT, -- JSON 数组,用于 select/multiselect created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE, FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE SET NULL, UNIQUE(entity_id, name) ); -- Phase 5: 属性变更历史表 CREATE TABLE IF NOT EXISTS attribute_history ( id TEXT PRIMARY KEY, entity_id TEXT NOT NULL, attribute_name TEXT NOT NULL, old_value TEXT, new_value TEXT, changed_by TEXT, -- 用户ID或系统 changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, change_reason TEXT, FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE ); -- Phase 5: 属性模板表(项目级自定义属性定义) CREATE TABLE IF NOT EXISTS attribute_templates ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, name TEXT NOT NULL, -- 属性名称,如"年龄"、"职位" type TEXT NOT NULL, -- 属性类型: text, number, date, select, multiselect, boolean options TEXT, -- JSON 数组,用于 select/multiselect 类型 default_value TEXT, -- 默认值 description TEXT, -- 属性描述 is_required BOOLEAN DEFAULT 0, -- 是否必填 display_order INTEGER DEFAULT 0, -- 显示顺序 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (project_id) REFERENCES projects(id) ); -- Phase 5: 实体属性值表 CREATE TABLE IF NOT EXISTS entity_attributes ( id TEXT PRIMARY KEY, entity_id TEXT NOT NULL, template_id TEXT NOT NULL, value TEXT, -- 属性值(以JSON或字符串形式存储) created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE, FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE CASCADE, UNIQUE(entity_id, template_id) -- 每个实体每个属性只能有一个值 ); -- Phase 5: 属性变更历史表 CREATE TABLE IF NOT EXISTS attribute_history ( id TEXT PRIMARY KEY, entity_id TEXT NOT NULL, template_id TEXT NOT NULL, old_value TEXT, new_value TEXT, changed_by TEXT, -- 用户ID或"system" changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, change_reason TEXT, -- 变更原因 FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE, FOREIGN KEY (template_id) REFERENCES attribute_templates(id) ON DELETE CASCADE ); -- 创建索引以提高查询性能 CREATE INDEX IF NOT EXISTS idx_entities_project ON entities(project_id); CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name); CREATE INDEX IF NOT EXISTS idx_transcripts_project ON transcripts(project_id); CREATE INDEX IF NOT EXISTS idx_mentions_entity ON entity_mentions(entity_id); CREATE INDEX IF NOT EXISTS idx_mentions_transcript ON entity_mentions(transcript_id); CREATE INDEX IF NOT EXISTS idx_relations_project ON entity_relations(project_id); CREATE INDEX IF NOT EXISTS idx_glossary_project ON glossary(project_id); -- Phase 5: 属性相关索引 CREATE INDEX IF NOT EXISTS idx_attr_templates_project ON attribute_templates(project_id); CREATE INDEX IF NOT EXISTS idx_entity_attributes_entity ON entity_attributes(entity_id); CREATE INDEX IF NOT EXISTS idx_entity_attributes_template ON entity_attributes(template_id); CREATE INDEX IF NOT EXISTS idx_attr_history_entity ON attribute_history(entity_id); -- Phase 7: 协作与共享 - 项目分享表 CREATE TABLE IF NOT EXISTS project_shares ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, token TEXT NOT NULL UNIQUE, -- 分享令牌 permission TEXT DEFAULT 'read_only', -- 权限级别: read_only, comment, edit, admin created_by TEXT NOT NULL, -- 创建者 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP, -- 过期时间 max_uses INTEGER, -- 最大使用次数 use_count INTEGER DEFAULT 0, -- 已使用次数 password_hash TEXT, -- 密码保护(哈希) is_active BOOLEAN DEFAULT 1, -- 是否激活 allow_download BOOLEAN DEFAULT 0, -- 允许下载 allow_export BOOLEAN DEFAULT 0, -- 允许导出 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE ); -- Phase 7: 协作与共享 - 评论表 CREATE TABLE IF NOT EXISTS comments ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, target_type TEXT NOT NULL, -- 目标类型: entity, relation, transcript, project target_id TEXT NOT NULL, -- 目标ID parent_id TEXT, -- 父评论ID(支持回复) author TEXT NOT NULL, -- 作者ID author_name TEXT, -- 作者显示名 content TEXT NOT NULL, -- 评论内容 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, resolved BOOLEAN DEFAULT 0, -- 是否已解决 resolved_by TEXT, -- 解决者 resolved_at TIMESTAMP, -- 解决时间 mentions TEXT, -- JSON数组: 提及的用户 attachments TEXT, -- JSON数组: 附件 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, FOREIGN KEY (parent_id) REFERENCES comments(id) ON DELETE CASCADE ); -- Phase 7: 协作与共享 - 变更历史表 CREATE TABLE IF NOT EXISTS change_history ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, change_type TEXT NOT NULL, -- 变更类型: create, update, delete, merge, split entity_type TEXT NOT NULL, -- 实体类型: entity, relation, transcript, project entity_id TEXT NOT NULL, -- 实体ID entity_name TEXT, -- 实体名称(用于显示) changed_by TEXT NOT NULL, -- 变更者ID changed_by_name TEXT, -- 变更者显示名 changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, old_value TEXT, -- JSON: 旧值 new_value TEXT, -- JSON: 新值 description TEXT, -- 变更描述 session_id TEXT, -- 会话ID(批量变更关联) reverted BOOLEAN DEFAULT 0, -- 是否已回滚 reverted_at TIMESTAMP, -- 回滚时间 reverted_by TEXT, -- 回滚者 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE ); -- Phase 7: 协作与共享 - 团队成员表 CREATE TABLE IF NOT EXISTS team_members ( id TEXT PRIMARY KEY, project_id TEXT NOT NULL, user_id TEXT NOT NULL, -- 用户ID user_name TEXT, -- 用户名 user_email TEXT, -- 用户邮箱 role TEXT DEFAULT 'viewer', -- 角色: owner, admin, editor, viewer, commenter joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, invited_by TEXT, -- 邀请者 last_active_at TIMESTAMP, -- 最后活跃时间 permissions TEXT, -- JSON数组: 具体权限列表 FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE, UNIQUE(project_id, user_id) -- 每个项目每个用户只能有一条记录 ); -- Phase 7: 协作与共享索引 CREATE INDEX IF NOT EXISTS idx_shares_project ON project_shares(project_id); CREATE INDEX IF NOT EXISTS idx_shares_token ON project_shares(token); CREATE INDEX IF NOT EXISTS idx_comments_project ON comments(project_id); CREATE INDEX IF NOT EXISTS idx_comments_target ON comments(target_type, target_id); CREATE INDEX IF NOT EXISTS idx_comments_parent ON comments(parent_id); CREATE INDEX IF NOT EXISTS idx_change_history_project ON change_history(project_id); CREATE INDEX IF NOT EXISTS idx_change_history_entity ON change_history(entity_type, entity_id); CREATE INDEX IF NOT EXISTS idx_change_history_session ON change_history(session_id); CREATE INDEX IF NOT EXISTS idx_team_members_project ON team_members(project_id); CREATE INDEX IF NOT EXISTS idx_team_members_user ON team_members(user_id);