多对多联接表可以有两列以上吗?

时间:2009-06-23 22:16:37

标签: sql mysql database-design join many-to-many

我有一些表可以从多对多表中受益。例如团队表。

团队成员可以在团队中持有多个“职位”,所有职位都列在职位数据库表中。之前持有的仓位也存放了,我有一个单独的表,所以我有

  • 会员表(包含团队详细信息)
  • 职位表(包含职位)
  • member_to_positions表(成员的id和位置的id)
  • member_to_previous_positions(会员ID和职位ID)

很简单,但现在问题在于团队成员可以属于许多团队。 我已经有一个team_to_member查找表。 现在问题是如何将一个职位与团队联系起来?一名成员可能是一个团队的团队领导,目前是另一个团队的团队电台人员和新闻官。我如何只是提取每个成员的信息以显示他当前的位置,以及他过去的历史,包括过去的球队。 我是否需要添加一个position_to团队表并以某种方式交叉引用,或者我可以将团队添加到成员到职位表?

这非常令人困惑,这种正常化。

6 个答案:

答案 0 :(得分:6)

是的,多对多联结表可以有其他属性(列)。

例如,如果有一个名为PassengerFlight表的表由PassengerID和FlightID键入,则可能会有第三列显示给定航班上给定乘客的状态。两种不同的状态可能是“确认”和“等待列出”,每种状态都以某种方式编码。

此外,可能存在三元关系,涉及三个实体的关系,而不仅仅是两个。这些表将有三个外键,它们是关系表的主键。

答案 1 :(得分:5)

拥有一个包含

列的TeamPositionMember表是完全合法的
Team_Id
Position_Code
Member_Id
Start_Date
End_Date NULLABLE

如果需要,可以使用主键的代理ID列;否则它是一个3场复合主键。 (无论如何,你会想要一个唯一性约束。)

通过这种安排,您可以拥有一组任何职位。团队每个职位可以有零个或多个人。一个人可以为零个或多个团队填补零个或多个职位。

编辑:

如果您想要日期,只需按上图所示进行修改,并将Start_Date添加到PK,以允许同一个人在不同时间保持相同的位置。

答案 2 :(得分:4)

我的第一个念头:

为您的多对多团队/成员表提供ID列。每个团队到成员的关系现在都有一个ID。

然后为团队成员关系创建多对多链接位置。

这样,团队可以拥有多个成员,成员可以拥有多个团队,成员可以在每个团队中拥有多个职位。

现在一切都很好而干,所有连接起来似乎都有效。这对其他人来说听起来不错吗?

答案 3 :(得分:0)

听起来你现在需要一个多对多的职位来参加球队。

答案 4 :(得分:0)

你的team_to_member表确实可以有一个额外的列position_id来描述(或者在这种情况下指向)该成员在该团队中的位置。

答案 5 :(得分: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