跳轉到

Game Resource Vertical Table

概念概覽

垂直資源表設計模式

核心知識

垂直資源表設計模式

純餘額型資源(Gold、Diamond、DungeonToken)與池型資源(Stamina,含上限 + 恢復計時)的混用是語義汙染的根源,應拆為兩張表:

  • player_resources:type 欄位區分資源種類,新增任何 ResourcesType(8/9/10…)完全不需要改 code 或做 migration
  • player_resource_pools:池型資源專屬,紀錄 max、recover_at 等欄位

核心高頻貨幣的特殊要求

DungeonToken 屬於每局都會產出/消耗的核心貨幣,必須走實體欄位 + CAS(Compare-And-Swap) + CHECK 約束防超扣,不可用 JSONB extra_currencies 儲存(JSONB 無法做 CAS)。

遷移策略

Phase 1:建立 player_resources table + ResourceRepository
Phase N:分階段雙寫過渡,保留 rollback 能力

垂直表的代價是 JOIN 查詢複雜度略增;橫向欄位直覺但每次新增資源都要 ALTER TABLE,長期維護成本更高。

經驗教訓

  • 垂直資源表的 type 欄位設計讓資源種類擴充完全不需要 migration,是降低長期維護成本的核心決策

  • 核心高頻貨幣必須走實體欄位 + CAS,JSONB 無法提供 CAS 與 CHECK 約束保護

  • 遷移時分 Phase 執行並保留雙寫,確保每個階段都可 rollback

常見陷阱

  • 將池型資源(Stamina)與純餘額型資源(Gold)放同一張表,導致語義不清且難以分別加約束

  • 用 JSONB 儲存高頻核心貨幣(DungeonToken),失去 CAS 防超扣能力

最佳實踐

  • 所有新增遊戲資源預設進 player_resources 垂直表,評估後才考慮 pool 型

  • schema 加清楚的 COMMENT 說明每張表的設計意圖

  • 核心高頻貨幣(每局都會扣除的)必須走實體欄位 + CAS

相關概念

相關視角

以下頁面與本概念共享主題,但從不同角度切入。保留獨立視角同時提供交叉參考:

來源 Sessions

日期 Session 貢獻摘要

| 2026-03-19 | 04c2b73d-c00e-4eaf-959f-0dbf0f224e24 | 確立了將混用的 player_currencies 拆分為 player_resources(純餘額型)與 player_resource_pools(池型)的設計決策與取捨依據 |


本概念頁面由 Semi-Brain Wiki 系統自動維護

最後更新: 2026-03-19