多対多のリレーションシップがある2つのエンティティ間では、その片方のエンティティのインスタンスはもう一方のエンティティのインスタンスを特定できません。このまま、次の設計フェーズである論理データモデルに転換すると非正規形になってしまいます。これは、「多」の部分が繰り返し項目となってしまうからです。(正規化についてはまた別の記事で詳しくみていきます。)

つまり、多対多のリレーションシップが存在すれば、それは「正当なデータベース設計をしている」とは言えません。

そこで、多対多を排除するために、そのリレーションシップの間にエンティティを一つ設けることで、1対多の関連に変換してやります。その新たに設けるエンティティを「連関エンティティ」と言います。

連関エンティティ

まずは以下のような多対多のリレーションシップがあるとします。

上図から読み取れるルールは、「1人の社員は複数の部署に所属する」ことがあり、「1つの部署には複数の社員が所属している」ことがあるというものです。ここから、部署エンティティと社員エンティティを抽出すると、両者の間に多対多の関係が生じていることがわかると思います。

これではどちらのエンティティからもひとつのインスタンスを特定することができません。そこで、部署エンティティと社員エンティティの間に連関エンティティを追加して、1対多と多対1のリレーションシップに分解します。

上図のように、連関エンティティとして所属エンティティを設けて、多対多の関係を排除し、1対多と多対1のリレーションシップに分解します。下図がそのように分解した場合のインスタンスの例です。

核エンティティと連関エンティティ

上図の部署エンティティと社員エンティティを核エンティティと言い、所属エンティティを連関エンティティと言います。

連関エンティティの主キーは、核エンティティの主キーの組になります。上図例の場合では、連関エンティティ「所属」の主キーは、核エンティティである「部署」の主キーと「社員」の主キーの組である{部署コード,社員コード}となります。また、連関エンティティの主キーを構成する属性は、それぞれ核エンティティの主キーを参照する外部キーになります。上図例の場合、「所属」の主キーを構成する「部署コード」と「社員コード」は、核エンティティである「部署」の主キーと、「社員」の主キーを参照する外部キーとなります。