-- ===================================================== -- Timeline 数据库迁移脚本 -- 版本: V1.2.0 -- 日期: 2024 -- 描述: 第二阶段功能增强 - 搜索、标签、评论、通知系统 -- ===================================================== -- ----------------------------------------------------- -- 1. 标签系统表结构(如已存在则跳过) -- ----------------------------------------------------- -- 标签表 CREATE TABLE IF NOT EXISTS tag ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '标签唯一标识', name VARCHAR(50) NOT NULL COMMENT '标签名称', color VARCHAR(20) DEFAULT '#1890ff' COMMENT '标签颜色', owner_id VARCHAR(64) NOT NULL COMMENT '创建者ID', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', is_delete TINYINT DEFAULT 0 COMMENT '是否删除 0-否 1-是', INDEX idx_tag_owner (owner_id), INDEX idx_tag_name (name) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='标签表'; -- 时间线节点与标签关联表 CREATE TABLE IF NOT EXISTS story_item_tag ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID', tag_id VARCHAR(64) NOT NULL COMMENT '标签ID', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', create_id VARCHAR(64) COMMENT '创建者ID', UNIQUE KEY uk_item_tag (story_item_id, tag_id), INDEX idx_tag_story_item (tag_id, story_item_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='时间线节点标签关联表'; -- ----------------------------------------------------- -- 2. 评论系统表结构 -- ----------------------------------------------------- -- 评论表 CREATE TABLE IF NOT EXISTS story_comment ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '评论唯一标识', story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID', user_id VARCHAR(64) NOT NULL COMMENT '评论用户ID', parent_id VARCHAR(64) DEFAULT NULL COMMENT '父评论ID,用于回复功能', reply_to_user_id VARCHAR(64) DEFAULT NULL COMMENT '回复的用户ID', content TEXT NOT NULL COMMENT '评论内容', like_count INT DEFAULT 0 COMMENT '点赞数', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', is_delete TINYINT DEFAULT 0 COMMENT '是否删除 0-否 1-是', INDEX idx_comment_story_item (story_item_id, create_time DESC), INDEX idx_comment_user (user_id), INDEX idx_comment_parent (parent_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论表'; -- ----------------------------------------------------- -- 3. 点赞系统表结构 -- ----------------------------------------------------- -- 点赞表(节点点赞) CREATE TABLE IF NOT EXISTS story_item_like ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID', user_id VARCHAR(64) NOT NULL COMMENT '点赞用户ID', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', UNIQUE KEY uk_item_user (story_item_id, user_id), INDEX idx_like_user (user_id, create_time DESC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='节点点赞表'; -- 评论点赞表 CREATE TABLE IF NOT EXISTS comment_like ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', comment_id VARCHAR(64) NOT NULL COMMENT '评论ID', user_id VARCHAR(64) NOT NULL COMMENT '点赞用户ID', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', UNIQUE KEY uk_comment_user (comment_id, user_id), INDEX idx_comment_like_user (user_id, create_time DESC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='评论点赞表'; -- ----------------------------------------------------- -- 4. 收藏系统表结构 -- ----------------------------------------------------- -- 收藏表 CREATE TABLE IF NOT EXISTS story_item_favorite ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '收藏记录唯一标识', story_item_id VARCHAR(64) NOT NULL COMMENT '时间线节点ID', user_id VARCHAR(64) NOT NULL COMMENT '收藏用户ID', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', UNIQUE KEY uk_item_user (story_item_id, user_id), INDEX idx_favorite_user (user_id, create_time DESC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收藏表'; -- ----------------------------------------------------- -- 5. 消息通知系统表结构 -- ----------------------------------------------------- -- 消息通知表 CREATE TABLE IF NOT EXISTS notification ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '消息唯一标识', user_id VARCHAR(64) NOT NULL COMMENT '接收用户ID', type VARCHAR(20) NOT NULL COMMENT '消息类型: COMMENT/LIKE/MENTION/INVITE/SYSTEM', title VARCHAR(200) NOT NULL COMMENT '消息标题', content TEXT COMMENT '消息内容', related_id VARCHAR(64) COMMENT '关联ID(评论ID/节点ID等)', related_type VARCHAR(20) COMMENT '关联类型: STORY_ITEM/COMMENT/STORY', sender_id VARCHAR(64) COMMENT '发送者ID', sender_name VARCHAR(100) COMMENT '发送者名称', sender_avatar VARCHAR(500) COMMENT '发送者头像', is_read TINYINT DEFAULT 0 COMMENT '是否已读 0-未读 1-已读', read_time DATETIME COMMENT '阅读时间', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', INDEX idx_notification_user (user_id, is_read, create_time DESC), INDEX idx_notification_type (type) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='消息通知表'; -- ----------------------------------------------------- -- 6. 操作历史记录表(支持撤销/重做) -- ----------------------------------------------------- -- 操作历史表 CREATE TABLE IF NOT EXISTS operation_history ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '记录唯一标识', user_id VARCHAR(64) NOT NULL COMMENT '操作用户ID', story_id VARCHAR(64) COMMENT '故事ID', operation_type VARCHAR(20) NOT NULL COMMENT '操作类型: CREATE/UPDATE/DELETE/REORDER', target_type VARCHAR(20) NOT NULL COMMENT '目标类型: STORY/STORY_ITEM', target_id VARCHAR(64) NOT NULL COMMENT '目标ID', before_data JSON COMMENT '操作前数据快照', after_data JSON COMMENT '操作后数据快照', description VARCHAR(200) COMMENT '操作描述', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', INDEX idx_history_user_story (user_id, story_id, create_time DESC), INDEX idx_history_target (target_type, target_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作历史记录表'; -- ----------------------------------------------------- -- 7. 用户消息设置表 -- ----------------------------------------------------- -- 用户消息设置表 CREATE TABLE IF NOT EXISTS user_notification_setting ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', user_id VARCHAR(64) UNIQUE NOT NULL COMMENT '用户ID', comment_notify TINYINT DEFAULT 1 COMMENT '评论通知 0-关闭 1-开启', like_notify TINYINT DEFAULT 1 COMMENT '点赞通知 0-关闭 1-开启', mention_notify TINYINT DEFAULT 1 COMMENT '@提及通知 0-关闭 1-开启', invite_notify TINYINT DEFAULT 1 COMMENT '邀请通知 0-关闭 1-开启', system_notify TINYINT DEFAULT 1 COMMENT '系统通知 0-关闭 1-开启', email_notify TINYINT DEFAULT 0 COMMENT '邮件通知 0-关闭 1-开启', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户消息设置表'; -- ----------------------------------------------------- -- 8. @提及记录表 -- ----------------------------------------------------- -- @提及表 CREATE TABLE IF NOT EXISTS mention ( id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', instance_id VARCHAR(64) UNIQUE NOT NULL COMMENT '提及记录唯一标识', from_user_id VARCHAR(64) NOT NULL COMMENT '提及者ID', to_user_id VARCHAR(64) NOT NULL COMMENT '被提及者ID', related_type VARCHAR(20) NOT NULL COMMENT '关联类型: COMMENT/STORY_ITEM', related_id VARCHAR(64) NOT NULL COMMENT '关联ID', is_notified TINYINT DEFAULT 0 COMMENT '是否已发送通知 0-否 1-是', create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', INDEX idx_mention_to (to_user_id, is_notified, create_time DESC), INDEX idx_mention_related (related_type, related_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='@提及记录表'; -- ----------------------------------------------------- -- 9. 统计字段更新触发器 -- ----------------------------------------------------- -- 为 story_item 表添加统计字段 ALTER TABLE story_item ADD COLUMN comment_count INT DEFAULT 0 COMMENT '评论数', ADD COLUMN like_count INT DEFAULT 0 COMMENT '点赞数', ADD COLUMN favorite_count INT DEFAULT 0 COMMENT '收藏数'; -- ----------------------------------------------------- -- 10. 索引优化 -- ----------------------------------------------------- -- 为 story_item 表添加复合索引 CREATE INDEX IF NOT EXISTS idx_story_item_stats ON story_item(story_instance_id, is_delete, like_count DESC, create_time DESC); -- ----------------------------------------------------- -- 数据迁移说明 -- ----------------------------------------------------- -- 1. 新表均为空表,无需数据迁移 -- 2. 统计字段默认值为 0,现有数据无需迁移 -- 3. 建议在低峰期执行此脚本 -- 4. Elasticsearch 索引需要单独创建和同步 -- ----------------------------------------------------- -- 回滚脚本 (如需回滚,请执行以下语句) -- ----------------------------------------------------- /* -- 删除新增字段 ALTER TABLE story_item DROP COLUMN comment_count; ALTER TABLE story_item DROP COLUMN like_count; ALTER TABLE story_item DROP COLUMN favorite_count; -- 删除新增索引 DROP INDEX IF EXISTS idx_story_item_stats ON story_item; -- 删除新增表 DROP TABLE IF EXISTS mention; DROP TABLE IF EXISTS user_notification_setting; DROP TABLE IF EXISTS operation_history; DROP TABLE IF EXISTS notification; DROP TABLE IF EXISTS story_item_favorite; DROP TABLE IF EXISTS comment_like; DROP TABLE IF EXISTS story_item_like; DROP TABLE IF EXISTS story_comment; DROP TABLE IF EXISTS story_item_tag; DROP TABLE IF EXISTS tag; */