おすすめは Hybrid(現在値テーブル + イベント履歴テーブル)です。
全テーブルをイミュータブル化する方式は、通常業務では重すぎることが多いため、対象を絞る運用が実務的です。
flowchart TD
A[全イミュータブル] -->|重くなりやすい| B[対象を限定]
B --> C[Hybridを標準採用]
C --> D[イベント系のみImmutable強化]
- 現在値参照が速い(一覧・検索・API応答が軽い)
- 履歴を保持できる(監査・追跡に対応)
- 実装と運用のバランスが良い(開発速度を落としにくい)
- イベント系(状態遷移・承認・入出金・取引): イミュータブル履歴を採用
- 属性系(プロフィール・設定・補足情報): 通常の UPDATE モデルを採用
- ステータス管理:
CHECKではなく status マスタ + 外部キー
- 全テーブルをイミュータブルにする
- 参照クエリが重くなる
- テーブル肥大化が早い
- 開発・保守コストが上がる
- 監査要件が強い / 改ざん耐性が必要: Hybrid 以上(必要箇所で Immutable)
- 参照性能重視・通常業務中心: Mutable + 必要箇所のみ履歴
- 要件が混在: Hybrid を標準にして対象限定で Immutable を追加
- マスタ系テーブル: Mutable を基本にする
- 例:
status_master,currency_master,country_master
- 例:
- トランザクション系テーブル: Hybrid を基本にする
- 例: 申請、承認、入出金、売買、状態遷移
- 監査要件が特に強いトランザクション: Immutable Event を追加で適用する
flowchart LR
M[Master Data] --> MM[Mutable]
T[Transaction Data] --> H[Hybrid]
H --> I[Immutable Event for audit-critical domain]
status = 1/2/3のような直値運用は暫定対応として扱う- 新規実装では status マスタ + 外部キー参照へ統一する
- 既存は段階移行を推奨する
- status マスタ作成(
status_id,status_code,status_name) - 業務テーブルに
status_id追加 - 既存の数値列から
status_idへデータ移行 - アプリ参照を
status_idに切替 - 旧 status 数値列を廃止
- status マスタ作成(
- Mutable
- メリット: 軽い、速い、実装が簡単
- デメリット: 履歴追跡が弱い
- Immutable Event
- メリット: 監査と追跡に強い
- デメリット: 参照が重い、肥大化しやすい
- Hybrid
- メリット: 履歴と性能のバランスが最もよい
- デメリット: 更新時の整合性管理が必要
users(現在値):created_at,update_atuser_status_events(履歴):created_atのみ(update_atなし)status_master(マスタ): status 定義を集中管理
- まず Hybrid で開始
- 性能課題はインデックス・集約で対処
- 監査が必要な領域だけ Immutable を強化
- 全面 Immutable は監査要件が極めて強い場合のみ検討
flowchart LR
S1[Start Hybrid] --> S2[Tune Index/Aggregation]
S2 --> S3[Expand Immutable for audit-critical domain]
S3 --> S4[Full Immutable only if strict audit demands]