2つのリレーショナルテーブルに個別のマッピングテーブルを作成する場合の利点


9

さまざまなオープンソースCMSで、2つのリレーショナルテーブルをマッピングするための個別のテーブルがあることに気付きました。カテゴリや製品と同様に、別のproduct_category_mapping表があります。このテーブルには、主キーと、カテゴリおよび製品テーブルの2つの外部キーがあります。

私の質問は、どちらかのテーブルで外部キーを定義することによってテーブルを直接リンクするだけでなく、このデータベース設計の利点は何ですか?それは単に便宜の問題ですか?

回答:


7

このようなテーブルは、リンクテーブルまたはブリッジテーブルと呼ばれることがよくあります

これは、多対多の関係を作成する標準的な方法です。2つのテーブル間に直接外部キーがある場合、作成できるのは1対多の関係(外部キーが指す主キーも一意制約であるため)、または1対1の関係(外部キー自体も一意の制約です)。

DB設計の考え方に応じて、主キー列は省略されることが多く、ブリッジテーブルの主キーは2つの外部キー列自体で構成されます(いずれにしても、これらの列に一意の制約が必要です。主キー)。


ohh k ....つまり、多対多の関係が必要な場合、このアプローチに従う必要がありますよね?
Pankaj Upadhyay

1
@PankajUpadhyay:正解です。MM関係はこの方法で実装されます。
NoChance

@PankajUpadhyay:理論的には、他のアプローチを使用することもできますが、それらは厄介で間違っているため、絶対にそこに行かないことをお勧めします。
tdammers

2
@PankajUpadhyay:正規化されたデータベースを作成する場合は、説明されているように3番目のテーブルを使用する必要があります。1-Mの関係がある場合、3番目のテーブルは絶対に必要ありません。有限で限定されたMMがあり、正規化を気にしない場合は、3番目のテーブルなしで行うことができます。一般に、データウェアハウスまたはデータマートを構築する場合を除き、正規化されたデータベースを使用します(このような場合、正規化されたスキーマは議論の余地があります)。
NoChance

@EmmadKareem:ええ、私はそれを見ました...私の要件は1対多なので、テーブルを作成しません...おかげでmate
Pankaj Upadhyay

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テーブルと呼ば見てきました。そして、ウィキペディアはそれをジャンクションテーブルと呼び、かなり多くの名前を持っています。


これはRailsだけでなく、私が使用したほとんどすべてのPHPフレームワークはHABTMと呼んでいます。
sevenseacat

@Karpieいくつかの例?CakePHPがHABTM名を使用していることは知っていますが、当初はRailsクローンとして始まりました。
yannis

私は代理母の大ファンです。しかし、私は余分な代理キー「mappingID」を省いて、「productID」と「categoryID」に複合PKを置くことを好みます。私の考えでは、2つのサロゲートで構成される複合キーは、それ自体がサロゲートです。結合で代理の「mappingID」を実際に使用することは決してありません。
Tydus卿

@LordTydus tdammersのように私は複合キーを書きませんでした。彼の答えをリサイクルする意味はありません。ただし、mappingIDキーには有効な使用法があり、1つの一般的なシナリオは、junctionテーブルが多くの外部キーを保持している大量のインポート/エクスポートをより適切に追跡することです。
yannis

2

マッピングテーブルを使用する理由は、重複を排除するためです。先に進んで、他のマッピング手法を試してください。これがないと、データの重複を防ぐことはできません。

そして、それは2cdの質問をもたらします。なぜ重複を排除する必要があるのですか?したがって、データを1か所で1回編集するだけで済みます。重複を排除すると、パフォーマンスが低下する場合があります。また、重複を排除するためにパフォーマンスが向上する場合もあります。たとえば、大きなテーブルで別個の重複する値を選択するよりも、ドロップダウンリストに正規化されたルックアップ値を入力する方が高速です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.