文档版本:v1.0 最后更新:2026-04-02 08:28:05
本文档定义本项目业务后端第一版数据库方案。
第一版目标不是一次性覆盖整个平台所有能力,而是先稳定支撑以下范围:
launch 启动与 session_token明确不纳入第一版数据库的能力:
这些能力建议放到后续 migration。
数据库里同时存在两类对象:
两者要分层,不要揉成一个“超级事件表”。
数据库管理的是编辑态与发布关系,客户端运行时最终仍然消费静态发布结果,例如:
manifest_urlmanifest_checksum_sha256不要让客户端在运行时直接拼数据库对象。
业务后端负责:
业务后端不应该成为所有玩法字段的解释器。玩法细节优先放在版本化 jsonb 内容中。
数据库内部主键统一使用 uuid。
对客户端暴露的对象使用稳定 public_id:
user_public_idcompetition_public_idmap_public_idevent_public_idrelease_public_idsession_public_id原因:
以下内容不应明文入库:
数据库只保存 hash。
第一版数据库建议拆成 6 组:
tenants平台租户。
建议字段:
idtenant_codenamestatustheme_jsonbsettings_jsonbcreated_atupdated_at说明:
theme_jsonb 存白标主题settings_jsonb 存租户级开关clubs租户下的俱乐部或品牌实体。
建议字段:
idtenant_idclub_codenamestatusprofile_jsonbcreated_atupdated_at说明:
app_users平台用户主表。
建议字段:
iduser_public_iddefault_tenant_idstatusnicknameavatar_urllast_login_atcreated_atupdated_atlogin_identities登录身份绑定表。
建议字段:
iduser_ididentity_typeproviderprovider_subjectcountry_codemobilestatusprofile_jsonbcreated_atupdated_at身份示例:
openidunionidclient_devices客户端设备标识记录。
建议字段:
iddevice_keyplatformfirst_seen_atlast_seen_atmeta_jsonb说明:
device_key 对应前端 device_idauth_sms_codes短信验证码发送与校验记录。
建议字段:
idscenecountry_codemobileclient_typedevice_keycode_hashprovider_payload_jsonbexpires_atcooldown_untilconsumed_atcreated_atauth_refresh_tokens刷新 token 持久化表。
建议字段:
iduser_idclient_typedevice_keytoken_hashissued_atexpires_atrevoked_atreplaced_by_token_iduser_body_profiles用户当前身体档案。
建议字段:
iduser_idstatuscompleted_atcurrent_version_idcreated_atupdated_atuser_body_profile_versions身体档案历史版本。
建议字段:
idprofile_idversion_nogenderbirth_dateheight_cmweight_kgresting_heart_rate_bpmmax_heart_rate_bpmcreated_at这一组直接对应你现有的配置驱动架构。
maps / map_versions地图对象及版本。
主表管理:
map_public_idslugnamestatustenant_idcurrent_version_id版本表管理:
version_nocontent_jsonbcreated_atplayfields / playfield_versions路线、点位、场地定义。
game_modes / game_mode_versions玩法模式配置,例如:
classic-sequentialscore-oresource_packs / resource_pack_versions资源包,例如:
events / event_versionsEvent 本身与版本。
建议:
events 管对象身份event_versions 管编辑态装配结果event_versions 推荐显式引用:
map_version_idplayfield_version_idgame_mode_version_idresource_pack_version_id同时保留:
content_jsonb这样既有强关系,又保留灵活字段。
event_releases发布记录表。
建议字段:
idrelease_public_idevent_idevent_version_idrelease_nomanifest_urlmanifest_checksum_sha256statuspublished_by_user_idpublished_atpayload_jsonb说明:
events.current_release_id 可指向当前对外生效版本competitions赛事主表。
建议字段:
idcompetition_public_idtenant_idclub_idslugdisplay_namestatusregistration_enabledleaderboard_enabledrealtime_board_enabledcompetition_start_atcompetition_end_atcontent_jsonbcreated_atupdated_atcompetition_events赛事与 Event 的关联表。
建议字段:
idcompetition_idevent_idevent_release_idis_defaultsort_orderrelation_statuscreated_at说明:
registrations报名记录。
建议字段:
idregistration_public_idcompetition_iduser_idgroup_idstatusform_payload_jsonbapproved_atcancelled_atcreated_atupdated_at说明:
form_payload_jsonb 足够承接早期变化page_configs / page_config_versionsH5 / 白标页面配置。
主表建议字段:
idtenant_idclub_idpage_codenamestatuscurrent_version_idcreated_atupdated_at版本表建议字段:
idpage_config_idversion_nodsl_jsonbtheme_jsonbfeature_flags_jsonbstatuscreated_atcards首页卡片与运营入口。
建议字段:
idcard_public_idtenant_idclub_idcard_typedisplay_namecompetition_idevent_idmap_idpage_config_idhtml_urlcover_urldisplay_slotdisplay_prioritystatusstarts_atends_atcreated_atupdated_at说明:
/cardsgame_sessions游戏启动记录。
建议字段:
idsession_public_idtenant_iduser_idcompetition_idregistration_idevent_idevent_release_idlaunch_request_idparticipant_public_iddevice_keyclient_typeroute_codestatussession_token_hashsession_token_expires_atrealtime_endpointrealtime_token_hashlaunched_atstarted_atended_atcreated_atupdated_at说明:
launch 即可session_token 用于后续 session 相关接口开放后继续扩展launch_request_id 需要唯一,支撑幂等POST /auth/sms/send写:
auth_sms_codesPOST /auth/login/sms读写:
auth_sms_codesapp_userslogin_identitiesuser_body_profilesuser_body_profile_versionsauth_refresh_tokensPOST /auth/login/wechat读写:
app_userslogin_identitiesuser_body_profilesuser_body_profile_versionsauth_refresh_tokensPOST /auth/refresh读写:
auth_refresh_tokensPUT /me/body-profile读写:
user_body_profilesuser_body_profile_versionsGET /cards读:
cardscompetitionsGET /competitions/{competition_id}读:
competitionscompetition_eventseventsevent_releasesregistrationsGET /events/{event_id} / GET /competitions/{competition_id}/events/{event_id}读:
eventsevent_releasesmapscompetitionsregistrationsPOST /competitions/{competition_id}/registrations写:
registrationsPOST /events/{event_id}/launch读写:
eventsevent_releasesregistrations 可选game_sessions以下字段第一版优先用 jsonb,不要先做一堆子表:
原因很简单:
第一版不建议落库:
这些应该仍然留在:
realtime-gateway不应直接压进业务主库。
建议按下面顺序建表:
这样依赖关系最清晰。
建议后续 migration 再补:
orderspayment_transactionsrefundsugc_assetsugc_postsugc_reviewssession_uploadssession_resultsgps_tracksheart_rate_streamschannel_entriescampaigns如果你现在准备开始做后端,我建议不要先写所有 API,而是按这个顺序开工:
第一版数据库应该同时支撑两件事:
但不能把它们混成一套随意增长的表结构。
正确方向是:
PostgreSQL 存业务状态 + 版本化配置对象,Go API 负责查询与发布编排,客户端继续消费发布后的运行态配置。