さまざまなオープンソースCMSで、2つのリレーショナルテーブルをマッピングするための個別のテーブルがあることに気付きました。カテゴリや製品と同様に、別のproduct_category_mapping
表があります。このテーブルには、主キーと、カテゴリおよび製品テーブルの2つの外部キーがあります。
私の質問は、どちらかのテーブルで外部キーを定義することによってテーブルを直接リンクするだけでなく、このデータベース設計の利点は何ですか?それは単に便宜の問題ですか?
さまざまなオープンソースCMSで、2つのリレーショナルテーブルをマッピングするための個別のテーブルがあることに気付きました。カテゴリや製品と同様に、別のproduct_category_mapping
表があります。このテーブルには、主キーと、カテゴリおよび製品テーブルの2つの外部キーがあります。
私の質問は、どちらかのテーブルで外部キーを定義することによってテーブルを直接リンクするだけでなく、このデータベース設計の利点は何ですか?それは単に便宜の問題ですか?
回答:
このようなテーブルは、リンクテーブルまたはブリッジテーブルと呼ばれることがよくあります。
これは、多対多の関係を作成する標準的な方法です。2つのテーブル間に直接外部キーがある場合、作成できるのは1対多の関係(外部キーが指す主キーも一意制約であるため)、または1対1の関係(外部キー自体も一意の制約です)。
DB設計の考え方に応じて、主キー列は省略されることが多く、ブリッジテーブルの主キーは2つの外部キー列自体で構成されます(いずれにしても、これらの列に一意の制約が必要です。主キー)。
これは、多対多の関係を実装する簡単な方法です。
次の2つのテーブルについて考えてみます。
category
--------
categoryID [PK]
categoryName
product
-------
productID [PK]
productName
にcategoryID
フィールドを追加した場合product
、すべての商品に含めることができるカテゴリは1つだけです。しかし、次のproduct_category_mapping
ような場合:
product_category_mapping
------------------------
mappingID [PK]
productID [FK]
categoryID [FK]
それから私たちは持つことができます:
mappingID productID categoryID
--------------------------------
1 1 1
2 1 2
3 2 3
4 2 1
したがって、製品1はカテゴリー1および2であり、製品2はカテゴリー3および1であるので、多くの製品は多くのカテゴリーに属し、多くのカテゴリーには多くの製品があります。
以下のようtdammersへの書き込みは、このテーブルは、多くの場合、リンクテーブルまたはブリッジテーブルと呼ばれ、私もそれは明らかにRuby on Railsには多くに多くを代弁しているhasAndBelongsToManyのから、HABTMテーブルと呼ば見てきました。そして、ウィキペディアはそれをジャンクションテーブルと呼び、かなり多くの名前を持っています。
mappingID
キーには有効な使用法があり、1つの一般的なシナリオは、junctionテーブルが多くの外部キーを保持している大量のインポート/エクスポートをより適切に追跡することです。