2009-06-23 15 views
4

多対多テーブルの恩恵を受けるいくつかのテーブルがあります。たとえば、チームテーブル。多対多の結合テーブルに複数の列がありますか?

チームメンバーはチーム内で複数の「ポジション」を保持することができ、すべてのポジションはポジションdbテーブルにリストされます。保持された前回の位置は、このために記憶されている私は別のテーブルを持っているので、私は(チームの詳細を含む)

  • メンバテーブル部材の
  • member_to_positionsテーブル(位置を含む)
  • 位置テーブルは、(IDを持っていると位置のID)
  • member_to_previous_positions(位置のメンバーとIDのID)
シンプル

は、しかし、最も重要な点は、チームメンバーが多くのチームのaghhhに属することができることを今しています。 私はすでにteam_to_memberルックアップテーブルを持っています。 問題はどのようにしてチームにポジションを結び付けるのでしょうか?メンバーはあるチームのチームリーダーであった可能性があり、現在はチームのラジオ・マンとプレス・オフィサーです。自分の現在のポジションだけでなく、過去のチームを含めた彼の過去の履歴も表示するには、メンバーごとに情報を引き出すだけです。 position_toチームテーブルを追加して何らかの形でそれを参照する必要がありますか、メンバーチームにポジションテーブルを追加できますか?

この正規化はすべて非常に混乱しています。

答えて

5

それは列

Team_Id 
Position_Code 
Member_Id 
Start_Date 
End_Date NULLABLE 

そして、あなたがしたい場合は、主キーのサロゲートID列で、TeamPositionMemberテーブルを持っていることは完全に合法です。それ以外の場合は、3フィールドの複合主キーです。 (とにかくこれには一意性の制約が欲しいでしょう)

この配置では、任意の位置のチームを持つことができます。チームは1人のポジションで0人以上の人を持つことができます。 0人以上のチームに0人以上のポジションを記入することができます。

EDIT:あなたは日付が、ちょうど上記のように修正し、同じ人が、異なる時間に同じ位置を保持できるようにするためにPKにSTART_DATEを追加したい場合は

+0

ああ、私は2つ以上の列にプライマリキーを割り当てることができるので、興味深いです。 (これを構築するためにmysqlのworkbenchを使用しています)。フィールドごとにPKをチェックします。 –

+0

このモデルには多くの繰り返しがありますが... – Matchu

+0

Repetition?これは、重複が防止された状態で最小限に抑える必要があります。 – dkretz

0

多人数のチームからチームへのポジションが必要なように聞こえます。

+0

私はデータストレージテーブルのように多くの多対多テーブルで終わるように見えますが、それは普通です! –

+0

アプリケーションが多対多の関係を必要とする場合は.... – Stuart

+0

彼はそうです。基本的にメンバーはどのチームにいても構いませんし、チームはあらゆる場所で働くことができます。私はあまりに簡単なクエリを簡単にする必要がある場合、私はそれらをすべて分離することができます! thnkx –

0

あなたのteam_to_memberテーブルには、メンバーがそのチーム内にある位置を説明するための追加の列position_idがあります。

+0

しかし、プレイヤーが多くのポジションを持つことができれば、これは失敗します... – Matchu

+0

これらのポジションが異なるチームのものではない場合。プレイヤーは同じチーム内で異なるポジションを持つことができますか?その後、それはより複雑になります.. – MSpreij

+0

はい、ヨットの乗組員としてチームを考える!メンバーはチームAの選手とチームAの選手になることができます。しかし、退屈なときは、チームBのウイッチマンでもあります。私がチームBを見ると、すべてのメンバーの名前、チームBの位置、そしておそらくメンバーの他のチームとポジションを見たいと思っています!私は分かりません! –

4

私が最初に考えた:

は、あなたの多対多のチーム/メンバーテーブルにID列を与えます。すべてのチームとメンバーの関係にIDが追加されました。

次に、チームメンバー関係に多対多のリンク位置を作成します。

このように、チームは複数のメンバーを持つことができ、メンバーは複数のチームを持つことができ、メンバーはチームごとに複数のポジションを持つことができます。

今はすべて素敵でドライです。すべてのリンクがうまくいくようです。それは他の誰にとっても正しいと思いますか?

+0

私の声が聞こえます。決して多対多のリンクテーブルは、通常のテーブルを別の多対多のリンクテーブル(phew)に結びつけています。きちんとしたトリックです。 – MSpreij

+0

Matchu、チームからメンバーへの多対多のテーブルを使用して、IDを追加すると、これをインデックスにしてteam_idとmember_idを共同の主キーとして保持しますか?それともインデックスとして持っていないのですか? –

+0

また、締め切り日、チームまたはポジションテーブルの終了日を追加します。その複雑さ。 –

0

member_to_previous_positionテーブルを取り除く。ただ、member_to_positionsを使用して、これらの列があります。

MemberToPositionID (autoincrement OK only) 
MemberID 
PositionID 
StartDate 
EndDate 

そして、現在の位置を見つけるために、あなたがない:

select * 
from member_to_positions 
where EndDate is null 
+0

チームへのリンクはどうですか? – Matchu

6

はい、多対多接合テーブルには、追加属性(列)を持つことができます。

たとえば、PassengerIDとFlightIDによってキーが設定されたPassengerFlightテーブルというテーブルがある場合、指定されたフライトの特定の乗客のステータスを示す3番目の列があります。 2つの異なるステータスが「確認済み」と「待機中」と表示され、それぞれが何らかの形でコード化されています。

さらに、三項関係、三つのエンティティを含む関係、二人だけではない関係もあります。これらのテーブルには、3つの外部キーがあり、それらは一緒になってリレーションシップテーブルの主キーとなります。

+1

ウォルターは本当にこのアイデアが好きで、全体のコンセプトをよりよく理解するのを助けました。彼の例が私の手助けをしてくれたので、私は正しい答えとしてle dorfierを選びました。 –

関連する問題