PoEAA ch12 Identity Field
Identity Field
Saves a database ID field in an object to maintain identity between an in-memory object and a database row.
- RDBにおいてはキーで行を区別・特定する
- とりわけPK
- 【補】リレーショナルモデルでは「候補キー」(RK)
- とりわけPK
- メモリ上のオブジェクトには不要
- DBからの読み出し・オブジェクトの構築までは問題なし
- 参照やメモリアドレスで特定できる
- DBに書き戻すとき必要
- メモリ上のオブジェクトとRDB上の行を紐付ける必要がある
- DBからの読み出し・オブジェクトの構築までは問題なし
- 実装内容は退屈この上ない
- オブジェクトのフィールドにPKを格納するだけ
- が、考えることは結構ある
How It Works
Choosing Your Key
- ナチュラルキー/サロゲートキー
- 単純キー/複合キー
- テーブル一意/DB一意
- ふつうはテーブル一意で良い
- DB一意キーの利点
- 単一のIdentity Mapで全オブジェクトを管理できる
- 個々のテーブルのIDが衝突しないため
- 単一のIdentity Mapで全オブジェクトを管理できる
- ID枯渇問題
- 64ビット整数ならまず起こらない
- Table Inheritance系パターンとの兼ね合い
- Class Table Inheritance、Concrete Table Inheritanceの場合は、テーブルごとに一意ではなく、継承ツリーに対して一意なキーがあると都合が良い
- キーのサイズとパフォーマンス
- 何か決定を固める前に、まずおおよその調査を
- 【補】推測するな計測せよ
- 何か決定を固める前に、まずおおよその調査を
Representing the Identity Field in an Object
- 単純キーを同じ型のフィールドに持つのが一番単純でうまくいく
- 複合キーの場合は問題が出てくる
- 複合キーをまとめるクラスを作るのが良い
- 汎用 vs 明示的に別々のクラスにする
- 著者は普段なら「明示的」を好むが、この場合は悩ましい
- 何もしない小さなクラスが大量にできてしまう
- メリットは「複合キーの格納順を間違えない」ことだが、そもそも問題になることがあまりない
- 著者は普段なら「明示的」を好むが、この場合は悩ましい
- DBをまたいでデータを読み込む時のキー衝突
- 区別して保持する
Getting a New Key
- INSERT時のキー採番
- DBの自動生成
- GUID
- 自前で生成
- DBの自動生成
- メリット
- 最も簡単
- デメリット
- 親子オブジェクトを一度に登録できない
- 例: OrderとOrderLine
- OrderオブジェクトをINSERTしない限り
orders.id
は採番されない orders.id
が採番されないとorder_lines.order_id
を設定できない
- OrderオブジェクトをINSERTしない限り
- 例: OrderとOrderLine
- 親子オブジェクトを一度に登録できない
- Oracleだとdatabase counterというのがあり良い感じ
- メリット
- GUID
- メリット
- マシン横断的に一意
- 【補】複数DBをまたいだりクラスタリングしたりしても衝突しない
- マシン横断的に一意
- デメリット
- 長い
- 読みづらく、タイピングもしづらい
- 【補】連番でないので、時系列情報をもたない
- パフォーマンス問題
- インデックスがあるとき特に
- 【補】長い文字列はインデックスが遅い
- インデックスがあるとき特に
- 長い
- メリット
- 自前で生成
- キー採番テーブルを用意する場合は、独立したトランザクションで採番を行うとよい
- キー採番テーブルを用意する場合は、採番処理をクラスに切り出すとよい
- Service Stubを適用しやすくなる
- テストのため
- Service Stubを適用しやすくなる
When to Use It
- メモリ上のオブジェクトとRDB上の行を紐付ける必要があるとき
- 例
- Domain Model
- Row Data Gateway
- 【補】Active Record
- 例
- 対応するテーブルを持たず、「値が等価なら同一」な小さなオブジェクトにはEmbedded Valueを適用せよ
- 【補】Value Objectの一種
- 例
- お金(金額 + 通貨)
- 日付範囲(begin + end)
- 複雑なグラフで、かつSQLによる問い合わせが必要ないものはSerialized LOB
- Identity Fieldを持つ代わりに、Identity Mapを拡張するという道
- Identity Mapにルックアップ機能をもたせる
- オブジェクト => キー
- キー => オブジェクト
- オブジェクトにIdentity Fieldをもたせるほうが楽なので、あまり見ることはない
- Identity Mapにルックアップ機能をもたせる
英語
- mind-numbingly
- 極めて退屈でつまらない
- oodles
- 極めてどっさり
- rare
- すてきな