/note/tech

外部キー制約は何も考えずに適用するとよくない

要約:

■ 1. 主張の概要

  • 外部キー制約をすべてのリレーションシップに無条件で適用する慣行に対する警鐘
  • 「制約すると良さそうに見えるものが、深く考えずに適用すると問題を引き起こす」という立場

■ 2. 一貫性境界(トランザクション境界)の概念

  • 外部キー制約が有効に機能するのは、同一の一貫性境界内に限られる
  • 一貫性の種類:
    • 強整合性(トランザクション整合性): 変更が不可分に同時に発生する
    • 弱整合性(結果整合性): 変更が独立したタイミングで発生する

■ 3. 具体例: 販売システムにおける境界の扱い

  • テーブル構成: 商品(Products)、売上(Sales)、売上明細(SaleDetails)
  • 境界内の関係:
    • 売上と売上明細は同時に更新されるため、外部キー制約が適切
  • 境界をまたぐ関係:
    • 売上明細から商品への参照には外部キー制約を設けるべきでない
    • 商品と売上はライフサイクルが異なるため、商品の削除・廃番時に外部キー制約が障害となる

■ 4. 解決策: 非正規化の活用

  • 境界をまたぐ参照には、IDのみを保持するのではなく関連データを売上明細に直接持たせる
  • 例として、商品価格を売上明細に直接格納することで、商品データの変更による参照整合性の問題を回避する

■ 5. ドメイン駆動設計(DDD)との関連

  • 本概念はDDDの集約(Aggregate)の考え方と一致する
  • 外部キー制約は集約の内部では有効
  • 集約をまたぐ参照に外部キー制約を設けることは設計上の誤り