質問

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

チームメンバーは、チーム内で複数の「ポジション」を保持できます。すべてのポジションはポジション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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top