3

2 つのテーブルを持つデータベースがあります。それらを Foo と Bar と呼びましょう。各 foo は任意の数のバーに関連付けることができ、各バーは任意の数の foo に関連付けることができます。1 つのクエリで、特定のバーに関連付けられている foo と、特定の foo に関連付けられているバーを取得できるようにしたいと考えています。

私の質問は、これらの関係を記録する最良の方法は何ですか? 各関係のレコードを含む個別のテーブルが必要ですか (例: foo と bar の 2 つの列)。foo テーブルにはバーのリスト用の列が必要ですか? その逆も同様ですか? 私が見落としている別のオプションはありますか?

4

2 に答える 2

11

これは、多対多の関係と呼ばれます。「標準的な」解決策は、関係がある各行の各テーブルの主キーを使用して、3 番目のテーブルを設定することです。

3 番目のテーブルはジャンクション テーブルと呼ばれます。ウィキペディアの「ジャンクション テーブル」: http://en.wikipedia.org/wiki/Junction_table

例として:

Foo
UID
Col1
Col2

Bar
UID
Col1
Col2

Foo_Bar
UID
Foo_UID
Bar_UID

したがって、上記では、多くの foo と多くの bar が存在する可能性があります。バーに関連する各 foo と、foo に関連する各バーは、Foo_Bar テーブルに存在します。特定のバーに関連するすべての foo を取得するには、次の SQL を使用できます。

select *
from foo
where uid in (
    select foo_uid
    from foo_bar
    where bar_uid=<some bar uid>)

(この質問の正確な重複は見つかりませんでしたが、次の質問はトピックを拡張します。)

多対多テーブル設計に関する質問
多対多リレーション設計 - 交差テーブル設計

于 2010-03-16T20:08:23.550 に答える
1

それは確かに多対多の関係です。マイケルの回答に加えて、追加のリソースとして以下を提供したいと思いました。私はあまりにも多くの貧弱なデータベースの実装を見てきましたが、これを持ち出すことはできません (あなただけでなく、将来これを見るかもしれない他の人のために)

于 2010-03-16T20:14:36.947 に答える