本文档用于冻结当前版本的核心实体与关系,避免在实现阶段反复改表。
目标不是一次定义所有字段,而是先稳定:
- 哪些实体一定存在
- 实体之间如何关联
- 认证、业务数据、媒体数据如何分层
- 主键统一使用
UUID - 核心表统一带
created_at与updated_at - 公开路由使用
slug,关系引用使用内部id - 业务授权与认证表分离
- 文件二进制不进入
PostgreSQL - 对公开实体尽量使用状态流转代替硬删除
Better Auth users
-> staff_accounts
staff_accounts
-> staff_role_bindings
-> audit_logs
roles
-> role_permission_bindings
branches
-> branch_board_members
-> members
-> events
-> join_applications
members
-> branch_board_members (optional reference)
-> event_registrations (optional member linkage)
articles
-> assets
events
-> event_agenda_items
-> event_registrations
-> assets
join_applications
-> branches
site_pages / homepage_sections
-> assets
认证系统负责以下概念性表:
usersaccountssessionsverifications
它们回答的是:
- 用户是谁
- 用户用什么方式登录
- 用户当前是否持有有效会话
当前平台自己负责:
- 成员身份
- 工作人员资格
- 角色权限
- 分会与董事会
- 成员资料
- 文章
- 活动与报名
- 加入申请
- 页面内容
- 资源元数据
- 审计日志
表示哪些 users 可以进入后台。
建议字段:
iduser_idstatusdisplay_namenotesnullablelast_login_atnullableinvited_by_staff_idnullableinvited_atnullableactivated_atnullablecreated_atupdated_at
建议状态:
invitedactivesuspendeddisabled
建议字段:
idcodenamedescriptionis_systemcreated_atupdated_at
建议字段:
idcodenameresourceactioncreated_atupdated_at
建议字段:
idstaff_account_idrole_idcreated_at
建议字段:
idrole_idpermission_idcreated_at
存放全站级的基础配置。
建议字段:
idsite_nametaglinesupport_emailfooter_textheader_nav_jsonfooter_nav_jsonupdated_by_staff_idcreated_atupdated_at
用于管理首页的结构化区块,而不是把首页当成一篇普通文章。
建议字段:
idsection_keytitlepayload_jsonsort_orderis_enabledupdated_by_staff_idcreated_atupdated_at
建议 section_key:
herointroaudiencemetricsfeatured_eventsfeatured_articlesjoin_cta
用于管理单页型内容。
当前至少需要:
joinabout
建议字段:
idslugtitlesummarybody_richtextfaq_jsonnullableseo_titlenullableseo_descriptionnullablestatuspublished_atnullableupdated_by_staff_idcreated_atupdated_at
branches 是当前版本替代旧 cities 的主实体。
它同时承担:
- 分会展示
- 活动城市筛选维度
- 成员归属维度
- 申请归属维度
建议字段:
idslugnamecity_nameregionsummarybody_richtextnullablecover_asset_idnullablestatusseo_titlenullableseo_descriptionnullablesort_orderpublished_atnullablecreated_atupdated_at
建议状态:
draftpublishedarchived
用于展示分会董事会成员。
设计上建议允许“引用成员”或“快照字段”两种模式并存:
- 如果董事会成员就是平台成员,可关联
member_id - 如果需要独立展示,也可直接存快照字段
建议字段:
idbranch_idmember_idnullabledisplay_namecompanytitlebionullableavatar_asset_idnullablesort_orderstatuscreated_atupdated_at
members 是业务上的正式成员身份。
它与工作人员后台角色不是一个概念,并且当前版本按完全分离建模处理。
建议字段:
idslugnamecompanytitlebiojoined_atbranch_idnullableavatar_asset_idnullablefeaturedbooleanmembership_statusvisibilitysort_orderseo_titlenullableseo_descriptionnullablecreated_atupdated_at
建议可见性:
publichiddenarchived
建议成员身份状态:
activeinactivealumnipending_activation
说明:
- 成员列表展示公开字段
- 成员详情页读取更完整简介与加入时间
visibility决定公开展示范围membership_status决定其是否是有效成员- 当前不默认把成员绑定到工作人员认证用户
- 如果未来成员认证真的需要上线,应单独设计成员认证绑定模型,而不是直接复用工作人员结构
建议字段:
idslugtitleexcerptbody_richtextcover_asset_idnullableauthor_nameauthor_bionullablestatusseo_titlenullableseo_descriptionnullablescheduled_atnullablepublished_atnullablecreated_by_staff_idupdated_by_staff_idcreated_atupdated_at
建议状态:
draftscheduledpublishedarchived
建议字段:
idslugtitlesummarybody_richtextbranch_idcity_namevenue_nameaddressstart_atend_atregistration_statecapacitynullablecover_asset_idnullableexternal_registration_urlnullablestatusseo_titlenullableseo_descriptionnullablepublished_atnullablecreated_by_staff_idupdated_by_staff_idcreated_atupdated_at
建议 registration_state:
closedopenwaitlistexternal
建议 status:
draftpublishedarchived
如果活动详情需要展示议程,建议使用结构化子表。
建议字段:
idevent_idstart_atend_attitlespeaker_namenullablespeaker_titlenullabledescriptionnullablesort_ordercreated_atupdated_at
建议字段:
idevent_idmatched_member_idnullablenamephone_numberwechat_idnullableemailnullablecompanynullabletitlenullablenotenullablestatusreview_notesnullablereviewed_by_staff_idnullablereviewed_atnullablesubmitted_ipnullablesubmitted_user_agentnullablecreated_atupdated_at
建议状态:
pendingapprovedrejectedwaitlistedcancelled
说明:
- 当前阶段活动采用开放报名
- 工作人员可在审核过程中把报名记录与某个成员做人工匹配,因此保留
matched_member_id - 这样可以支持“开放提交、后台确认”的运营方式
当前申请表字段必须覆盖用户要求的 6 个必填项。
建议字段:
iduser_idnullablenamephone_numberwechat_idemailintroductionapplication_messagetarget_branch_idnullablesource_channelnullablestatusreview_notesnullablereviewed_by_staff_idnullablereviewed_atnullablesubmitted_ipnullablesubmitted_user_agentnullablecreated_atupdated_at
建议状态:
pendingunder_reviewapprovedrejectedarchived
当前阶段不强制拆出独立的面试、推荐人、缴费记录等子表。 如果未来流程变复杂,再基于该表向外扩展。
补充说明:
- 非成员可以匿名提交加入申请,因此
user_id可以为空 - 如果申请人先注册了账号,再提交申请,则可回填
user_id - 申请通过后,可以创建或关联
members记录
用于保存对象存储文件的元数据。
建议字段:
idstorage_providerbucketobject_keyvisibilityasset_typemime_typebyte_sizewidthnullableheightnullableoriginal_filenamealt_textnullableuploaded_by_staff_idstatuscreated_atupdated_at
后续可用来追踪资源引用关系。
建议字段:
idasset_identity_typeentity_idusage_typecreated_at
记录后台敏感操作。
建议字段:
idactor_staff_idactiontarget_typetarget_idrequest_idip_addressnullableuser_agentnullablebefore_jsonnullableafter_jsonnullableresultcreated_at
至少需要:
branches.slug唯一索引members.slug唯一索引articles.slug唯一索引events.slug唯一索引site_pages.slug唯一索引staff_accounts.user_id唯一索引roles.code唯一索引permissions.code唯一索引branch_board_members(branch_id, sort_order)组合索引members(branch_id, sort_order)组合索引events(branch_id, start_at)组合索引join_applications(status, created_at)组合索引event_registrations(event_id, status, created_at)组合索引
在真正改库前,需要把以下结论视为当前版本默认方案:
branches取代旧cities成为对外主组织维度members与staff_accounts完全分开建模- “成员身份”与“工作人员角色”是两套概念,不能混用
users当前主要服务于工作人员认证,不默认映射到membersjoin_applications先做单表审核,不做复杂拆分- 首页采用结构化区块,而不是把首页做成单篇富文本
join与about使用单页模型管理