多対多の結合テーブルに3つ以上の列を含めることはできますか?
-
10-07-2019 - |
質問
多対多のテーブルの恩恵を受けるテーブルがいくつかあります。たとえば、チームテーブル。
チームメンバーは、チーム内で複数の「ポジション」を保持できます。すべてのポジションはポジションdbテーブルにリストされます。保持された以前のポジションもこのために保存されます別のテーブルがあるので、
- メンバーテーブル(チームの詳細を含む)
- 位置表(位置を含む)
- member_to_positionsテーブル(メンバーのIDおよびポジションのID)
- member_to_previous_positions(メンバーのIDとポジションのID)
簡単ですが、チームメンバーが多くのチームに所属できるようになったので、重要な点があります。 既にteam_to_memberルックアップテーブルがあります。 今、問題はどのようにチームにポジションを結び付けるのですか?メンバーは、あるチームのチームリーダーであった可能性があり、現在は別のチームのチームラジオマンおよび報道官です。メンバーごとに情報を取得して、現在の位置だけでなく、過去のチームなどの過去の履歴を表示するにはどうすればよいですか。 position_toチームテーブルを追加し、どういうわけかそれを相互参照する必要がありますか、それともメンバーをポジションテーブルに追加できますか?
すべてが非常に混乱しやすい、この正規化。
解決
列を持つTeamPositionMemberテーブルを持つことは完全に合法です
Team_Id
Position_Code
Member_Id
Start_Date
End_Date NULLABLE
および必要に応じて、主キーの代理ID列。それ以外の場合は、3フィールドの複合主キーです。 (とにかくこれには一意性制約が必要になります。)
この配置を使用すると、任意のポジションセットを持つチームを作成できます。チームには、ポジションごとに0人以上の人を配置できます。人はゼロ以上のチームのゼロ以上のポジションを埋めることができます。
編集:
日付が必要な場合は、上記のように修正し、Start_DateをPKに追加して、同じ人物が異なる時間に同じ位置を保持できるようにします。
他のヒント
はい、多対多のジャンクションテーブルには追加の属性(列)を含めることができます。
たとえば、PassengerIDとFlightIDをキーとするPassengerFlightテーブルというテーブルがある場合、特定のフライトの特定の乗客のステータスを示す3番目の列があります。 2つの異なるステータスが「確認済み」になる場合があります。および「リスト表示待ち」、それぞれが何らかの方法でコーディングされています。
さらに、3つの関係、つまり2つだけでなく3つのエンティティが関係する関係があります。これらのテーブルには、リレーションシップテーブルのプライマリキーである3つの外部キーが含まれます。
私の最初の考え:
多対多のチーム/メンバーテーブルにID列を与えます。すべてのチームとメンバーの関係にIDが追加されました。
次に、チームメンバーの関係に多対多のリンクポジションを作成します。
この方法では、チームは複数のメンバーを持つことができ、メンバーは複数のチームを持つことができ、メンバーはチームごとに複数のポジションを持つことができます。
今ではすべてが素晴らしく、乾燥しており、すべてのリンクが機能しているようです。それは他の誰にも聞こえますか?
チームテーブルに多対多のポジションが必要なようです。
実際には、team_to_memberテーブルには、メンバーがそのチーム内で持っている位置を記述する(またはこの場合は指す)ための余分な列position_idがあります。
member_to_previous_position
テーブルを削除します。 member_to_positions
を使用して、次の列を作成します。
MemberToPositionID (autoincrement OK only)
MemberID
PositionID
StartDate
EndDate
次に現在の位置を見つけるには、次のようにします。
select *
from member_to_positions
where EndDate is null