外部キー制約の知っておいて欲しいこと(FOREIGN KEY Night)要約¶
概要¶
RDBは「集合と関係」のデータモデルであり、関係には「意図的な整合性」が含まれる。外部キーはその意図を表現するための中心的な仕組みで、外部キーを使わないならRDBを使っているとは言えず、Key-Value Storeに近いという立場から解説が進む。
重要ポイント¶
- 外部キーは「子の参照先が親に必ず存在すること」を担保し、親の削除・更新時の参照アクション(RESTRICT / NO ACTION / CASCADE / SET NULL / SET DEFAULT)で整合性を維持する。
- MySQL(InnoDB)は参照先インデックスの存在確認を行い、子側インデックスが無い場合は自動作成するなど実装上の挙動がある。遅延制約はなく、MATCH句は実質スルーされ、SET DEFAULTも実質使えないなど注意点がある。
- PostgreSQLは遅延制約(DEFERRABLE)を使え、NO ACTION/RESTRICTの挙動差やSET DEFAULT、MATCH句(FULLなど)を理解して使い分ける必要がある。
外部キーが救うもの¶
- 外部キーが無いと、親に存在しない値の参照や、親からの削除による不整合が起きる。
- 外部キーはヒューマンエラーやアプリケーションのバグからデータを守る。
実務での示唆¶
- シンプルで堅牢なデータモデルはアプリケーションの形を導出し、間違いにくい設計につながる。
- データの寿命はアプリより長く、アプリは作り直せてもデータは作り直せない。ビジネスを踏まえたデータモデリングを考え抜く必要がある。
出典¶
- Speaker Deck: 外部キー制約の知っておいて欲しいこと - RDBMSを正しく使うために必要なこと / FOREIGN KEY Night