KDOC 391: 1対1のテーブルを維持する

この文書のステータス

  • 作成
    • 2025-06-19 貴島
  • レビュー
    • 2025-06-24 貴島

概要

親テーブルと子テーブルのレコードが1対1の対応であることを保ちたい場面がある。親だけ、あるいは子だけが消された状態はデータ不整合である。防ぎたい。

たとえばこのような、必ず「ユーザ」は「個人ユーザ」か「会社ユーザ」である、ようなケース。

users。親。

フィールド
id


user_individuals。子。

フィールド
id
user_id


user_companies。子。

フィールド
id
user_id

データベース制約によって、親が消されたら子を削除する、は簡単にできる(DELETE CASCADE)。いっぽう、親子が1対1で子だけの削除を禁止する、というのをデータベースのレベルでは表現できないように見える。

この場合、アプリケーションでガードする、方法を考えた。

  • 消すときは親テーブルを消し、親削除による関連削除によって子を削除するルールにする
  • ORMのフックで、子テーブルの直接削除は禁止する
  • アプリケーションに整合チェックを入れて確認する

ベストではない。仕様がわかりにくいのと、事故は起きうるのが問題に見える。

関連

なし。