質問

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

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

役に立ちましたか?

解決

これは、多対多の関係と呼ばれています。 「標準的な」解決策は、関係が存在する各列内の各テーブルの主キーと、第3のテーブルを設定することです。

第3のテーブルは、ジャンクションテーブルと呼ばれます。ウィキペディアから "ジャンクションテーブル": http://en.wikipedia.org/wiki/Junction_tableする

の例としては:

Foo
UID
Col1
Col2

Bar
UID
Col1
Col2

Foo_Bar
UID
Foo_UID
Bar_UID

だから、上記では、多くのFOOSおよび多くのバーがあるかもしれません。 FOOに関するバーに関する各fooと各バーは場合、Foo_Barテーブルに存在するであろう。与えられたバーに関連するすべてのFOOSを取得するには、次のSQLを使用することができます:

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

(この質問のいずれかの正確なdupesを見つけることが、以下の質問が話題に展開されませんでした。)

多くのテーブル設計の質問に多くの
多くの関係のデザインに多くを - 交差点テーブルデザインする

他のヒント

それはまさに多対多の関係です。Michael の答えに加えて、追加のリソースとして以下を提供したいと思いました。あまりにも貧弱なデータベース実装を見てきましたので、これを取り上げることはできません (あなただけでなく、将来これを見るかもしれない他の人のために)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top