理系学生日記

おまえはいつまで学生気分なのか

PoEAA: Association Table Mapping

1 対多の関係については、昨日の Foreign Key Mapping で解決できるのですが、それで解決できないのが多対多の関係です。 これを解決するパターンとして昔から用いられてきたのが、関連を持つテーブルをデータベースに追加し、本日のテーマである Associtation Table Mapping パターンを使うことになります。

例えば以下の例では、Employee と Skill が多対多の関係にあるため、データベースとしてはそれらを繋ぐ関連テーブルとして skill-employee が追加されています。

Employee の持つ Skill が何かを抽出するときを考えると、employeeId を元にこのデータベースを参照することになりますが、クエリ回数(と、それに伴う時間)を鑑みて、このケースでは JOIN を使用してクエリ発行回数を抑えることが多いです(結果として、クエリで取得できる情報は複数テーブルに跨る情報になるため、オブジェクトへのマッピングコストは高くなります)

また、必ずしも多対多の関係を解決するためでなく、他のケースでこのパターンが表れることもあります。例えば、既存の DB スキーマを変更することが難しい場合 (既存テーブルのカラム追加ができないので、新規テーブルとして関連テーブルを追加する) です。

その他の話題としては、如何にしてクエリの発行回数を増やしていくか、ということで、本書ではその実装パターンが示されていますが、特に言及すべきことも無いかんじでした。