Database Schema

数据表设计

全部表按八个业务域组织,采用 MySQL 8.4 语法(InnoDB + utf8mb4_0900_ai_ci + datetime(3) + 原生 JSON)。每张表给出字段类型、约束、索引与设计说明,并对关键取舍(冗余、软删除、JSON 边界、物化路径、菜单树结构)逐条解释。这些约定在写第一张表时就应统一,事后调整的代价极高。

数据表
53 张
字段总数
433 个
业务域
8 个
设计约定
8 条

实体关系全貌

按业务域分列展示 24 张核心表及其外键关联。悬停任一实体可高亮其全部关联边,并显示关系基数。

核心实体关系图(ER)
悬停任一实体,高亮其全部关联
用户域社区域菜单域内容域评论与互动域治理与平台域users用户id PKusername UQtrust_levelpost_karmauser_profiles用户资料user_id PK/FKavatar_urlbiolinksuser_sessions登录会话id PKuser_id FKfamily_idexpires_atoauth_accounts三方绑定id PKuser_id FKproviderprovider_uidcommunities社区id PKslug UQowner_id FKtheme_colorcommunity_rules社区规则id PKcommunity_id FKpositiontitlecommunity_moderators版主community_id PKuser_id PKpermissionsrolesubscriptions订阅关系id PKuser_id FKtarget_typetarget_idcommunity_menu_items菜单树id PKparent_id FKslug UQdepthcommunity_menu_appsslug 注册表id PKslug UQcomponentpage_typepagesslug 页面id PKslug UQpage_typestatusoutbox_events事件发件箱id PKevent_typestatusavailable_atposts帖子id PKcommunity_id FKauthor_id FKhot_scorepost_media帖子媒体id PKpost_id FKmedia_id FKpositionpost_polls投票帖post_id PK/FKallow_multipleends_attotal_votestags标签id PKname UQusage_countis_officialcomments评论id PKpost_id FKparent_id FKpathcomment_votes评论投票user_id PKcomment_id PKvalueweightvotes帖子投票user_id PKpost_id PKvalueweightsaved_items收藏id PKuser_id FKtarget_typefolder_idreports举报id PKreporter_id FKtarget_typestatusmod_actions管理日志id PKmoderator_id FKactionreasonbans封禁id PKuser_id FKscopeexpires_atnotifications通知id PKuser_id FKtyperead_at

八条全局设计约定

这些约定适用于所有表,是数据层保持一致性的基础。

主键策略

全库统一使用 BIGINT 雪花 ID。相比自增 ID,雪花 ID 趋势递增(保证 B+ 树写入性能)且可在分布式环境下本地生成,无需中心化发号。对外暴露时用 hashid 混淆,避免被枚举。

时间字段

全部使用 datetime(3)(毫秒精度),统一以 UTC 存储,展示时按 Asia/Shanghai 转换。每张表必备 created_at / updated_at,updated_at 用 ON UPDATE CURRENT_TIMESTAMP(3) 自动维护。

软删除

deleted_at 为 NULL 表示未删除。社区类产品必须软删除,因为删除帖子会破坏评论上下文。物理清理由定时任务在冷静期后执行。

计数冗余

member_count、comment_count、score 等计数一律冗余存储 + Redis 增量维护,禁止在列表查询中做实时 COUNT(*)。冗余值由定时任务校正。

JSON 的边界

只用于「整体读写、不参与过滤排序」的小集合,如 user_settings.notify_prefs、outbox_events.payload、pages.toc。凡需要按内部字段查询的,一律拆列或拆表 —— MySQL 的 JSON 函数索引可用但代价不低,不要滥用在核心查询路径上。

索引原则

每个列表查询都应有对应的复合索引,且遵循最左前缀。索引顺序按「等值条件 → 范围条件 → 排序字段」排列。写入密集的 votes 表需控制索引数量。

位掩码权限

community_moderators.permissions 用整型位掩码存储(1=删帖 2=封禁 4=加精…),判定时按位与运算,避免为每种权限建列或建关联表。

物化路径

comments.path 与 community_menu_items.path 存储形如 /1024/2048/ 的祖先路径,使「取整棵子树」退化为一次前缀查询。评论树与菜单树几乎不发生子树移动,是该结构的最佳适用场景。

数据表清单

共 53 张表。点击任一行展开完整字段定义;也可用下方搜索框按表名或字段名定位。

用户域

身份、凭证、会话、资料、设置7 张

社区域

社区、规则、版主、订阅5 张

内容域

帖子、修订、媒体、投票帖10 张

评论域

评论树、评论投票、提及3 张

互动域

投票、收藏、关注、私信、签到8 张

治理域

举报、管理动作、封禁、申诉6 张

菜单域

社区菜单树、slug 页面注册表、通用页面内容3 张

平台域

通知、搜索、开放平台、导出11 张