5

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

团队成员可以在团队中担任多个“职位”,所有职位都列在职位数据库表中。以前持有的职位也为此存储我有一个单独的表,所以我有

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

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

这一切都非常令人困惑,这种标准化。

4

6 回答 6

6

是的,多对多联结表可以具有附加属性(列)。

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

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

于 2009-06-24T02:11:03.917 回答
5

拥有一个包含列的 TeamPositionMember 表是完全合法的

Team_Id
Position_Code
Member_Id
Start_Date
End_Date NULLABLE

如果需要,还有主键的代理 ID 列;否则它是一个 3 字段复合主键。(无论如何,您都需要对此进行唯一性约束。)

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

编辑:

如果你想要日期,只需如上所示修改,并在PK中添加Start_Date,以允许同一个人在不同时间担任相同职位。

于 2009-06-23T22:35:37.470 回答
4

我的第一个想法:

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

然后创建与团队成员关系的多对多链接职位。

这样,团队可以有多个成员,成员可以有多个团队,并且每个团队的成员可以有多个职位。

现在一切都很好而且很干燥,所有的连接似乎都有效。这对其他人来说是否正确?

于 2009-06-23T22:24:22.797 回答
0

听起来你现在需要一个多对多的位置到团队表。

于 2009-06-23T22:20:22.433 回答
0

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

于 2009-06-23T22:22:01.460 回答
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
于 2009-06-23T22:57:42.637 回答