# TDD-04 数据库表结构设计 > 文档类型:技术设计文档(Technical Design Document) > 版本:1.5 > 日期:2026-07-06 > 关联文档:TDD-00 技术栈与架构、GDD-00~GDD-21 相关系统设计 --- ## 1. 文档信息 | 项目 | 说明 | |------|------| | 目标 | 为挂机手游《洪荒大陆》服务端定义 PostgreSQL 16 数据库表结构,覆盖角色、种族、境界、功法技能、物品经济、市场拍卖、组织、弟子、悬赏、地图副本、战斗、渡劫、社交、配置与审计等模块。 | | 读者 | 服务端开发、数值策划、运维、测试 | | 数据库 | PostgreSQL 16(主库),pg_partman 分区扩展 | | 缓存/外部 | Valkey(玩家在线热数据)、Nakama(账户/社交/匹配)、Nacos(动态配置) | | 命名约定 | 小写下划线;表名复数;主键 `uuid`;字段用 `small_snake_case`;布尔用 `is_`/`has_` 前缀;金额用 `numeric(20,4)`;JSONB 用于随机/引擎生成/战报/动态配置数据。 | --- ## 2. 数据库选型 - **PostgreSQL 16**:支持 `jsonb`、`range`、`partition`、`BRIN`、`GIN` 索引,满足功法/技能/战报等半结构化数据存储。 - **pg_partman**:用于 `battle_logs`、`market_orders`、`economy_audit_logs` 等按时间分区的大表。 - **Valkey**:承载在线角色快照、排行榜、会话;DB 作为持久化事实源。 - **Nacos**:存储热更数值参数,服务端通过配置中心读取,DB 仅保留历史快照与灰度记录。 --- ## 3. 设计原则与约定 | 原则 | 说明 | |------|------| | **事实源单一** | 角色、经济、组织、关系等以 PostgreSQL 为唯一事实源;Valkey/Nakama 为缓存/投影。 | | **境界/世界层级隔离** | 排行榜、市场、PVP 匹配统一按 `realm_tier` + `minor_realm`(或 `world_tier`)隔离。 | | **JSONB 用于随机/引擎数据** | 功法实例、技能实例、装备随机词条、建筑等级、战报、地图组件配置等用 JSONB,避免表爆炸。 | | **经济审计** | 所有货币产出/消耗写入 `economy_audit_logs`,按 faucet/sink 分类,支持实时通胀监控。 | | **软删除/状态机** | 角色、组织、市场订单、悬赏等用 `status` 字段驱动生命周期,避免物理删除。 | | **时间统一** | 数据库使用 `timestamptz` 存现实时间;游戏内时间 = 现实时间 × 3,由应用层计算。每日重置锚点 08:00(现实时间)。 | --- ## 4. ER 概览 ``` players ──1:N── characters ──1:1── character_race_states │ ├── N:M ── currency_balances ├── N:M ── inventories / equipments ├── N:M ── character_manuals / character_skills ├── 1:N ── battles / battle_logs / tribulation_records / economy_audit_logs ├── 1:N ── market_orders / auctions / intelligence_orders ├── 1:N ── social_relations / lovers / sworn_brothers ├── N:M ── guild_members (guilds) │ guilds ──1:N── guild_territories / guild_diplomacy / guild_warehouses / disciples world_layers ──1:N── maps ──1:N── regions ──1:N── zones ──1:N── zone_explorations / instances instances ──1:N── instance_runs ──1:N── instance_loot contracts ──1:1── bounties (when contract_type='bounty') contracts ──1:N── contract_participants bounties ──1:0..1── manhunt_records ``` --- ## 5. 核心数据表设计 ### 5.0 表名速查(按需求清单) | 需求表名 | 本文表名 | 说明 | |----------|---------|------| | players / characters | `players` / `characters` | 玩家账号与角色 | | character_race_states | `character_race_states` | 角色种族状态 | | realms / character_realms | `realms` / `character_realms` | 境界静态配置与角色境界进度 | | manuals / character_manuals | `manuals` / `character_manuals` | 功法模板与角色功法实例 | | skills / character_skills | `skills` / `character_skills` | 技能模板与角色技能实例 | | items / inventories / equipments | `items` / `inventories` / `equipments` | 物品模板、背包、装备槽 | | currencies / currency_balances | `currencies` / `currency_balances` | 货币定义与角色钱包 | | market_orders / auctions / auction_bids | `market_orders` / `auctions` / `auction_bids` | 交易行与拍卖 | | guilds / guild_members / guild_territories | `guilds` / `guild_members` / `guild_territories` | 四组织(门派/帮派/家族/玩家宗门)统一表 | | disciples / disciple_missions | `disciples` / `disciple_missions` | NPC 弟子与代派委托 | | bounties / contracts | `bounties` / `contracts` | 悬赏追杀与佣兵委托 | | maps / zones / instances | `maps` / `zones` / `instances` | 世界地图、区域、副本入口 | | battles / battle_logs | `battles` / `battle_logs` | 战斗头与战报日志 | | tribulation_records | `tribulation_records` | 渡劫记录 | | social_relations / lovers / sworn_brothers | `social_relations` / `lovers` / `sworn_brothers` | 社交关系链 | | intelligence_orders | `intelligence_orders` | 天机阁情报订单 | --- ### 5.1 账号与角色 #### players | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 玩家账户唯一 ID | | nakama_user_id | uuid | UQ | Nakama 账户映射 | | platform | varchar(32) | | ios / android / pc / guest | | device_id_hash | varchar(128) | UQ, nullable | 设备指纹哈希 | | status | varchar(16) | | active / banned / deleted | | created_at | timestamptz | | 创建时间 | | updated_at | timestamptz | | 更新时间 | #### characters | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 角色唯一 ID | | player_id | uuid | FK → players.id, IX | 所属玩家 | | name | varchar(64) | UQ | 角色名 | | race_id | varchar(32) | IX | 当前种族(见 GDD-01) | | birth_race_id | varchar(32) | | 创建时种族 | | birth_world_tier | smallint | | 出生地世界层级(1~5) | | world_tier | smallint | IX | 当前世界层级(1~5,对应 GDD-18 五层世界 ✅136) | | realm_tier | smallint | IX | 当前大境界(1~9,炼气~飞升,✅116) | | minor_realm | smallint | IX | 小境界(1~3:初期/中期/圆满) | | realm_status | varchar(16) | | normal / tribulation_pending / breakthrough_ready | | energy_current | bigint | | 能量当前值(可消耗,战斗/生产/仪式扣减,见 GDD-23 §2.3) | | energy_cap | bigint | | 能量上限值(随时间持续增长=境界进度,不可消耗;不存在独立"经验值/内力"字段,✅158) | | energy_cap_ceiling | bigint | | 当前小境界目标阈值(由 GDD-23 §2.2 公式计算,达到 energy_cap≥此值时按概率触发顿悟) | | status | varchar(16) | IX | active / dead / sealed / deleted | | base_stats | jsonb | | {力,体,悟,速,灵,命,血} 基础值 | | battle_stats | jsonb | | 战斗属性快照(ATB 用) | | san_current | smallint | | 当前 SAN(0~100) | | san_max | smallint | | SAN 上限 | | crime_score | int | IX | 罪孽值 | | heavenly_value | int | | 天道值 | | karma_value | int | | 业力/戾气值(追杀令来源) | | reputation_score | int | | 声望口碑(GDD-16) | | mercenary_score | int | | 佣兵信用分(GDD-13) | | hunter_prestige | int | | 猎人威望(GDD-14) | | last_online_at | timestamptz | IX | 最后在线时间 | | daily_reset_at | timestamptz | | 个人每日 08:00 重置标记 | | created_at | timestamptz | | 创建时间 | | updated_at | timestamptz | | 更新时间 | **注意**:`world_tier` 与 `realm_tier` 在常规流程下对齐(1=炼气/出生地,2=筑基/洪荒主陆…6=合体/混沌之渊深层),但存在“跨界降临”“遗迹投影”等临时状态,两者必须独立存储。 --- ### 5.2 种族与境界状态 #### character_race_states | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | character_id | uuid | PK, FK → characters.id | | | main_race_id | varchar(32) | | 当前主种族 | | sub_branch_id | varchar(32) | | 分支/进化支(如深潜裔分支、妖族血脉分支) | | bloodline_data | jsonb | | {血脉浓度,觉醒度,残响技能,祖地归属,进化路径} | | is_rare_race | boolean | | 是否稀有种族(龙族/混沌裔/巨人族/堕天使裔) | | rebirth_count | smallint | | 转生次数 | | conversion_cooldown_until | timestamptz | | 下次可转化/转生时间 | | race_talents | jsonb | | 已激活种族天赋实例 | | hidden_talents | jsonb | | 隐藏天赋(GDD-10) | | updated_at | timestamptz | | | #### race_currency_wallets 稀有种族/特殊资源专用钱包(GDD-01 种族专属货币)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | character_id | uuid | PK, FK | | | race_currency_code | varchar(32) | PK | 如 `dragon_blood_token`、`chaos_essence` | | amount | numeric(20,4) | | 余额 | | total_earned | numeric(20,4) | | 累计获取(防通胀监控) | | updated_at | timestamptz | | | #### realms 境界静态配置表。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | tier | smallint | PK | 大境界 1~9 | | minor_realm_max | smallint | | 小境界数量(3) | | name | varchar(64) | | 炼气/筑基/金丹/元婴/化神/合体 | | world_tier | smallint | | 对应世界层级 | | main_currency_code | varchar(32) | | 该境界主货币 | | is_tribulation_required | boolean | | 是否需要渡劫突破 | | base_success_rate | numeric(5,4) | | 渡劫基础成功率 | | attr_growth_template | jsonb | | 每小境界属性成长模板 | #### character_realms 角色每个大境界的进度与属性快照。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK, IX | | | realm_tier | smallint | | 大境界 | | max_minor_reached | smallint | | 达到的最高小境界 | | exp_in_tier | bigint | | 当前境界累积修为 | | stats_snapshot | jsonb | | 突破该境界时的属性快照 | | is_current | boolean | IX | 是否为当前境界 | | updated_at | timestamptz | | | #### realm_breakthrough_records | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK, IX | | | from_realm_tier | smallint | | | | to_realm_tier | smallint | | | | from_minor_realm | smallint | | | | to_minor_realm | smallint | | | | is_success | boolean | | 是否突破成功 | | is_break_world_barrier | boolean | | 是否天启(晋级新世界) | | source_world_tier | smallint | | | | target_world_tier | smallint | | | | created_at | timestamptz | IX | | --- ### 5.3 功法、心法与技能实例 #### manuals 功法/心法模板(静态配置,由策划/Nacos 维护)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | varchar(64) | PK | 功法模板 ID | | name | varchar(128) | | 功法名 | | category | varchar(32) | | universal / profession / racial / unique | | domain | varchar(32) | | 剑/体/法/丹/器/阵/神识/血/时/儒/释/道/种族 | | element | varchar(16) | | 火/水/雷/土/木/阴/阳/混沌/none | | alignment | varchar(16) | | light / dark / neutral | | max_layers | smallint | | 最大层数 | | required_race | varchar(32)[] | | 可学习种族白名单 | | required_profession | varchar(32)[] | | 职业要求 | | base_attr | jsonb | | 每级属性成长模板 | | skill_unlock_layers | jsonb | | [{layer, skill_template_id, probability}] | | version | int | | 配置版本 | #### character_manuals | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 实例 ID | | character_id | uuid | FK, IX | | | manual_id | varchar(64) | FK → manuals.id | | | instance_data | jsonb | | {当前层数,熟练度,突破记录,随机属性,隐患状态} | | is_buffing | boolean | IX | 是否设为加持功法 | | buff_data | jsonb | | 加持熟练度/顿悟状态/位阶 | | source_tag | varchar(32) | | ORIGINAL / JADE_SLIP / DISCIPLE / NPC / EVENT | | can_copy_to_jade_slip | boolean | | 是否可拓印为玉简 | | copy_count_left | smallint | | 剩余可拓印次数(超稀有/唯一限制) | | created_at | timestamptz | | | | updated_at | timestamptz | | | #### skills 技能模板/机制库(GDD-17)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | varchar(64) | PK | 技能模板/机制 ID | | name | varchar(128) | | 显示名 | | category | varchar(32) | | universal / profession / racial / unique | | domain | varchar(32) | | | | archetype | varchar(32) | | 强攻/连击/蓄力/范围/控制/DOT/护盾/治疗/… | | element | varchar(16) | | | | alignment | varchar(16) | | | | damage_type | varchar(16) | | physical / magical / true | | scaling_attr | varchar(8) | | 力/体/悟/速/灵/命/血 | | is_eldritch | boolean | | 是否克苏鲁/邪术 | | san_cost | smallint | | | | san_gate | jsonb | | {min, max} 低 SAN 解锁 | | san_scaling | numeric(6,4) | | SAN 缩放系数 | | requirements | jsonb | | {境界,属性,种族,职业,SAN 区间} | | continuous_cost | jsonb | | 持续代价(掉血/掉蓝/掉 SAN/掉产出) | | flow | varchar(32) | | transcript_jade_ok / no_transcript / unique_only | | base_template | jsonb | | ATB 参数/CD/消耗/目标/特效白名单 | | version | int | | | #### character_skills | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 技能实例 ID | | character_id | uuid | FK, IX | | | skill_id | varchar(64) | FK → skills.id | | | custom_name | varchar(128) | | 玩家自定义名(天品+/唯一) | | instance_data | jsonb | | {base_coef, cd, cost, target, effects, enchants, rarity, record} | | source_tag | varchar(32) | | ORIGINAL / JADE_SLIP / DISCIPLE / NPC / EVENT / TEACHING | | proficiency | int | | 熟练度 | | is_unique | boolean | IX | 是否全服唯一技能 | | unique_holder_until | timestamptz | | 唯一技能失传判定时间 | | lineage | jsonb | | 师徒/亲密关系传授谱系(防无限复制) | | created_at | timestamptz | | | | updated_at | timestamptz | | | **说明**:`instance_data` 保存程序化生成结果(GDD-17 附.7 Skill Schema)。唯一技能全服单例通过 `is_unique=true` + 全局持有者校验实现。 --- ### 5.4 物品、装备与经济 #### items 物品模板(静态配置)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | varchar(64) | PK | 物品模板 ID | | name | varchar(128) | | 物品名 | | category | varchar(32) | | 材料/丹药/符箓/装备/玉简/消耗品/任务道具/稀有宝物 | | sub_category | varchar(32) | | 血脉碎片 / 传承功法 / 法宝 / 本命法器 / armor / weapon | | stackable | boolean | | 是否可堆叠 | | max_stack | int | | 最大堆叠数 | | bind_type | varchar(16) | | none / on_pickup / on_equip / account | | world_tier | smallint | | 适用世界层级 | | base_attr_template | jsonb | | 基础属性模板 | | random_affix_pool | jsonb | | 随机词条池 | | script_id | varchar(64) | | 使用脚本/效果 ID | | version | int | | | #### inventories | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK, IX | | | item_id | varchar(64) | FK → items.id | | | slot_type | varchar(16) | | bag / warehouse / mail / auction_escrow | | quantity | int | | 数量(堆叠物) | | instance_data | jsonb | | 随机词条、强化等级、绑定状态、耐久、赃物/血债印标记 | | is_stolen | boolean | | 赃物标记(GDD-14) | | blood_debt_mark | boolean | | 血债印标记 | | can_trade | boolean | | 是否可交易 | | acquired_at | timestamptz | | 获得时间 | | created_at | timestamptz | | | #### equipments | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | character_id | uuid | PK, FK | | | slot_name | varchar(32) | PK | weapon / head / body / hand / foot / accessory1 / accessory2 / life_item | | inventory_id | uuid | FK → inventories.id, nullable | 当前装备 | | updated_at | timestamptz | | | #### currencies 货币定义(静态)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | code | varchar(32) | PK | 货币代码 | | name | varchar(64) | | 货币名 | | world_tier | smallint | | 适用世界层级 | | is_premium | boolean | | 是否充值货币(如鸿蒙紫气) | | exchange_rules | jsonb | | 兑换/税率规则 | #### currency_balances 角色钱包。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | character_id | uuid | PK, FK | | | currency_code | varchar(32) | PK, FK → currencies.code | 铜钱/银两/下品灵石/中品灵石/魂晶/魔晶/仙晶/鸿蒙紫气 等 | | amount | numeric(20,4) | | 余额 | | total_earned | numeric(20,4) | | 累计获取 | | total_spent | numeric(20,4) | | 累计消耗 | | updated_at | timestamptz | | | **注意**:按 GDD-06,层 1~2 主货币为铜钱/银两,层 3 为灵石,层 4+ 为各阵营结晶货币。 #### economy_audit_logs 经济水龙头/下水道审计。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | bigint | PK | 自增/雪花 | | character_id | uuid | FK, IX | 可为系统/组织 | | entity_type | varchar(16) | IX | character / guild / system | | entity_id | uuid | IX | | | currency_code | varchar(32) | IX | | | flow_type | varchar(16) | IX | faucet / sink / transfer | | reason_code | varchar(64) | IX | 枚举:combat_drop / gathering / auction_tax / market_fee / death_penalty / insurance / tribulation / disciple_mission / instance_reward / admin_compensation 等 | | amount | numeric(20,4) | | 正数=产出/转入,负数=消耗/转出 | | balance_after | numeric(20,4) | | 操作后余额 | | related_id | uuid | nullable | 关联订单/战斗/副本 ID | | world_tier | smallint | IX | 发生层级 | | created_at | timestamptz | IX | | **分区**:按 `created_at` 月分区,保留 12 个月。 --- ### 5.5 市场、拍卖与天机阁情报 #### market_orders 交易行挂单(GDD-06)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | seller_id | uuid | FK → characters.id, IX | | | seller_guild_id | uuid | FK → guilds.id, nullable | 势力/帮派代售 | | item_id | varchar(64) | IX | | | inventory_id | uuid | FK → inventories.id | 托管物品 | | currency_code | varchar(32) | IX | 结算货币 | | unit_price | numeric(20,4) | | 单价 | | quantity | int | | 数量 | | total_price | numeric(20,4) | | 总价 | | tax_rate | numeric(5,4) | | 交易税率 | | status | varchar(16) | IX | active / sold / cancelled / expired | | listed_at | timestamptz | IX | | | expired_at | timestamptz | | | | sold_at | timestamptz | | | | buyer_id | uuid | FK → characters.id, nullable | | **分区**:按 `listed_at` 月分区,保留 6 个月。 #### auctions 拍卖(GDD-14)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | seller_id | uuid | FK → characters.id, IX | | | guild_id | uuid | FK → guilds.id, nullable | 势力拍卖归属 | | auction_type | varchar(16) | IX | official / organization | | item_id | varchar(64) | | | | inventory_id | uuid | FK → inventories.id | 托管拍品 | | category | varchar(32) | IX | rare_bloodline / rare_manual / jade_slip / secret_material / artifact / material | | currency_code | varchar(32) | | | | start_price | numeric(20,4) | | 起拍价 | | reserve_price | numeric(20,4) | | 底价 | | min_increment_rate | numeric(5,4) | | 最小加价比例 | | deposit_rate | numeric(5,4) | | 保证金比例 | | tax_rate | numeric(5,4) | | 税率 | | status | varchar(16) | IX | preparing / active / extended / sold / expired / robbed | | started_at | timestamptz | IX | | | ended_at | timestamptz | | | | is_anonymous | boolean | | 卖家匿名 | | access_type | varchar(16) | | public / private | | risk_type | varchar(16) | | 抢劫风险类型:rare_robbable / none | | created_at | timestamptz | | | #### auction_bids | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | auction_id | uuid | FK → auctions.id, IX | | | bidder_id | uuid | FK → characters.id, IX | | | amount | numeric(20,4) | | 出价 | | deposit_paid | numeric(20,4) | | 已缴保证金 | | is_auto_bid | boolean | | 是否自动出价 | | auto_max_amount | numeric(20,4) | | 自动出价上限 | | bid_at | timestamptz | IX | | **分区**:与 `auctions` 对齐,按 `bid_at` 月分区。 #### auction_blacklist_records 势力拍卖黑吃黑记录(GDD-14 §10)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | guild_id | uuid | FK → guilds.id, IX | | | auction_id | uuid | FK → auctions.id | | | is_exposed | boolean | | 是否东窗事发 | | exposed_at | timestamptz | | | | exposure_type | varchar(16) | | report / arbitration / heaven_sense | | punishment_level | smallint | | 1/2/3 | | reputation_delta | int | | | | created_at | timestamptz | | | #### intelligence_orders 天机阁情报订单(GDD-06 第十二章)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | seller_id | uuid | FK → characters.id, IX | | | buyer_id | uuid | FK → characters.id, nullable, IX | | | intel_type | varchar(32) | IX | resource / event / location / bounty_clue / instance_entry / unique_skill_clue | | target_id | uuid | nullable | 情报目标(玩家/区域/副本) | | target_world_tier | smallint | IX | | | content_summary | varchar(256) | | 摘要 | | detail_data | jsonb | | 精确/模糊信息、坐标、概率 | | currency_code | varchar(32) | | | | price | numeric(20,4) | | | | purchase_count | smallint | | 已被购买次数(防膨胀) | | max_purchase | smallint | | 同一份线索最多购买次数 | | status | varchar(16) | IX | active / sold_out / expired | | cooldown_until | timestamptz | | 卖家冷却 | | created_at | timestamptz | IX | | --- ### 5.6 组织(门派/帮派/家族/玩家宗门) #### guilds 四组织统一表(GDD-07 / GDD-16)。表名 `guilds` 为通用组织实体,不特指帮派。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | name | varchar(128) | UQ | 势力名 | | org_type | varchar(16) | IX | system_sect / player_sect / guild / family | | world_tier | smallint | IX | 所在世界层级 | | region_id | uuid | FK → regions.id, nullable | 驻地所在地域 | | zone_id | uuid | FK → zones.id, nullable | 驻地所在区域 | | leader_id | uuid | FK → characters.id | 领主/掌门/族长 | | level | smallint | | 组织等级 | | reputation | int | | 势力声望/声誉 | | member_limit | int | | 成员上限 | | tax_rate | numeric(5,4) | | 势力拍卖/坊市税率(势力拍卖用) | | diplomacy_policy | jsonb | | 结盟/宣战/贸易协定状态 | | building_levels | jsonb | | 各建筑等级与升级进度 | | funds | jsonb | | 各币种组织资金 | | status | varchar(16) | IX | active / dissolved / blacklisted | | created_at | timestamptz | | | | dissolved_at | timestamptz | | | #### guild_members | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | guild_id | uuid | PK, FK | | | character_id | uuid | PK, FK | | | role | varchar(32) | | leader / vice / elder / elder_council / member / disciple_manager | | joined_at | timestamptz | | | | contribution | jsonb | | 各贡献值 | | daily_quota | jsonb | | 今日代挂/委托时长配额 | | updated_at | timestamptz | | | #### guild_territories | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | guild_id | uuid | FK, IX | | | territory_type | varchar(32) | | 炼丹房/炼器室/藏经阁/练功房/坊市/拍卖行/祖地祭坛/领地核心 | | level | smallint | | | | upgrade_progress | jsonb | | 升级材料/进度 | | params | jsonb | | 建筑产出参数 | | updated_at | timestamptz | | | #### guild_diplomacy | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | guild_a_id | uuid | FK → guilds.id, IX | | | guild_b_id | uuid | FK → guilds.id, IX | | | relation | varchar(16) | IX | allied / at_war / trade / betrayed_cooldown | | started_at | timestamptz | | | | ended_at | timestamptz | nullable | | #### guild_warehouses | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | guild_id | uuid | FK, IX | | | inventory_id | uuid | FK → inventories.id | 物品实例 | | deposited_by | uuid | FK → characters.id | | | deposit_type | varchar(16) | | common / tribute / black_eat | | created_at | timestamptz | | | --- ### 5.7 弟子系统 #### disciples NPC 弟子(GDD-07),与玩家师徒关系(GDD-16)区分。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | owner_id | uuid | FK → characters.id, IX | 所属玩家 | | guild_id | uuid | FK → guilds.id, nullable | 所属门派/帮派 | | name | varchar(64) | | 弟子名 | | race_id | varchar(32) | | 种族 | | quality | varchar(16) | | common / fine / excellent / perfect / immortal | | profession | varchar(32) | | 职业/心法道倾向 | | stats | jsonb | | 基础战斗属性 | | skills | jsonb | | 已学技能实例 | | equipment | jsonb | | 装备快照 | | daily_task_quota_min | int | | 今日剩余代挂分钟数 | | death_rate_modifier | numeric(5,4) | | 死亡率修正 | | status | varchar(16) | IX | active / dead / dispatched / insurance_pending | | tombstone_data | jsonb | | 死亡后墓碑信息 | | created_at | timestamptz | | | | died_at | timestamptz | | | #### disciple_missions 弟子代派任务/委托记录。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | disciple_id | uuid | FK → disciples.id, IX | | | owner_id | uuid | FK → characters.id, IX | | | contract_id | uuid | FK → contracts.id, nullable | 关联悬赏/委托 | | mission_type | varchar(16) | | mercenary / gathering / sect_proxy | | difficulty | smallint | | 1~6 星 | | success_rate | numeric(5,4) | | 计算后成功率 | | death_rate | numeric(5,4) | | 计算后死亡率 | | insurance_item_id | uuid | FK → inventories.id, nullable | 保险道具 | | result | varchar(16) | | pending / success / fail / death | | rewards | jsonb | | 奖励快照 | | started_at | timestamptz | | | | ended_at | timestamptz | | | --- ### 5.8 悬赏、追杀令与佣兵委托 #### contracts 佣兵委托与悬赏的公共头表。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | contract_type | varchar(16) | IX | mercenary /限时委托 / bounty | | publisher_id | uuid | FK → characters.id, IX | 发布者 | | publisher_guild_id | uuid | FK → guilds.id, nullable | 帮派集体发布 | | difficulty | smallint | | 1~6 星 | | currency_code | varchar(32) | | 报酬货币 | | base_reward | numeric(20,4) | | 基础报酬 | | max_participants | smallint | | 最大接取人数 | | status | varchar(16) | IX | active / accepted / completed / failed / expired / cancelled | | valid_until | timestamptz | IX | 有效期 | | created_at | timestamptz | IX | | | completed_at | timestamptz | | | #### bounties 悬赏与追杀令扩展表(对应 GDD-02 / GDD-13 / GDD-14)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | contract_id | uuid | PK, FK → contracts.id | | | bounty_type | varchar(16) | IX | official_bounty / private_bounty /追杀令 | | target_id | uuid | FK → characters.id, nullable, IX | 目标玩家 | | target_world_tier | smallint | IX | 目标所在层级 | | reward_amount | numeric(20,4) | | 悬赏金 | | fee_amount | numeric(20,4) | | 手续费/报案费 | | is_anonymous | boolean | | 私人悬赏匿名 | | report_count_today | smallint | | 报官今日计数 | | trigger_probability | numeric(5,4) | | 报官触发概率 | | clues | jsonb | | 线索数据 | | item_inventory_id | uuid | FK → inventories.id, nullable | 被追杀的宝物 | #### contract_participants | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | contract_id | uuid | FK → contracts.id, IX | | | character_id | uuid | FK → characters.id, IX | | | participant_type | varchar(16) | | hunter / disciple_proxy / party_member | | disciple_id | uuid | FK → disciples.id, nullable | 弟子代派 | | status | varchar(16) | IX | accepted / active / completed / failed | | accepted_at | timestamptz | | | | completed_at | timestamptz | | | #### manhunt_records 稀有宝物追杀令专属流程(GDD-14)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | bounty_id | uuid | PK, FK → bounties.contract_id | | | original_owner_id | uuid | FK → characters.id | 原宝物持有者 | | current_holder_id | uuid | FK → characters.id | 当前宝物持有者 | | window_end_at | timestamptz | | 追杀窗口结束 | | outcome | varchar(16) | | pending / returned / black_ate / failed | | hunter_choice | varchar(16) | | return / black_eat | | compensation_paid | numeric(20,4) | | 货币补偿 | | chase_right_until | timestamptz | | 追主权有效期 | | created_at | timestamptz | | | --- ### 5.9 世界地图、区域、副本与遗迹 #### world_layers | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | tier | smallint | PK | 1~5(大陆五层分层,对齐 GDD-08 ✅136;均为洪荒大陆内部纵深区域,非独立世界) | | name | varchar(64) | | 出生地/洪荒边境/太古秘境/混沌之渊/界域(GDD-08 §1.0 权威命名,不使用"凡界/灵界/道界/圣界/神域") | | display_layer | smallint | | 显示用 layer(0~5),与 GDD-08 对齐 | | realm_tier | smallint | | 对应境界大层 | | is_pvp_enabled | boolean | | 是否开放 PVP | | cross_tier_rules | jsonb | | 跨界规则、税、掉落衰减 | #### maps 世界地图层定义(可按世界层级、活动事件划分)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | world_tier | smallint | FK → world_layers.tier, IX | | | name | varchar(128) | | 地图名 | | map_type | varchar(16) | | world / event / instance / ruin | | seed | bigint | | 程序化生成种子 | | layout_data | jsonb | | 地图布局元数据 | | is_active | boolean | | | | created_at | timestamptz | | | #### regions | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | map_id | uuid | FK → maps.id, IX | | | world_tier | smallint | IX | | | name | varchar(128) | | 地域名 | | theme | varchar(32) | | 地貌主题 | | is_safe_zone | boolean | | 是否安全区 | | pvp_rules | jsonb | | PVP 规则 | #### zones | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | region_id | uuid | FK → regions.id, IX | | | zone_type | varchar(16) | IX | stronghold / wild / secret / dungeon / ruins | | name | varchar(128) | | | | terrain | varchar(32) | | 山谷/洞窟/密林/沼泽/废墟/雪原/火山/水域/裂隙/遗迹场 | | weather | varchar(32) | | 当前天候 | | resource_density | smallint | | 资源点密度 | | danger_level | smallint | | 1~6 | | rarity | varchar(16) | | normal / resource_rich /奇遇高发 / dangerous | | seed | bigint | | 程序化生成种子 | | generated_data | jsonb | | 地形/资源/事件/敌群配置 | | refreshed_at | timestamptz | | | | expires_at | timestamptz | nullable | 临时/裂隙区域过期时间 | #### zone_explorations | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | zone_id | uuid | FK → zones.id, IX | | | character_id | uuid | FK → characters.id, IX | | | fog_state | jsonb | | 迷雾探索进度 | | exploration_count | int | | 探索次数 | | last_entered_at | timestamptz | | | #### instances 副本入口/定义。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | zone_id | uuid | FK → zones.id, IX | | | instance_type | varchar(16) | IX | permanent / random / ruin / event | | theme | varchar(32) | | 妖兽巢/古战场/邪修密窟/秘宝库/试炼塔/迷踪林/遗迹 | | world_tier | smallint | IX | | | recommended_realm_tier | smallint | | | | generated_layout | jsonb | | 房间/波次/Boss/词缀/机关 | | affixes | jsonb | | 词缀列表 | | max_parties | smallint | | 同时承载队伍数 | | expires_at | timestamptz | nullable | | | created_at | timestamptz | | | #### instance_runs | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | instance_id | uuid | FK → instances.id, IX | | | party_leader_id | uuid | FK → characters.id, IX | | | party_members | uuid[] | | 队员 ID 列表 | | difficulty_coefficient | numeric(6,4) | | 动态难度 D | | status | varchar(16) | IX | in_progress / completed / failed / abandoned | | battle_id | uuid | FK → battles.id, nullable | 结算战斗 | | consumed_keys | smallint | | 消耗副本钥匙数 | | started_at | timestamptz | IX | | | ended_at | timestamptz | | | #### instance_loot | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | run_id | uuid | FK → instance_runs.id, IX | | | character_id | uuid | FK → characters.id, IX | | | item_id | varchar(64) | | | | inventory_id | uuid | FK → inventories.id, nullable | 已生成物品 | | currency_code | varchar(32) | nullable | | | currency_amount | numeric(20,4) | | | | is_resonance_copy | boolean | | 是否残影拓本 | | completeness | numeric(5,4) | | 残响完整度(10%~60%) | | created_at | timestamptz | | | #### world_ruin_records 破界遗迹记录(GDD-18 §5)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | source_character_id | uuid | FK → characters.id, IX | 天启者 | | source_world_tier | smallint | | | | region_id | uuid | FK → regions.id, IX | | | zone_id | uuid | FK → zones.id | 遗迹入口区域 | | instance_id | uuid | FK → instances.id | 关联遗迹副本 | | richness_score | numeric(8,2) | | 丰厚度评分 | | snapshot_data | jsonb | | 天启者技能/心法/装备/货币快照 | | total_extractable | numeric(6,4) | | 可提取上限比例 | | extracted_ratio | numeric(6,4) | | 已被提取比例 | | status | varchar(16) | IX | active / depleted / expired | | opened_at | timestamptz | IX | | | expires_at | timestamptz | IX | | --- ### 5.10 战斗与战报 #### battles 战斗头表(一次战斗一条记录)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | battle_type | varchar(16) | IX | expedition_pve / dungeon_pve / pvp / gvg / bounty / manhunt | | world_tier | smallint | IX | | | realm_tier | smallint | IX | | | game_timestamp | timestamptz | | 游戏内时间戳 | | attacker_id | uuid | FK → characters.id, nullable, IX | | | defender_id | uuid | FK → characters.id, nullable, IX | | | party_a | uuid[] | | 攻击方队伍 | | party_b | uuid[] | | 防守方队伍 | | status | varchar(16) | | in_progress / completed | | result_summary | jsonb | | {winner, end_condition, final_hp} | | created_at | timestamptz | IX | | #### battle_logs 战报详情日志。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | battle_id | uuid | FK → battles.id, UQ, IX | | | report | jsonb | | 完整文字战报(GDD-03 战报 Schema) | | special_events | jsonb | | 共鸣/元素反应/天罚/心魔等特殊事件 | | drops | jsonb | | 掉落物快照 | | created_at | timestamptz | IX | | **分区**:按 `created_at` 周分区,保留 8 周。 **JSONB 索引**:在 `report->>'battle_id'`、`report->>'type'` 上建 GIN 索引(`jsonb_path_ops`)。 #### player_kills | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | killer_id | uuid | FK → characters.id, IX | | | victim_id | uuid | FK → characters.id, IX | | | battle_id | uuid | FK → battles.id | | | world_tier | smallint | IX | | | is_malice | boolean | | 是否恶意 PK | | karma_delta | int | | 戾气变化 | | crime_delta | int | | 罪孽变化 | | loot_taken | jsonb | | 夺取物品快照 | | created_at | timestamptz | IX | | --- ### 5.11 渡劫记录 #### tribulation_records | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK → characters.id, IX | | | realm_tier | smallint | | 渡劫目标境界 | | minor_realm | smallint | | 目标小境界 | | tribulation_type | varchar(16) | | normal / heart_devil / qi_deviation / chaos /合体期 | | base_success_rate | numeric(5,4) | | 基础成功率 | | modified_success_rate | numeric(5,4) | | 修正后成功率 | | helper_ids | uuid[] | | 护法者(道侣/结义) | | result | varchar(16) | | success / fail / backlash / death | | penalties | jsonb | | 失败惩罚:境界掉落、内力冻结、装备耐久、掉落物 | | drops_on_success | jsonb | | 成功掉落(天材地宝/心法感悟) | | san_snapshot | smallint | | 渡劫前 SAN | | created_at | timestamptz | IX | | --- ### 5.12 社交关系 #### social_relations 通用关系链。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_a_id | uuid | FK → characters.id, IX | | | character_b_id | uuid | FK → characters.id, IX | | | relation_type | varchar(16) | IX | friend / companion / master / apprentice / enemy | | intimacy | int | | 亲密度 | | status | varchar(16) | IX | active / cooldown / dissolved | | cooldown_until | timestamptz | | 解除冷却 | | created_at | timestamptz | | | | dissolved_at | timestamptz | | | #### lovers 道侣关系扩展(GDD-16 §1.4)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | relation_id | uuid | PK, FK → social_relations.id | | | resonance | int | | 共鸣度 0~10000 | | shared_residence_id | uuid | FK → guild_territories.id, nullable | 共享洞府 | | combined_skill_id | uuid | FK → character_skills.id, nullable | 合体技实例 | | vow_path | varchar(16) | | 大道同行 / 生死与共 / 逍遥双修 | | teleport_cooldown_until | timestamptz | | 传送冷却 | | mutual_benefits | jsonb | | 双修/护法/传送加成配置 | | updated_at | timestamptz | | | #### sworn_brothers 结义关系扩展(GDD-16 §1.4)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | relation_id | uuid | PK, FK → social_relations.id | | | group_id | uuid | UQ | 义团 ID(2~5 人共享) | | member_order | smallint | | 长幼次序 | | shared_mission_slots | jsonb | | 3 个共享委托栏位 | | group_buffs | jsonb | | 队伍增益配置 | | flag_zone_id | uuid | FK → zones.id, nullable | 义旗位置 | | updated_at | timestamptz | | | **说明**:玩家与 NPC 弟子的从属关系放在 `disciples.owner_id`;玩家之间的师徒关系用 `social_relations.relation_type = master / apprentice`。 #### reputation_records 玩家互评/声望事件流水。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | bigint | PK | | | character_id | uuid | FK → characters.id, IX | 被评价者 | | source_id | uuid | FK → characters.id, IX | 评价者 | | source_type | varchar(16) | | trade / mercenary / master / party / report | | delta | int | | 声望变化 | | tag | varchar(32) | | 标签:良心商人/可靠佣兵/黑心宰客 | | created_at | timestamptz | IX | | --- ### 5.13 配置与审计 #### dynamic_configs Nacos 配置本地快照/灰度记录,非运行时主配置源。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | config_key | varchar(128) | UQ | 配置键 | | namespace | varchar(64) | | economy / combat / skill_gen / map_gen / drop | | value | jsonb | | 配置值 | | version | int | | 版本 | | is_grayscale | boolean | | 是否灰度 | | grayscale_ratio | numeric(5,4) | | 灰度比例 | | effective_from | timestamptz | | 生效时间 | | created_at | timestamptz | | | | updated_at | timestamptz | | | #### daily_reset_tracking | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | character_id | uuid | PK, FK | | | reset_date | date | | 已处理日期 | | report_count_used | smallint | | 报官已用次数 | | instance_count_used | smallint | | 副本基础次数已用 | | ruin_count_used | smallint | | 遗迹探索次数已用 | | double_cultivation_minutes | smallint | | 双修有效分钟数 | | fishing_games | smallint | | 休闲玩法计数 | | updated_at | timestamptz | | | --- ## 6. 索引与分区策略 ### 6.1 常用查询索引 | 表 | 索引字段 | 用途 | |----|---------|------| | characters | (world_tier, realm_tier, power DESC) | 境界隔离排行榜 | | characters | (last_online_at) | 在线判定、离线悬赏过期 | | inventories | (character_id, slot_type) | 背包查询 | | character_skills | (character_id, is_unique) | 唯一技能校验 | | contracts | (publisher_id, contract_type, status) | 我的发布/接取 | | bounties | (target_id, bounty_type, target_world_tier) | 目标悬赏列表 | | battles | (attacker_id, created_at) | 个人战报 | | battles | (defender_id, created_at) | 被攻击记录 | | economy_audit_logs | (character_id, reason_code, created_at) | 经济审计 | | market_orders | (item_id, status, world_tier) | 交易行搜索 | | auctions | (status, auction_type, ended_at) | 拍卖行列表 | | instances | (world_tier, instance_type, expires_at) | 副本入口列表 | ### 6.2 分区表清单 | 表 | 分区键 | 分区粒度 | 保留策略 | |----|-------|---------|---------| | economy_audit_logs | created_at | 月 | 12 个月 | | market_orders | listed_at | 月 | 6 个月 | | auction_bids | bid_at | 月 | 6 个月 | | battle_logs | created_at | 周 | 8 周 | | reputation_records | created_at | 月 | 6 个月 | ### 6.3 JSONB 索引建议 - `character_manuals.instance_data`、`character_skills.instance_data`、`inventories.instance_data`、`battle_logs.report` 使用 GIN 索引(`jsonb_path_ops`)。 - 常用过滤路径(如 `instance_data->>'tier'`)可建立函数索引。 - 避免在频繁更新的 JSONB 字段上建过多 GIN 索引,防止写放大。 --- ## 7. 数据流转与注意事项 1. **角色创建**:`players` → `characters` + `character_race_states` + `currency_balances`(初始化钱包)+ `equipments`(空槽位)。 2. **功法/技能获取**:模板表提供约束与默认值;实例表记录随机 roll 结果与来源标签;玉简复制时生成新实例并继承 `source_tag=JADE_SLIP`。 3. **经济流转**:任何货币变化必须写入 `economy_audit_logs`,并通过消息队列/Nakama 同步给经济监控服务。 4. **市场交易**:卖家物品从 `inventories` 转入托管态,`market_orders` 成交后更新双方 `currency_balances` 并写审计日志。 5. **悬赏结算**:`bounties` 完成时,根据 `battles` 校验击杀,更新 `currency_balances`、信用分、猎人威望,并写审计日志。 6. **副本/遗迹**:`instances` 生成后创建 `instance_runs`;结算时写入 `battles` / `battle_logs` 与 `instance_loot`;破界遗迹额外更新 `world_ruin_records.extracted_ratio`。 7. **渡劫**:`characters.realm_status` 进入 `tribulation_pending`;结算后更新境界并写入 `tribulation_records`。 8. **社交关系**:关系建立/解除更新 `social_relations`,道侣/结义额外写入 `lovers` / `sworn_brothers`,解除时设置 `cooldown_until`。 9. **每日重置**:`daily_reset_tracking` 按现实 08:00 批量重置;避免在 `characters` 表做大量单行更新。 10. **配置热更**:优先读 Nacos;`dynamic_configs` 仅做审计与灰度记录,服务端不应直接依赖它做实时逻辑。 --- ## 8. GDD 冲突与待对齐项 | 编号 | 冲突/歧义 | 涉及文档 | 当前处理方案 | 建议 | |------|----------|---------|------------|------| | C01 | ~~世界层级编号~~ **已修复**(v1.3):数据库 `world_tier` 从 1~6 改为 1~5(对齐 GDD-08 ✅136 五层世界),`realm_tier` 从 1~6 改为 1~9(对齐 ✅116 九大境界)。 | GDD-08 / GDD-18 | 数据库主键采用 `world_tier`(1~5),并设 `display_layer`(0~5)作为显示别名;`realm_tier` 与 `world_tier` 对齐。 | 在 GDD-00 决策总索引中明确统一术语。 | | C02 | **境界隔离 SQL 示例**:GDD-08 示例为 `WHERE current_realm = $1 AND realm_tier = $1`,语义重复/歧义。 | GDD-08 | 数据库按 `realm_tier`(大境界)+ `minor_realm`(小境界)隔离;排行榜查询使用 `(realm_tier, minor_realm, power DESC)`。 | 确认示例是否为笔误,或补充 `minor_realm` 维度。 | | C03 | **货币层级与境界层级对应**:GDD-06 说层 1~2 用铜钱/银两,层 3 用灵石,层 4+ 用结晶;若 world_tier 1=炼气、2=筑基,则炼气/筑基用铜钱/银两。 | GDD-06 / GDD-18 | `currency_balances.currency_code` 按 realm_tier 选择;交易/拍卖结算时校验货币可用性。 | 在 GDD-06 中统一使用 `realm_tier` 而非“层”描述货币。 | | C04 | **弟子 vs 师徒**:GDD-07 的“弟子”是 NPC,GDD-16 的“师徒”是玩家关系。 | GDD-07 / GDD-16 | 用 `disciples` 表存 NPC 弟子;`social_relations.relation_type = master/apprentice` 存玩家师徒。 | 文档中避免混用“弟子”一词,或加注区分。 | | C05 | **悬赏 vs 追杀令**:GDD-02“追杀令”基于罪孽/戾气自动生成;GDD-13“悬赏”分报官/私人;GDD-14“追杀令”针对稀有宝物被抢。 | GDD-02 / GDD-13 / GDD-14 | 用 `contracts` 表存公共头;`bounties` 表扩展悬赏/追杀令字段;`manhunt_records` 扩展宝物追杀流程。 | 明确三类追杀令的 UI 与规则边界。 | | C06 | **拍卖抢劫风险范围**:GDD-14 §4.4 与 §11.1 对“玉简/功法/法宝/材料”是否可抢劫存在差异(仅稀有宝物可抢劫)。 | GDD-14 | `auctions.risk_type` 区分 `rare_robbable` 与 `none`;普通物品强制 `none`。 | 统一拍卖抢劫规则表述。 | | C07 | **深潜裔分支进化**:GDD-01 深潜裔存在多分支进化路径,但部分文档仅提 race_id。 | GDD-01 | `character_race_states.sub_branch_id` + `bloodline_data.evolution_path` 保存分支状态。 | 在种族相关文档中统一分支字段。 | | C08 | **SAN 全民化**:GDD-02 所有角色有 SAN;GDD-17 提到“对无 SAN 目标转恐惧替代”。 | GDD-02 / GDD-17 | `characters` 统一存储 `san_current/san_max`;非邪修/非深潜裔角色 SAN 惩罚较轻。 | 明确 SAN 机制对不同族/职业的差异化影响。 | --- ## 9. 新增系统表结构(GDD-29~33) > 本节补充 GDD-29(聊天与信息传递)、GDD-30(成就里程碑与图鉴)、GDD-31(洞府与个人空间)、GDD-32(NPC与势力关系)、GDD-33(世界Boss与大型PVE协作)所需的数据表。命名约定、字段风格与上文保持一致。 ### 9.1 聊天与信息传递(GDD-29) #### chat_messages 聊天消息持久化表。区域频道消息不持久化(仅 Valkey 缓存),本表存储需审计/举报复核的频道消息。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 消息唯一 ID | | channel_type | varchar(16) | IX | REGION / FACTION / WORLD / GUILD / SECT / FAMILY / TEAM / WHISPER / VOICE_SCROLL | | channel_id | varchar(64) | IX | 频道标识(zone_id / guild_id / target_character_id 等) | | world_tier | smallint | IX | 发送时的世界层级 | | sender_id | uuid | FK → characters.id, IX | 发送者角色 ID | | msg_type | varchar(16) | IX | TEXT / EMOJI / SYSTEM / BATTLE_REPORT / ITEM_LINK / LOCATION | | content | text | | 消息文本内容 | | extra_data | jsonb | | 扩展数据(物品链接属性、战报 ID、位置坐标等) | | is_muted | boolean | | 是否被过滤/折叠 | | created_at | timestamptz | IX | 发送时间 | **索引**: - `(channel_type, channel_id, created_at DESC)` — 频道历史查询 - `(sender_id, created_at DESC)` — 玩家发言记录 - `(created_at)` BRIN — 过期清理 **分区**:按 `created_at` 周分区(pg_partman),保留 7 周,过期分区自动删除。 #### chat_report_records 聊天举报记录。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | reporter_id | uuid | FK → characters.id, IX | 举报者 | | target_id | uuid | FK → characters.id, IX | 被举报者 | | message_id | uuid | FK → chat_messages.id | 被举报消息 ID | | reason | varchar(32) | | ABUSE / SPAM / FRAUD / HARASSMENT / OTHER | | status | varchar(16) | IX | PENDING / APPROVED / REJECTED | | resolved_at | timestamptz | | 处理时间 | | created_at | timestamptz | | | **索引**: - `(reporter_id, created_at DESC)` — 举报者历史 - `(target_id, status)` — 被举报者待处理查询 - `(status, created_at)` — 审核队列 --- ### 9.2 邮件系统(GDD-29 §10A) #### mails 邮件表,承载系统邮件、玩家邮件、帮派/门派邮件、交易邮件。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | sender_id | uuid | FK → characters.id, nullable | 发送者(系统邮件为 NULL) | | receiver_id | uuid | FK → characters.id, IX | 接收者 | | mail_type | varchar(16) | IX | SYSTEM / PLAYER / GUILD / TRADE | | subject | varchar(128) | | 主题 | | content | text | | 内容 | | attachments | jsonb | DEFAULT '[]' | 附件(物品/货币,最多 6 格) | | is_read | boolean | DEFAULT false | 已读状态 | | is_collected | boolean | DEFAULT false | 附件已领取 | | expires_at | timestamptz | IX | 过期时间(默认 created_at + 30 天) | | created_at | timestamptz | | | **索引**: - `(receiver_id, is_read, created_at DESC)` — 收件箱查询 - `(expires_at) WHERE NOT is_collected` — 过期清理(未领取附件的邮件优先清理) --- ### 9.3 成就、图鉴与称号(GDD-30) #### achievements 成就定义表(静态配置,由策划/Nacos 维护)。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | varchar(64) | PK | 成就模板 ID(如 `ach_kill_first_beast`) | | name | varchar(128) | | 成就名称 | | description | varchar(512) | | 成就描述 | | category | varchar(16) | IX | combat / cultivation / exploration / crafting / social / collection / special | | tier | varchar(16) | | bronze / silver / gold / legendary | | is_hidden | boolean | | 是否隐藏成就(条件不可见) | | conditions | jsonb | | 达成条件列表(事件类型、阈值等) | | rewards | jsonb | | 奖励配置(称号、属性微增、物品、外观) | | server_broadcast | boolean | | 达成时是否全服广播 | | version | int | | 配置版本 | #### character_achievements 角色成就进度表。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK → characters.id, IX | | | achievement_id | varchar(64) | FK → achievements.id, IX | | | status | varchar(16) | | unlocked / locked(隐藏成就未发现前不写入) | | progress | jsonb | | 当前进度快照(击杀数、累计值等) | | unlocked_at | timestamptz | | 解锁时间 | **唯一约束**:`(character_id, achievement_id)` #### codex_entries 图鉴条目定义表(静态配置)。图鉴类型包括怪物、功法、种族、装备、地图探索。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | varchar(64) | PK | 图鉴条目 ID | | codex_type | varchar(16) | IX | monster / manual / race / equipment / map | | name | varchar(128) | | 条目名称 | | source_ref_id | varchar(64) | IX | 关联源数据 ID(template_id / manual_id / race_id 等) | | unlock_levels | jsonb | | 各解锁层级对应的信息内容定义 | | version | int | | 配置版本 | #### character_codex 角色图鉴记录表。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK → characters.id, IX | | | codex_entry_id | varchar(64) | FK → codex_entries.id, IX | | | unlock_level | smallint | | 当前解锁层级(0~4,如怪物图鉴:初见/交手/熟知/通晓) | | stats | jsonb | | 统计数据(击杀次数、打造次数、接触次数等) | | updated_at | timestamptz | | | **唯一约束**:`(character_id, codex_entry_id)` #### character_titles 角色称号表。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK → characters.id, IX | | | title_id | varchar(64) | | 称号 ID(对应成就/里程碑/声望等来源的称号) | | title_name | varchar(64) | | 称号显示名 | | source | varchar(16) | | achievement / milestone / honor / mercenary / domain / race / social / hidden | | source_id | varchar(64) | | 来源 ID(成就 ID / 里程碑 ID 等) | | effect_type | varchar(16) | | display / attribute / special | | effects | jsonb | | 属性效果列表(如 [{"type":"monster_damage_bonus","value":0.01}]) | | rarity | varchar(16) | | common / uncommon / rare / legendary / unique | | is_unique | boolean | | 是否全服唯一 | | slot_type | varchar(16) | | equipped / display_1 / display_2 / display_3 / unequipped | | equipped_at | timestamptz | | 装备到槽位的时间 | | obtained_at | timestamptz | | 获得时间 | **唯一约束**:`(character_id, title_id)` **索引**: - `(character_id, slot_type)` — 查询已装备/展示称号 --- ### 9.4 洞府与个人空间(GDD-31) #### caves 洞府主表。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 洞府唯一 ID | | owner_id | uuid | FK → characters.id, UQ | 所属玩家(每人最多 1 个洞府) | | level | smallint | | 洞府等级(1~9,对应九大境界) | | world_tier | smallint | IX | 所在世界层级 | | region_id | uuid | FK → regions.id, nullable | 所在地域 | | zone_id | uuid | FK → zones.id, nullable | 所在区域 | | terrain_quality | varchar(16) | | poor / normal / good / excellent / immortal(地脉品质) | | barrier_hp | int | | 结界当前耐久 | | barrier_hp_max | int | | 结界最大耐久 | | barrier_last_repair_at | timestamptz | | 上次结界修复时间 | | active_arrays | jsonb | | 已布阵法列表(类型/等级/材料品质/剩余维持时间) | | appearance_id | varchar(64) | | 当前外观 ID | | partner_id | uuid | FK → characters.id, nullable | 道侣 ID | | partner_permission | varchar(16) | | visit / facility_share / full_share | | last_invaded_at | timestamptz | | 上次被入侵时间 | | invasion_count_today | smallint | | 今日被入侵次数(每日重置) | | status | varchar(16) | | active / abandoned / destroyed | | created_at | timestamptz | | | | updated_at | timestamptz | | | #### cave_facilities 洞府设施表。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 设施唯一 ID | | cave_id | uuid | FK → caves.id, IX | 所属洞府 | | facility_type | varchar(16) | | training_room / alchemy_room / forge_room / library / herb_garden / mine_vein / array_core / disciple_quarters | | level | smallint | | 设施等级(受洞府等级上限约束) | | state | jsonb | | 运行状态(产出队列 / 弟子派驻 / 阵法配置) | | last_collect_at | timestamptz | | 上次收取产出时间 | | updated_at | timestamptz | | | **唯一约束**:`(cave_id, facility_type)` --- ### 9.5 NPC与势力关系(GDD-32) #### faction_reputation 势力声望表。每个玩家对七大势力各有独立声望值。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK → characters.id, IX | | | faction_id | varchar(32) | | celestial_court / dragon_palace / underworld / demon_domain / witch_holy_land / demon_territory / eldritch_beyond | | reputation_level | varchar(16) | | hated / cold / neutral / friendly / revered / exalted / worshipped | | reputation_value | int | | 声望值(-10000 ~ 10000) | | total_earned | int | | 累计获取声望(防通胀监控) | | updated_at | timestamptz | | | **唯一约束**:`(character_id, faction_id)` **索引**: - `(character_id, reputation_level)` — 按声望等级查询已解锁势力 #### npc_affinity NPC 好感度表。每个玩家对每个可交互 NPC 有独立好感度。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | character_id | uuid | FK → characters.id, IX | | | npc_id | varchar(64) | | NPC 唯一标识 | | affinity_level | varchar(16) | | stranger / acquaintance / familiar / trusted / soulmate | | affinity_value | int | | 好感度值(0 ~ 1000) | | last_interacted_at | timestamptz | | 上次交互时间(用于衰减计算) | | lock_until | timestamptz | nullable | 信物锁定截止时间(锁定期间不衰减) | | updated_at | timestamptz | | | **唯一约束**:`(character_id, npc_id)` **索引**: - `(character_id, affinity_level)` — 按好感度等级查询 - `(last_interacted_at)` — 衰减批处理扫描 --- ### 9.6 世界Boss与大型PVE协作(GDD-33) #### world_boss_instances 世界Boss实例表。每只存活的 Boss 生成一条实例记录;镜像实例为独立记录。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | 实例 ID | | boss_template_id | varchar(64) | IX | Boss 模板 ID(对应 GDD-19 怪物 Schema) | | boss_class | varchar(16) | IX | divine / auspicious / regional / event | | current_hp | bigint | | 当前血量(实时同步 Valkey) | | max_hp | bigint | | 最大血量(含参与人数缩放) | | world_tier | smallint | IX | 出没世界层级 | | region_id | uuid | FK → regions.id, nullable | 出没地域 | | zone_id | uuid | FK → zones.id, nullable | 出没区域 | | is_mirror | boolean | | 是否镜像实例 | | parent_instance_id | uuid | FK → world_boss_instances.id, nullable | 镜像对应的主实例 | | current_phase | smallint | | 当前阶段(1~4) | | is_frenzy | boolean | | 是否进入狂暴状态 | | status | varchar(16) | IX | alive / dead / despawned | | participant_count | int | | 当前参与人数 | | ownership_holder_id | uuid | FK → characters.id, nullable | 当前归属权持有者 | | spawn_at | timestamptz | IX | 刷新时间 | | death_at | timestamptz | | 死亡时间 | | expires_at | timestamptz | | 事件 Boss 过期时间(非事件 Boss 为 NULL) | | created_at | timestamptz | | | **索引**: - `(status, boss_class)` — 查询活跃 Boss 列表 - `(world_tier, status)` — 按层级查询活跃 Boss #### world_boss_participants 世界Boss参与记录表。记录每位玩家对每次 Boss 战的贡献数据。 | 字段 | 类型 | 约束 | 说明 | |------|------|------|------| | id | uuid | PK | | | instance_id | uuid | FK → world_boss_instances.id, IX | Boss 实例 | | character_id | uuid | FK → characters.id, IX | 参与玩家 | | damage_dealt | bigint | | 造成伤害(含境界修正后) | | damage_taken | bigint | | 承受伤害 | | healing_done | bigint | | 治疗量 | | contribution_score | numeric(16,4) | | 综合贡献度(伤害×0.7 + 承受×0.15 + 治疗×0.15) | | ownership_score | numeric(8,4) | | 归属权得分 | | rank | int | | 个人排名 | | has_first_hit | boolean | | 是否首击 | | has_last_hit | boolean | | 是否尾刀 | | is_first_kill | boolean | | 是否全服首杀 | | reward_type | varchar(16) | | contribution / last_hit / first_hit / participation / first_kill / top3 | | rewards | jsonb | | 奖励快照(物品/货币/称号) | | is_reward_claimed | boolean | | 奖励是否已领取 | | join_at | timestamptz | | 加入时间 | | leave_at | timestamptz | | 离开时间(战败/超时/Boss 死亡) | **唯一约束**:`(instance_id, character_id)` **索引**: - `(instance_id, contribution_score DESC)` — 排名查询 - `(character_id, join_at DESC)` — 个人参与历史 --- ### 9.7 新增表索引与分区汇总 #### 新增分区表 | 表 | 分区键 | 分区粒度 | 保留策略 | |----|-------|---------|---------| | chat_messages | created_at | 周 | 7 周 | #### 新增常用查询索引 | 表 | 索引字段 | 用途 | |----|---------|------| | chat_messages | (channel_type, channel_id, created_at DESC) | 频道历史消息 | | chat_messages | (sender_id, created_at DESC) | 玩家发言记录 | | mails | (receiver_id, is_read, created_at DESC) | 收件箱查询 | | character_achievements | (character_id, achievement_id) UQ | 成就进度查询 | | character_codex | (character_id, codex_entry_id) UQ | 图鉴记录查询 | | character_titles | (character_id, slot_type) | 已装备称号查询 | | caves | (owner_id) UQ | 洞府归属查询 | | faction_reputation | (character_id, faction_id) UQ | 声望查询 | | npc_affinity | (character_id, npc_id) UQ | 好感度查询 | | world_boss_instances | (status, boss_class) | 活跃 Boss 列表 | | world_boss_participants | (instance_id, contribution_score DESC) | Boss 排名查询 | --- ## 10. 版本记录 | 版本 | 日期 | 作者 | 变更说明 | |------|------|------|---------| | 1.0 | 2026-06-30 | Kimi Code CLI | 初稿:完成账号、角色、种族境界、功法技能、物品经济、市场拍卖、组织、弟子、悬赏、地图副本、战斗、渡劫、社交、配置审计等表结构设计;定义索引、分区策略与 GDD 冲突项。 | | 1.1 | 2026-06-30 | Kimi Code CLI | 按需求清单对齐表名:`players`、`character_race_states`、`realms`/`character_realms`、`manuals`/`skills`/`items`、`inventories`/`equipments`、`currency_balances`、`auctions`、`guilds`/`guild_members`/`guild_territories`、`disciple_missions`、`bounties`、`maps`、`battles`/`battle_logs`、`lovers`/`sworn_brothers`;拆分 `contracts`/`bounties`/`battles`/`battle_logs`;补充表名速查索引。 | | 1.2 | 2026-07-02 | Claude | 新增 GDD-29~33 系统表结构(第 9 章):chat_messages、chat_report_records、mails、achievements、character_achievements、codex_entries、character_codex、character_titles、caves、cave_facilities、faction_reputation、npc_affinity、world_boss_instances、world_boss_participants;含索引设计与分区策略。 | | 1.3 | 2026-07-06 | MiMoCode | 五层世界对齐:world_layers 表 tier 从 1~6 改为 1~5(对齐 ✅136),world 名称更新为凡界/灵界/道界/圣界/神域;C01 冲突项确认已修复 | | 1.4 | 2026-07-06 | Claude | 反转✅6同步(✅158):characters 表移除 level/exp 字段,改为 energy_current/energy_cap/energy_cap_ceiling,不再有独立"经验/修为"字段 | | 1.5 | 2026-07-06 | Claude | 命名冲突修复:world_layers.name 与并行任务(v1.3)产生的"凡界/灵界/道界/圣界/神域"命名冲突——GDD-08/GDD-02/GDD-23 已统一定案为"出生地/洪荒边境/太古秘境/混沌之渊/界域"(体现同一大陆纵深区域,而非独立世界),本表以此为准同步;表名/字段名 world_layers/world_tier 因引用面广予以保留,仅同步 name 字段取值 | --- *TDD-04 v1.5 | 2026-07-06 | 修复与并行任务(MiMoCode v1.3)的世界层级命名冲突:统一为 GDD-08 权威命名"出生地/洪荒边境/太古秘境/混沌之渊/界域";同步✅158能量模型,characters表level/exp改为energy_current/energy_cap/energy_cap_ceiling*