# リレーションシップ

リレーションシップ ( リレーション ) とは、エンティティ同士の関係を表すオブジェクトです。

例えば「請求書」エンティティと「請求書明細」エンティティなど、エンティティ同士に関連がある場合に、 その関連を線で表現したものです。(なお、リレーションシップは物理データベース上では外部キー制約に相当します。)

リレーションシップの種類には、大きく依存型リレーションシップ、非依存型リレーションシップ、多対多リレーションシップがあります。

依存型、非依存型のどちらかのリレーションシップを設定するかは、依存関係があるか、つまり、「親レコードが存在しない場合に子レコードが存在できるかどうか」の基準で決めます。例えば、売上ヘッダと売上明細という２つのエンティティを考えた場合、 売上明細のレコードのみ存在し、売上ヘッダのレコードが存在しないということはありません。 つまり、売上明細は売上ヘッダに「依存」しているということになり、 このエンティティ間に設定するリレーションシップは「依存型リレーションシップ」となります。上記のように親子関係がない場合は「非依存型リレーションシップ」となります。依存リレーションシップの場合は実線、非依存リレーションシップの場合は点線で引きます。

なお、依存型リレーションシップ、非依存型リレーションシップの物理データベース上の違いは、 「子テーブルに作成される外部キーが主キーになるかどうか」となります。 依存リレーションシップの場合、外部キーは主キーとなり、非依存リレーションの場合は非主キーとなります。

また、顧客エンティティと商品エンティティなど、両者のレコード関係が多対多である場合は「多対多リレーションシップ」となります。多対多リレーションシップを論理モデル（ER図）上で定義することは問題ありませんが、物理モデル（物理データベース）に反映するにおいては、仲介エンティティを作成し、依存リレーションシップ同士の関係に変換する必要があります。

以下は、顧客エンティティと商品エンティティの間に注文という仲介エンティティを設けた例となります。仲介エンティティは顧客、商品のエンティティの子エンティティとして依存リレーションシップを引き なおしています。これにより「１対多 」の関係にすることができます。

また、親子関係ではなく、派生関係にある場合はサブタイプリレーションシップを使用します。以下はサブタイプリレーションシップの使用例です。この例では「車両」という基本エンティティと「トラック」「乗用車」の派生エンティティを作成しており、車両エンティティにはトラック、乗用車の共通となるのカラム、トラック、乗用車エンティティではそれぞれの独自のカラムを設けています。このような派生関係をもつエンティティ同士において設定するのがサブタイプリレーションシップを設定します。

サブタイプリレーションシップについては物理データベース側で外部キーとして反映されることはありません。