データベース理論 - 2 つのテーブル間の関係
-
20-09-2019 - |
質問
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 の答えに加えて、追加のリソースとして以下を提供したいと思いました。あまりにも貧弱なデータベース実装を見てきましたので、これを取り上げることはできません (あなただけでなく、将来これを見るかもしれない他の人のために)