PoEAA ch12 Foreign Key Mapping
Foreign Key Mapping
Maps an association between objects to a foreign key reference between tables.
- オブジェクトの関連は
親->子
の参照で表される - RDB上では
子->親
の外部キーで表される- さもないと、親が複数の子を集約する場合、第一正規形違反になる
- Foreign Key Mappingパターンは、オブジェクトの参照とRDBの外部キーとをマッピングする
How It Works
- 事態が複雑になるのは、コレクションを集約しており、更新がかかる場合
- 例: アルバムとトラック
- 選択肢は3つ
- delete/insert
- back pointer
- 差分
delete/insert
- メリット
- 実装が簡単
- デメリット
- Dependent Mappingである場合にしか適用できない
- トラックがアルバム以外に所有されていないこと
- Dependent Mappingである場合にしか適用できない
- オブジェクトのリンクをimmutableにした場合はこれ以外の選択肢はない
- 参照をすげ替えることができないため
- シンプル
back pointer
子->親
の参照を追加- 【補】RDBの外部キーには、親のIdentity Fieldを使用する
- メリット
- 単純
- デメリット
- オブジェクトモデルを変えてしまう
- 本来不要な相互参照が追加される
- オブジェクトモデルを変えてしまう
差分
- 上記いずれも響かなければこれ
- 何との差分?
- Optimistic Offline Lock利用時はRDBを再読み込みしなければならない
- 【補】バージョンの照合が必要なため
- 新しいオブジェクトの取り回し
- トラックがアルバムから取り除かれる場合、トラックのレコードに対する操作にはいくつかのケースがある
- 他のアルバムに移動する
- UPDATE FK更新
- いずれのアルバムにも所属しない
- UPDATE FKにnullを設定
- 完全に削除される
- DELETE
- 他のアルバムに移動する
循環参照について
Customer->Payments->Order->Customer->...
みたいなやつ- 対処
- Lazy Load
- Empty Object
When to Use It
- クラス間に関連がある場合ほぼ必ず使用する
- 多対多の場合は代わりにAssociation Table Mappingを使用する
英語
- a bevy of
- 大量の