Skip to content

活动表(Activities)索引构建说明

sql
-- =============================================
-- 活动表(Activities)
-- 用于存储活动的核心信息
-- =============================================

CREATE TABLE IF NOT EXISTS `activities` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `activity_id` VARCHAR(64) NOT NULL COMMENT '活动ID(业务主键)',
  `creator_id` VARCHAR(64) NOT NULL COMMENT '创建者用户ID',
  `title` VARCHAR(200) NOT NULL COMMENT '活动标题',
  `description` TEXT COMMENT '活动描述',
  
  -- 位置信息
  `location_name` VARCHAR(200) COMMENT '位置名称',
  `location_address` VARCHAR(500) COMMENT '详细地址',
  `location_latitude` DECIMAL(10, 7) COMMENT '纬度',
  `location_longitude` DECIMAL(10, 7) COMMENT '经度',
  `location_city` VARCHAR(100) COMMENT '城市',
  `location_province` VARCHAR(100) COMMENT '省份',
  
  -- 时间信息
  `start_time` DATETIME NOT NULL COMMENT '开始时间',
  `end_time` DATETIME COMMENT '结束时间',
  
  -- 参与者信息
  `max_participants` INT COMMENT '最大参与人数',
  `current_participants` INT NOT NULL DEFAULT 0 COMMENT '当前参与人数',
  
  -- 费用信息
  `cost_type` VARCHAR(32) NOT NULL DEFAULT 'FREE' COMMENT '费用类型(FREE-免费, PAID-付费, AA-AA制, SPONSORED-赞助)',
  `cost_amount` DECIMAL(10, 2) COMMENT '活动费用金额',
  `cost_currency` VARCHAR(10) DEFAULT 'CNY' COMMENT '货币类型',
  
  -- 状态信息
  `status` VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '活动状态(DRAFT-草稿, PUBLISHED-已发布, IN_PROGRESS-进行中, COMPLETED-已完成, CANCELLED-已取消)',
  `cancellation_reason` VARCHAR(500) COMMENT '取消原因',
  
  -- 其他设置
  `need_approval` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否需要审核',
  `tags` JSON COMMENT '活动标签(JSON数组)',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `version` INT NOT NULL DEFAULT 0 COMMENT '版本号(乐观锁)',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_activity_id` (`activity_id`),
	KEY `idx_status_type_location_start` (`status`, `activity_type`, `province`, `city`, `start_time`),
  KEY `idx_status_category_start` (`status`, `category`, `sub_category`, `start_time`),
	KEY `idx_creator_status_start` (`creator_user_id`, `status`, `start_time`),
	KEY `idx_approval_created` (`approval_status`, `created_time`),
	KEY `idx_location` (`province`, `city`, `district`),
	KEY `idx_registration_deadline` (`registration_deadline`),
	KEY `idx_is_deleted` (`is_deleted`),
	KEY `idx_privacy_status` (`privacy_setting`, `status`),
	KEY `idx_published_time` (`published_time`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动表';

说明:推荐最终索引列表(共 11 个索引,含主键)

sql
-- 主键(保留)
PRIMARY KEY (`id`),

-- 业务唯一键(必须保留)
UNIQUE KEY `uk_activity_id` (`activity_id`),

-- 1. 核心活动列表查询(发现页、首页推荐最重要)
KEY `idx_status_type_location_start` (`status`, `activity_type`, `province`, `city`, `start_time`),

-- 2. 按分类浏览活动(次核心)
KEY `idx_status_category_start` (`status`, `category`, `sub_category`, `start_time`),

-- 3. 用户查看“我创建的活动”或“我参与的活动”
KEY `idx_creator_status_start` (`creator_user_id`, `status`, `start_time`),

-- 4. 审核管理列表
KEY `idx_approval_created` (`approval_status`, `created_time`),

-- 5. 地理位置精确筛选(保留并稍优化顺序)
KEY `idx_location` (`province`, `city`, `district`),

-- 6. 报名截止时间筛选(可报名活动常用)
KEY `idx_registration_deadline` (`registration_deadline`),

-- 7. 软删除必备(几乎所有查询都会加 is_deleted = 0)
KEY `idx_is_deleted` (`is_deleted`),

-- 8. 隐私设置筛选(公开活动核心条件)
KEY `idx_privacy_status` (`privacy_setting`, `status`),

-- 9. 发布时间排序(发布后活动按最新排序常用)
KEY `idx_published_time` (`published_time`),

-- 10. 创建时间排序(后台管理常用)
KEY `idx_created_time` (`created_time`)

已删除的原有索引(理由说明)

原有索引删除理由
idx_activity_type被复合索引 1 完全覆盖(前缀包含 activity_type)
idx_category被复合索引 2 完全覆盖
idx_status被多个复合索引覆盖(如索引1、2、3、8)
idx_start_time被复合索引 1、2、3 覆盖(放在最后支持范围扫描和排序)
idx_end_time使用频率低,通常通过 status 或 start_time 推导,已结束活动少量单独查询
idx_approval_status被复合索引 4 覆盖

各索引适用场景说明

索引名称主要覆盖查询场景
idx_status_type_location_start发现页:公开 + 户外 + 广东深圳 + 即将开始的活动,按开始时间排序
idx_status_category_start分类页:公开 + 徒步 + 子分类登山 + 按时间排序
idx_creator_status_start个人中心:我创建的进行中/已发布活动,按时间排序
idx_approval_created后台审核列表:待审核活动,按创建时间倒序
idx_location纯地理筛选(如仅选城市,不关心状态时)
idx_registration_deadline“正在报名中的活动”:registration_deadline > NOW()
idx_is_deleted所有业务查询必加条件,避免扫描已删除数据
idx_privacy_status公开活动列表(privacy_setting='PUBLIC' AND status='PUBLISHED')
idx_published_time“最新发布”排序
idx_created_time后台按创建时间搜索/排序

总结

  • 总索引数从原来的 12 个减少到 11 个,但查询性能大幅提升。
  • 核心多条件查询(状态 + 类型/分类 + 位置 + 时间排序)都能命中高效复合索引,避免 Index Merge 或全表扫描。
  • 写入性能影响控制在合理范围(复合索引维护成本略高于单列,但收益远大于成本)。
  • 后续数据量达到百万级以上时,这个索引方案依然能保持良好性能。

如果你有更具体的典型 SQL 查询语句(比如前 10 条最慢的慢查询),我可以进一步微调顺序或再精简。当前方案已经适用于 90% 以上的活动平台场景。

sql
-- =============================================
-- 活动成员表(Activity Members)
-- 用于记录用户参与活动的信息
-- =============================================

CREATE TABLE IF NOT EXISTS `activity_members` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `member_id` VARCHAR(64) NOT NULL COMMENT '成员记录ID(业务主键)',
  `activity_id` VARCHAR(64) NOT NULL COMMENT '活动ID',
  `user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
  
  -- 成员角色和状态
  `role` VARCHAR(32) NOT NULL DEFAULT 'MEMBER' COMMENT '成员角色(CREATOR-创建者, MEMBER-普通成员)',
  `join_status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '加入状态(PENDING-待审核, APPROVED-已通过, REJECTED-已拒绝, LEFT-已退出)',
  
  -- 时间信息
  `join_time` DATETIME NOT NULL COMMENT '加入时间',
  `approval_time` DATETIME COMMENT '审核时间',
  `leave_time` DATETIME COMMENT '退出时间',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_member_id` (`member_id`),
  UNIQUE KEY `uk_activity_user` (`activity_id`, `user_id`),
  KEY `idx_activity_id` (`activity_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_join_status` (`join_status`),
  KEY `idx_role` (`role`),
  KEY `idx_join_time` (`join_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动成员表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_member_id: 保证成员记录ID唯一性
-- uk_activity_user: 保证同一用户在同一活动中只有一条记录
-- idx_activity_id: 根据活动ID查询成员列表
-- idx_user_id: 根据用户ID查询参与的活动
-- idx_join_status: 根据加入状态查询(如查询待审核的成员)
-- idx_role: 根据角色查询(如查询创建者)
-- idx_join_time: 根据加入时间排序
sql
-- =============================================
-- 聊天室表(Chat Rooms)
-- 用于存储聊天室信息,支持私聊和群聊
-- =============================================

CREATE TABLE IF NOT EXISTS `chat_rooms` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `chat_room_id` VARCHAR(64) NOT NULL COMMENT '聊天室ID(业务主键)',
  `room_name` VARCHAR(200) COMMENT '聊天室名称(群聊时使用)',
  `room_type` VARCHAR(32) NOT NULL COMMENT '聊天室类型(PRIVATE-私聊, GROUP-群聊, ACTIVITY-活动群聊)',
  
  -- 关联信息
  `activity_id` VARCHAR(64) COMMENT '关联活动ID(活动群聊时使用)',
  `creator_id` VARCHAR(64) NOT NULL COMMENT '创建者用户ID',
  
  -- 群聊信息
  `avatar_url` VARCHAR(500) COMMENT '聊天室头像URL(群聊时使用)',
  `description` VARCHAR(500) COMMENT '聊天室描述',
  `member_count` INT NOT NULL DEFAULT 0 COMMENT '成员数量',
  `max_members` INT COMMENT '最大成员数量',
  
  -- 最后消息信息
  `last_message_id` VARCHAR(64) COMMENT '最后一条消息ID',
  `last_message_content` VARCHAR(500) COMMENT '最后一条消息内容',
  `last_message_time` DATETIME COMMENT '最后消息时间',
  
  -- 状态和设置
  `status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '聊天室状态(ACTIVE-活跃, ARCHIVED-已归档, DELETED-已删除)',
  `is_pinned` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否置顶',
  `is_muted` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否开启消息免打扰',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_chat_room_id` (`chat_room_id`),
  KEY `idx_room_type` (`room_type`),
  KEY `idx_activity_id` (`activity_id`),
  KEY `idx_creator_id` (`creator_id`),
  KEY `idx_status` (`status`),
  KEY `idx_last_message_time` (`last_message_time`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='聊天室表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_chat_room_id: 保证聊天室ID唯一性
-- idx_room_type: 根据聊天室类型查询
-- idx_activity_id: 根据活动ID查询关联的聊天室
-- idx_creator_id: 根据创建者查询聊天室
-- idx_status: 根据状态查询
-- idx_last_message_time: 根据最后消息时间排序
-- idx_created_time: 根据创建时间排序
sql
-- =============================================
-- 聊天成员表(Chat Members)
-- 用于记录聊天室成员信息
-- =============================================

CREATE TABLE IF NOT EXISTS `chat_members` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `member_id` VARCHAR(64) NOT NULL COMMENT '成员ID(业务主键)',
  `chat_room_id` VARCHAR(64) NOT NULL COMMENT '聊天室ID',
  `user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
  
  -- 成员角色和昵称
  `role` VARCHAR(32) NOT NULL DEFAULT 'MEMBER' COMMENT '成员角色(OWNER-群主, ADMIN-管理员, MEMBER-普通成员)',
  `member_nickname` VARCHAR(100) COMMENT '成员昵称(在群内的昵称)',
  
  -- 时间信息
  `join_time` DATETIME NOT NULL COMMENT '加入时间',
  `last_read_message_id` VARCHAR(64) COMMENT '最后阅读消息ID',
  `last_read_time` DATETIME COMMENT '最后阅读时间',
  
  -- 消息统计
  `unread_count` INT NOT NULL DEFAULT 0 COMMENT '未读消息数量',
  
  -- 设置
  `is_muted` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否开启消息免打扰',
  `is_pinned` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否置顶聊天',
  
  -- 状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '成员状态(ACTIVE-正常, LEFT-已退出, KICKED-被踢出, BANNED-被禁言)',
  `mute_until` DATETIME COMMENT '禁言到期时间',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_member_id` (`member_id`),
  UNIQUE KEY `uk_chat_room_user` (`chat_room_id`, `user_id`),
  KEY `idx_chat_room_id` (`chat_room_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_role` (`role`),
  KEY `idx_status` (`status`),
  KEY `idx_join_time` (`join_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='聊天成员表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_member_id: 保证成员ID唯一性
-- uk_chat_room_user: 保证同一用户在同一聊天室中只有一条记录
-- idx_chat_room_id: 根据聊天室ID查询成员列表
-- idx_user_id: 根据用户ID查询参与的聊天室
-- idx_role: 根据角色查询(如查询管理员)
-- idx_status: 根据状态查询
-- idx_join_time: 根据加入时间排序
sql
-- =============================================
-- 消息表(Messages)
-- 用于存储聊天消息,支持文字、图片、语音、视频等多种类型
-- =============================================

CREATE TABLE IF NOT EXISTS `messages` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `message_id` VARCHAR(64) NOT NULL COMMENT '消息ID(业务主键)',
  `chat_room_id` VARCHAR(64) NOT NULL COMMENT '聊天室ID',
  `sender_id` VARCHAR(64) NOT NULL COMMENT '发送者用户ID',
  `receiver_id` VARCHAR(64) COMMENT '接收者用户ID(私聊时使用)',
  
  -- 消息内容
  `message_type` VARCHAR(32) NOT NULL COMMENT '消息类型(TEXT-文字, IMAGE-图片, VOICE-语音, VIDEO-视频, SYSTEM-系统消息)',
  `content` TEXT COMMENT '消息内容',
  `media_url` VARCHAR(500) COMMENT '媒体文件URL(图片、语音、视频)',
  `voice_duration` INT COMMENT '语音消息时长(秒)',
  
  -- 消息状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'SENT' COMMENT '消息状态(SENT-已发送, DELIVERED-已送达, READ-已读, DELETED-已删除)',
  `is_system_message` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为系统消息',
  
  -- 时间信息
  `send_time` DATETIME NOT NULL COMMENT '发送时间',
  `deliver_time` DATETIME COMMENT '送达时间',
  `read_time` DATETIME COMMENT '已读时间',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_message_id` (`message_id`),
  KEY `idx_chat_room_id` (`chat_room_id`),
  KEY `idx_sender_id` (`sender_id`),
  KEY `idx_receiver_id` (`receiver_id`),
  KEY `idx_message_type` (`message_type`),
  KEY `idx_status` (`status`),
  KEY `idx_send_time` (`send_time`),
  KEY `idx_chat_room_send_time` (`chat_room_id`, `send_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消息表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_message_id: 保证消息ID唯一性
-- idx_chat_room_id: 根据聊天室ID查询消息列表
-- idx_sender_id: 根据发送者查询消息
-- idx_receiver_id: 根据接收者查询消息(私聊)
-- idx_message_type: 根据消息类型查询
-- idx_status: 根据状态查询
-- idx_send_time: 根据发送时间排序
-- idx_chat_room_send_time: 复合索引,用于查询聊天室的消息记录
sql
-- =============================================
-- 评论表(Comments)
-- 用于存储帖子的评论信息
-- =============================================

CREATE TABLE IF NOT EXISTS `comments` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `comment_id` VARCHAR(64) NOT NULL COMMENT '评论ID(业务主键)',
  `post_id` VARCHAR(64) NOT NULL COMMENT '帖子ID',
  `commenter_id` VARCHAR(64) NOT NULL COMMENT '评论者ID',
  
  -- 评论内容
  `content` VARCHAR(500) NOT NULL COMMENT '评论内容',
  `parent_comment_id` VARCHAR(64) COMMENT '父评论ID(用于回复)',
  
  -- 互动统计
  `like_count` INT NOT NULL DEFAULT 0 COMMENT '点赞数',
  `reply_count` INT NOT NULL DEFAULT 0 COMMENT '回复数',
  
  -- 评论状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '评论状态(PENDING-待审核, APPROVED-已通过, REJECTED-已拒绝, DELETED-已删除)',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_comment_id` (`comment_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_commenter_id` (`commenter_id`),
  KEY `idx_parent_comment_id` (`parent_comment_id`),
  KEY `idx_status` (`status`),
  KEY `idx_created_time` (`created_time`),
  KEY `idx_post_created_time` (`post_id`, `created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_comment_id: 保证评论ID唯一性
-- idx_post_id: 根据帖子ID查询评论列表
-- idx_commenter_id: 根据评论者查询评论
-- idx_parent_comment_id: 根据父评论ID查询回复
-- idx_status: 根据状态查询
-- idx_created_time: 根据创建时间排序
-- idx_post_created_time: 复合索引,用于查询帖子的最新评论
sql
-- =============================================
-- 点赞表(Likes)
-- 用于记录用户对帖子或评论的点赞行为
-- =============================================

CREATE TABLE IF NOT EXISTS `likes` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `like_id` VARCHAR(64) NOT NULL COMMENT '点赞ID(业务主键)',
  `user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
  
  -- 点赞目标
  `target_type` VARCHAR(32) NOT NULL COMMENT '目标类型(POST-帖子, COMMENT-评论)',
  `target_id` VARCHAR(64) NOT NULL COMMENT '目标ID(帖子ID或评论ID)',
  `post_id` VARCHAR(64) NOT NULL COMMENT '帖子ID(用于关联查询)',
  
  -- 点赞状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '点赞状态(ACTIVE-有效, CANCELLED-已取消)',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_like_id` (`like_id`),
  UNIQUE KEY `uk_user_target` (`user_id`, `target_type`, `target_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_target_type` (`target_type`),
  KEY `idx_target_id` (`target_id`),
  KEY `idx_post_id` (`post_id`),
  KEY `idx_status` (`status`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='点赞表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_like_id: 保证点赞ID唯一性
-- uk_user_target: 保证同一用户对同一目标只能点赞一次
-- idx_user_id: 根据用户ID查询点赞记录
-- idx_target_type: 根据目标类型查询
-- idx_target_id: 根据目标ID查询点赞列表
-- idx_post_id: 根据帖子ID查询点赞
-- idx_status: 根据状态查询
-- idx_created_time: 根据创建时间排序
sql
-- =============================================
-- 搭子匹配请求表(Match Requests)
-- 用于存储用户发起的搭子匹配请求
-- =============================================

CREATE TABLE IF NOT EXISTS `match_requests` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `request_id` VARCHAR(64) NOT NULL COMMENT '匹配请求ID(业务主键)',
  `user_id` VARCHAR(64) NOT NULL COMMENT '发起用户ID',
  
  -- 出行计划
  `destination` VARCHAR(200) NOT NULL COMMENT '目的地',
  `plan_description` TEXT NOT NULL COMMENT '出行计划描述',
  `plan_start_time` DATETIME NOT NULL COMMENT '计划开始时间',
  `plan_end_time` DATETIME NOT NULL COMMENT '计划结束时间',
  
  -- 匹配条件
  `expected_partners` INT NOT NULL COMMENT '期望搭子数量',
  `gender_preference` VARCHAR(32) DEFAULT 'ALL' COMMENT '性别偏好(ALL-不限, MALE-男性, FEMALE-女性)',
  `min_age_preference` INT COMMENT '年龄偏好最小值',
  `max_age_preference` INT COMMENT '年龄偏好最大值',
  `interest_preferences` JSON COMMENT '兴趣标签偏好(JSON数组)',
  `distance_limit` INT COMMENT '距离限制(公里)',
  
  -- 匹配状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '匹配状态(ACTIVE-活跃, PAUSED-暂停, COMPLETED-已完成, CANCELLED-已取消)',
  `matched_count` INT NOT NULL DEFAULT 0 COMMENT '匹配到的搭子数量',
  `expire_time` DATETIME NOT NULL COMMENT '请求有效期',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_request_id` (`request_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status` (`status`),
  KEY `idx_destination` (`destination`),
  KEY `idx_plan_start_time` (`plan_start_time`),
  KEY `idx_expire_time` (`expire_time`),
  KEY `idx_created_time` (`created_time`),
  KEY `idx_status_expire_time` (`status`, `expire_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='搭子匹配请求表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_request_id: 保证请求ID唯一性
-- idx_user_id: 根据用户ID查询匹配请求
-- idx_status: 根据状态查询
-- idx_destination: 根据目的地查询
-- idx_plan_start_time: 根据计划开始时间排序
-- idx_expire_time: 根据有效期查询
-- idx_created_time: 根据创建时间排序
-- idx_status_expire_time: 复合索引,用于查询活跃且未过期的请求
sql
-- =============================================
-- 匹配结果表(Match Results)
-- 用于存储用户匹配的结果记录
-- =============================================

CREATE TABLE IF NOT EXISTS `match_results` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `match_result_id` VARCHAR(64) NOT NULL COMMENT '匹配结果ID(业务主键)',
  `match_request_id` VARCHAR(64) NOT NULL COMMENT '匹配请求ID',
  `from_user_id` VARCHAR(64) NOT NULL COMMENT '发起用户ID',
  `to_user_id` VARCHAR(64) NOT NULL COMMENT '目标用户ID',
  
  -- 匹配信息
  `match_score` DECIMAL(5, 2) NOT NULL COMMENT '匹配分数(0-100)',
  `match_type` VARCHAR(32) NOT NULL COMMENT '匹配类型(ACTIVITY_MATE-活动搭子, TRAVEL_MATE-旅行搭子, INTEREST_MATE-兴趣搭子)',
  `match_reason` VARCHAR(500) COMMENT '匹配原因描述',
  `match_details` JSON COMMENT '匹配结果详情(JSON格式)',
  `similarity_details` JSON COMMENT '相似度详情(JSON格式,包含各维度相似度)',
  
  -- 推荐权重
  `recommend_weight` DECIMAL(5, 2) COMMENT '推荐权重',
  
  -- 匹配状态
  `match_status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '匹配状态(PENDING-待处理, ACCEPTED-已接受, REJECTED-已拒绝, EXPIRED-已过期)',
  `is_viewed` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否已查看',
  
  -- 时间信息
  `view_time` DATETIME COMMENT '查看时间',
  `response_time` DATETIME COMMENT '响应时间',
  `expire_time` DATETIME COMMENT '过期时间',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_match_result_id` (`match_result_id`),
  KEY `idx_match_request_id` (`match_request_id`),
  KEY `idx_from_user_id` (`from_user_id`),
  KEY `idx_to_user_id` (`to_user_id`),
  KEY `idx_match_type` (`match_type`),
  KEY `idx_match_status` (`match_status`),
  KEY `idx_match_score` (`match_score`),
  KEY `idx_is_viewed` (`is_viewed`),
  KEY `idx_created_time` (`created_time`),
  KEY `idx_from_user_status` (`from_user_id`, `match_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='匹配结果表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_match_result_id: 保证匹配结果ID唯一性
-- idx_match_request_id: 根据匹配请求ID查询结果
-- idx_from_user_id: 根据发起用户查询匹配结果
-- idx_to_user_id: 根据目标用户查询被匹配记录
-- idx_match_type: 根据匹配类型查询
-- idx_match_status: 根据状态查询
-- idx_match_score: 根据匹配分数排序
-- idx_is_viewed: 根据是否查看查询
-- idx_created_time: 根据创建时间排序
-- idx_from_user_status: 复合索引,用于查询用户的待处理匹配
sql
-- =============================================
-- 用户兴趣表(User Interests)
-- 用于存储用户的兴趣爱好标签
-- =============================================

CREATE TABLE IF NOT EXISTS `user_interests` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `interest_id` VARCHAR(64) NOT NULL COMMENT '兴趣记录ID(业务主键)',
  `user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
  
  -- 兴趣标签
  `interest_tag` VARCHAR(100) NOT NULL COMMENT '兴趣标签(旅游、爬山、美食、摄影、运动、音乐、电影等)',
  `interest_level` INT NOT NULL DEFAULT 1 COMMENT '兴趣等级(1-一般, 2-喜欢, 3-热爱)',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_interest_id` (`interest_id`),
  UNIQUE KEY `uk_user_interest` (`user_id`, `interest_tag`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_interest_tag` (`interest_tag`),
  KEY `idx_interest_level` (`interest_level`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户兴趣表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_interest_id: 保证兴趣记录ID唯一性
-- uk_user_interest: 保证同一用户的同一兴趣标签只有一条记录
-- idx_user_id: 根据用户ID查询兴趣列表
-- idx_interest_tag: 根据兴趣标签查询用户
-- idx_interest_level: 根据兴趣等级查询
-- idx_created_time: 根据创建时间排序
sql
-- =============================================
-- 角色表(Roles)
-- 用于管理系统角色和权限
-- =============================================

CREATE TABLE IF NOT EXISTS `roles` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `role_id` VARCHAR(64) NOT NULL COMMENT '角色ID(业务主键)',
  `role_name` VARCHAR(100) NOT NULL COMMENT '角色名称',
  `role_code` VARCHAR(50) NOT NULL COMMENT '角色代码',
  `description` VARCHAR(500) COMMENT '角色描述',
  
  -- 角色类型和级别
  `role_type` VARCHAR(32) NOT NULL COMMENT '角色类型(SYSTEM-系统, BUSINESS-业务, CUSTOM-自定义)',
  `level` INT NOT NULL DEFAULT 1 COMMENT '角色级别(1-10)',
  
  -- 权限
  `permissions` JSON COMMENT '权限列表(JSON格式)',
  
  -- 角色层级
  `parent_role_id` VARCHAR(64) COMMENT '父角色ID',
  `child_role_ids` JSON COMMENT '子角色ID列表(JSON格式)',
  
  -- 角色状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '角色状态(ACTIVE-激活, INACTIVE-未激活, DELETED-已删除)',
  `is_default` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为默认角色',
  `is_system` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为系统角色',
  `sort_order` INT DEFAULT 0 COMMENT '排序顺序',
  
  -- 审计字段
  `created_by` VARCHAR(64) COMMENT '创建者ID',
  `updated_by` VARCHAR(64) COMMENT '更新者ID',
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_role_id` (`role_id`),
  UNIQUE KEY `uk_role_code` (`role_code`),
  KEY `idx_role_name` (`role_name`),
  KEY `idx_role_type` (`role_type`),
  KEY `idx_status` (`status`),
  KEY `idx_level` (`level`),
  KEY `idx_parent_role_id` (`parent_role_id`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_role_id: 保证角色ID唯一性
-- uk_role_code: 保证角色代码唯一性
-- idx_role_name: 根据角色名称查询
-- idx_role_type: 根据角色类型查询
-- idx_status: 根据状态查询
-- idx_level: 根据级别查询
-- idx_parent_role_id: 根据父角色查询子角色
-- idx_created_time: 根据创建时间排序
sql
-- =============================================
-- 用户角色关联表(User Roles)
-- 用于管理用户与角色的关系
-- =============================================

CREATE TABLE IF NOT EXISTS `user_roles` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `user_role_id` VARCHAR(64) NOT NULL COMMENT '关联ID(业务主键)',
  `user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
  `role_id` VARCHAR(64) NOT NULL COMMENT '角色ID',
  
  -- 分配信息
  `assignment_type` VARCHAR(32) NOT NULL DEFAULT 'DIRECT' COMMENT '分配类型(DIRECT-直接, INHERITED-继承, TEMPORARY-临时)',
  `assignment_source` VARCHAR(32) NOT NULL DEFAULT 'ADMIN' COMMENT '分配来源(ADMIN-管理员, SYSTEM-系统, AUTO-自动, PROMOTION-晋升)',
  `assignment_reason` VARCHAR(500) COMMENT '分配原因',
  `assigned_by` VARCHAR(64) COMMENT '分配者ID',
  
  -- 有效期
  `effective_from` DATETIME NOT NULL COMMENT '生效时间',
  `effective_to` DATETIME COMMENT '失效时间',
  
  -- 状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '关联状态(ACTIVE-激活, INACTIVE-未激活, EXPIRED-已过期, REVOKED-已撤销)',
  `is_primary` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为主要角色',
  
  -- 撤销信息
  `revoked_by` VARCHAR(64) COMMENT '撤销者ID',
  `revoked_at` DATETIME COMMENT '撤销时间',
  `revoke_reason` VARCHAR(500) COMMENT '撤销原因',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_role_id` (`user_role_id`),
  UNIQUE KEY `uk_user_role` (`user_id`, `role_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_role_id` (`role_id`),
  KEY `idx_assignment_type` (`assignment_type`),
  KEY `idx_status` (`status`),
  KEY `idx_effective_from` (`effective_from`),
  KEY `idx_effective_to` (`effective_to`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_user_role_id: 保证关联ID唯一性
-- uk_user_role: 保证同一用户的同一角色只有一条记录
-- idx_user_id: 根据用户ID查询角色列表
-- idx_role_id: 根据角色ID查询用户列表
-- idx_assignment_type: 根据分配类型查询
-- idx_status: 根据状态查询
-- idx_effective_from: 根据生效时间查询
-- idx_effective_to: 根据失效时间查询
-- idx_created_time: 根据创建时间排序
sql
-- =============================================
-- 用户会话表(User Sessions)
-- 用于管理用户登录会话信息
-- =============================================

CREATE TABLE IF NOT EXISTS `user_sessions` (
  `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `session_id` VARCHAR(64) NOT NULL COMMENT '会话ID(业务主键)',
  `user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
  
  -- 令牌信息
  `access_token` VARCHAR(500) NOT NULL COMMENT '访问令牌',
  `refresh_token` VARCHAR(500) NOT NULL COMMENT '刷新令牌',
  
  -- 设备信息
  `device_info` VARCHAR(500) COMMENT '设备信息',
  `ip_address` VARCHAR(45) COMMENT 'IP地址',
  `user_agent` VARCHAR(500) COMMENT '用户代理',
  `location` VARCHAR(200) COMMENT '地理位置信息',
  
  -- 会话类型
  `session_type` VARCHAR(32) DEFAULT 'WEB' COMMENT '会话类型(WEB-网页, MOBILE-移动端, API-接口)',
  
  -- 时间信息
  `login_time` DATETIME NOT NULL COMMENT '登录时间',
  `last_active_time` DATETIME NOT NULL COMMENT '最后活跃时间',
  `expires_at` DATETIME NOT NULL COMMENT '过期时间',
  
  -- 会话状态
  `status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '会话状态(ACTIVE-激活, EXPIRED-已过期, REVOKED-已撤销)',
  
  -- 扩展属性
  `attributes` JSON COMMENT '扩展属性(JSON格式)',
  
  -- 审计字段
  `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_session_id` (`session_id`),
  UNIQUE KEY `uk_access_token` (`access_token`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_refresh_token` (`refresh_token`),
  KEY `idx_session_type` (`session_type`),
  KEY `idx_status` (`status`),
  KEY `idx_expires_at` (`expires_at`),
  KEY `idx_last_active_time` (`last_active_time`),
  KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会话表';

-- =============================================
-- 索引说明
-- =============================================
-- uk_session_id: 保证会话ID唯一性
-- uk_access_token: 保证访问令牌唯一性
-- idx_user_id: 根据用户ID查询会话列表
-- idx_refresh_token: 根据刷新令牌查询
-- idx_session_type: 根据会话类型查询
-- idx_status: 根据状态查询
-- idx_expires_at: 根据过期时间查询
-- idx_last_active_time: 根据最后活跃时间排序
-- idx_created_time: 根据创建时间排序

数据库建表 SQL 文件说明

本目录包含 Tour Mate Platform 项目的所有数据库建表 SQL 脚本。

📋 文件列表

核心业务表

  1. create_users_table.sql - 用户表

    • 存储用户基础信息、微信登录信息、个人资料等
    • 已存在,包含完整的用户信息字段
  2. create_activities_table.sql - 活动表 ✨ NEW

    • 存储活动核心信息(标题、描述、位置、时间)
    • 支持费用类型(免费、付费、AA制、赞助)
    • 活动状态管理(草稿、已发布、进行中、已完成、已取消)
  3. create_activity_members_table.sql - 活动成员表 ✨ NEW

    • 记录用户参与活动的信息
    • 成员角色(创建者、普通成员)
    • 加入状态(待审核、已通过、已拒绝、已退出)

聊天模块表

  1. create_chat_rooms_table.sql - 聊天室表 ✨ NEW

    • 支持私聊、群聊、活动群聊
    • 记录最后消息信息
    • 聊天室状态管理
  2. create_chat_members_table.sql - 聊天成员表 ✨ NEW

    • 记录聊天室成员信息
    • 成员角色(群主、管理员、普通成员)
    • 未读消息统计、禁言管理
  3. create_messages_table.sql - 消息表 ✨ NEW

    • 支持多种消息类型(文字、图片、语音、视频、系统消息)
    • 消息状态跟踪(已发送、已送达、已读、已删除)
    • 媒体文件 URL 存储

内容模块表

  1. create_posts_table.sql - 帖子表 ✨ NEW

    • 支持多种帖子类型(纯文字、图片、视频、混合)
    • 位置标签、话题标签
    • 互动统计(点赞、评论、转发、浏览)
    • 审核状态管理
  2. create_comments_table.sql - 评论表 ✨ NEW

    • 支持评论和回复
    • 点赞数、回复数统计
    • 评论状态(待审核、已通过、已拒绝、已删除)
  3. create_likes_table.sql - 点赞表 ✨ NEW

    • 统一管理帖子和评论的点赞
    • 点赞状态(有效、已取消)
    • 防止重复点赞

匹配模块表

  1. create_match_requests_table.sql - 搭子匹配请求表 ✨ NEW

    • 出行计划信息
    • 匹配条件(性别、年龄、兴趣、距离)
    • 匹配状态(活跃、暂停、已完成、已取消)
  2. create_match_results_table.sql - 匹配结果表 ✨ NEW

    • 匹配分数(0-100)
    • 匹配类型(活动搭子、旅行搭子、兴趣搭子)
    • 相似度详情、推荐权重
    • 匹配状态(待处理、已接受、已拒绝、已过期)
  3. create_user_preferences_table.sql - 用户偏好表 ✨ NEW

    • 年龄、性别、地区、兴趣偏好
    • 预算、距离偏好
    • 智能推荐设置、黑名单管理
  4. create_user_interests_table.sql - 用户兴趣表 ✨ NEW

    • 兴趣标签(旅游、爬山、美食、摄影等)
    • 兴趣等级(一般、喜欢、热爱)

安全模块表

  1. create_roles_table.sql - 角色表 ✨ NEW

    • 角色类型(系统、业务、自定义)
    • 角色级别(1-10)
    • 权限列表、角色层级
  2. create_user_roles_table.sql - 用户角色关联表 ✨ NEW

    • 分配类型(直接、继承、临时)
    • 有效期管理
    • 撤销记录
  3. create_user_sessions_table.sql - 用户会话表 ✨ NEW

    • 访问令牌、刷新令牌
    • 设备信息、IP地址
    • 会话类型(网页、移动端、接口)
    • 会话状态(激活、已过期、已撤销)

系统表

  1. domain_event_record_table.sql - 领域事件记录表

    • Transactional Outbox 模式
    • 事件发布状态、重试机制
  2. saga_state_table.sql - Saga 状态表

    • Saga 执行状态跟踪
    • 支持断点续传和故障恢复
  3. wechat_login_migration.sql - 微信登录迁移脚本

    • 为用户表添加微信登录字段

🎯 设计规范

命名规范

  • 表名:小写 + 下划线,复数形式(如 activities, chat_rooms
  • 字段名:小写 + 下划线(如 user_id, created_time
  • 索引名:
    • 唯一索引:uk_字段名(如 uk_activity_id
    • 普通索引:idx_字段名(如 idx_user_id
    • 复合索引:idx_字段1_字段2(如 idx_status_start_time

字段规范

  • 主键id BIGINT AUTO_INCREMENT - 数据库主键
  • 业务主键xxx_id VARCHAR(64) - 业务唯一标识,添加唯一索引
  • 状态字段:使用 VARCHAR(32) 存储枚举值(如 ACTIVE, PENDING
  • 时间字段:使用 DATETIME 类型
  • 金额字段:使用 DECIMAL(10, 2) 类型
  • JSON 字段:使用 JSON 类型存储复杂数据

审计字段(标准配置)

sql
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',

可选审计字段

sql
`created_by` VARCHAR(64) COMMENT '创建者',
`updated_by` VARCHAR(64) COMMENT '更新者',
`version` INT NOT NULL DEFAULT 0 COMMENT '版本号(乐观锁)',

索引设计原则

  1. 唯一索引:业务主键必须添加唯一索引
  2. 外键索引:关联字段必须添加索引(如 user_id, activity_id
  3. 状态索引:状态字段添加索引,支持按状态查询
  4. 时间索引:时间字段添加索引,支持排序和范围查询
  5. 复合索引:常见查询组合添加复合索引(如 status + created_time

📊 表关系说明

活动模块

activities (活动表)
  ├─ activity_members (活动成员表) - 1:N
  └─ chat_rooms (聊天室表) - 1:1 (活动群聊)

聊天模块

chat_rooms (聊天室表)
  ├─ chat_members (聊天成员表) - 1:N
  └─ messages (消息表) - 1:N

内容模块

posts (帖子表)
  ├─ comments (评论表) - 1:N
  └─ likes (点赞表) - 1:N

comments (评论表)
  └─ likes (点赞表) - 1:N

匹配模块

match_requests (匹配请求表)
  └─ match_results (匹配结果表) - 1:N

users (用户表)
  ├─ user_preferences (用户偏好表) - 1:1
  └─ user_interests (用户兴趣表) - 1:N

安全模块

roles (角色表)
  └─ user_roles (用户角色关联表) - 1:N

users (用户表)
  ├─ user_roles (用户角色关联表) - 1:N
  └─ user_sessions (用户会话表) - 1:N

🚀 执行顺序

建议按以下顺序执行 SQL 脚本:

1. 基础表(无外键依赖)

bash
# 用户表
mysql < create_users_table.sql

# 角色表
mysql < create_roles_table.sql

2. 关联表

bash
# 用户相关
mysql < create_user_interests_table.sql
mysql < create_user_preferences_table.sql
mysql < create_user_roles_table.sql
mysql < create_user_sessions_table.sql

# 活动相关
mysql < create_activities_table.sql
mysql < create_activity_members_table.sql

# 聊天相关
mysql < create_chat_rooms_table.sql
mysql < create_chat_members_table.sql
mysql < create_messages_table.sql

# 内容相关
mysql < create_posts_table.sql
mysql < create_comments_table.sql
mysql < create_likes_table.sql

# 匹配相关
mysql < create_match_requests_table.sql
mysql < create_match_results_table.sql

3. 系统表

bash
# 事件和 Saga
mysql < domain_event_record_table.sql
mysql < saga_state_table.sql

📝 注意事项

  1. 字符集:所有表使用 utf8mb4 字符集,支持 emoji 和特殊字符
  2. 引擎:使用 InnoDB 引擎,支持事务和外键
  3. 排序规则:使用 utf8mb4_unicode_ci 排序规则
  4. JSON 字段:需要 MySQL 5.7.8+ 版本支持
  5. 索引优化:根据实际查询情况调整索引,避免过多索引影响写入性能

🔧 维护建议

  1. 定期备份:每天备份数据库
  2. 监控慢查询:开启慢查询日志,优化慢 SQL
  3. 索引优化:定期分析索引使用情况,删除无用索引
  4. 数据归档:定期归档历史数据(如已删除的消息、过期的会话)
  5. 性能监控:监控表大小、查询性能、锁等待等指标

📚 相关文档


生成时间: 2025-12-31
版本: 1.0
作者: AI Assistant

📊 生成的 SQL 文件汇总

我根据你的 Entity 对象和现有 SQL 规范,共生成了 16 个新的建表 SQL 文件:

🎯 活动模块(2个)

  1. ✅ create_activities_table.sql - 活动表

  2. ✅ create_activity_members_table.sql - 活动成员表

💬 聊天模块(3个)

  1. ✅ create_chat_rooms_table.sql - 聊天室表

  2. ✅ create_chat_members_table.sql - 聊天成员表

  3. ✅ create_messages_table.sql - 消息表

📝 内容模块(3个)

  1. ✅ create_posts_table.sql - 帖子表

  2. ✅ create_comments_table.sql - 评论表

  3. ✅ create_likes_table.sql - 点赞表

🤝 匹配模块(4个)

  1. ✅ create_match_requests_table.sql - 匹配请求表

  2. ✅ create_match_results_table.sql - 匹配结果表

  3. ✅ create_user_preferences_table.sql - 用户偏好表

  4. ✅ create_user_interests_table.sql - 用户兴趣表

🔐 安全模块(3个)

  1. ✅ create_roles_table.sql - 角色表

  2. ✅ create_user_roles_table.sql - 用户角色关联表

  3. ✅ create_user_sessions_table.sql - 用户会话表

📚 文档(1个)

  1. ✅ README.md - 完整的说明文档

🎨 设计亮点

1. 严格遵循现有规范

  • 字符集:utf8mb4 + utf8mb4_unicode_ci

  • 引擎:InnoDB

  • 时间字段:DATETIME + 自动更新

  • 注释:每个字段都有详细的中文注释

2. 完善的索引设计

  • 业务主键唯一索引(uk_xxx_id)

  • 外键关联索引(idx_user_id, idx_activity_id)

  • 状态查询索引(idx_status)

  • 时间排序索引(idx_created_time)

  • 复合索引(idx_status_created_time)

3. DDD 领域模型映射

  • 完全对应你的 Entity 对象字段

  • 保留了值对象的扁平化存储(如 Location → location_name, location_latitude)

  • JSON 字段存储复杂数据(tags, permissions, attributes)

4. 业务状态管理

  • 活动状态:DRAFT → PUBLISHED → IN_PROGRESS → COMPLETED/CANCELLED

  • 消息状态:SENT → DELIVERED → READ

  • 匹配状态:PENDING → ACCEPTED/REJECTED/EXPIRED

  • 会话状态:ACTIVE → EXPIRED/REVOKED

5. 审计和版本控制

  • 标准审计字段:created_time, updated_time

  • 可选审计字段:created_by, updated_by

  • 乐观锁:version 字段(部分表)

🚀 使用建议

  1. 按顺序执行:先执行基础表(users, roles),再执行关联表

  2. 检查字段:根据实际业务需求调整字段长度和类型

  3. 索引优化:上线后根据慢查询日志优化索引

  4. 数据迁移:如果已有数据,需要编写迁移脚本

Powered by VitePress