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のフックで、子テーブルの直接削除は禁止する
- アプリケーションに整合チェックを入れて確認する
ベストではない。仕様がわかりにくいのと、事故は起きうるのが問題に見える。
関連
なし。