2012-02-29 6 views
1

私は2つのテーブルがあると言います。表1は、ユニークID(auto_increment)を持つベンダーのリストです。表2は、これらのベンダーが販売する会場または市場のリストであり、ユニークなIDでもあります。ベンダーが特定の市場にいるかどうかに素早くアクセスしたいと思っています。ベンダーと会場の両方が多数存在するでしょう。多くのアプリケーションでは、この情報にアクセスしてさまざまな目的で操作する必要があります。私は2つのアプローチを考えています。Mysql - ベンダー/会場のペアのテーブルを処理する最も効率的な方法

アプローチ1:

行が会場にベンダーと列に対応して新しいテーブルを作成します。あるベンダーの会場の列にある「1」は、そのベンダーがその会場にいることを意味します。つまり、ベンダーを追加するときに、この3番目の表に新しい列も作成しています。私は多くのベンダーがいるかもしれません。

アプローチ2:

ベンダーテーブルの会場という列と会場のテーブルにベンダーと呼ばれる列を作成します。区切られたベンダーIDまたは会場IDの列を列に入力します。これはおそらくアクセスするのが難しいようですが、おそらく膨大な数の列を持つ新しいテーブルは必要ありません。

それぞれを実装するためのコードは簡単なので、ここには掲載しません。私の質問は「ベストプラクティス」や効率性の問題のほうが多いです。ありがとうございました。

+0

私はここに一般的な合意があると思うので、私は先に進んで正しい答えを選ぶでしょう。ご参加いただきありがとうございます。 – buck54321

答えて

4

これは多対多リレーションシップなので、相互参照テーブルを使用する必要があります。この表には、2つの列(vendor_idとvenue_id)と、両方の列にある主キーがあります。

2

どちらもありません。

両方の外部キー:ベンダーと会場の2つの列を持つ第3のテーブルを用意してください。

これはstandard approachであり、効率的です(少なくともインデックスが正しく設定されている場合)。小さな行がたくさんあることを心配しないでください。 (データを抽出して分割し、新しいクエリを作成する必要がありません)。

+1

アプローチ1は相互参照テーブルではなく、vendor_id、venue1(bool)、venue2(bool)、venue3(bool)などのようになります。 –

+0

@RyanP - そうです、質問が間違っています。 – Quentin

+1

ええ、私はほとんど同じことをしました。 ;) –

1

アプローチ3:vendor_idvenue_id主キー(vendor_id, venue_id)

中間体(別名ジャンクション)2列の表を作ります。最初の列はFOREIGN KEYvendor (vendor_id)で、2番目の列はvenue (venue_id)になります。あなたは、ベンダーはベンダーが表示されることが何場合(その開催地のためにそのベンダーの、など)specifoc会場、担当者

1

の販売を開始したときのような追加のデータを、保存したい場合は

はまた、より多くの列を追加します複数の会場で?過去/未来の日に特定の会場にいたベンダーを見たい場合はどうすればよいですか?

N:M関係を分解するために3番目のテーブル(会場ID、ベンダーID、その他の列)を使用します。複数の会場や複数のベンダーを1つの列に格納しないでください。ブール値を使用しないでください。通常は意味がありません。あなたの質問は、少なくとも、列挙型を使用しているからです。

関連する問題