2009-06-23 60 views
4

我有一些从多对多表中受益的表。例如团队表。多对多连接表可以有多于两列吗?

团队成员可以在团队中拥有多个“职位”,所有职位都列在职位db表中。召开之前的位置也被存储为了这个,我有一个单独的表,所以我有

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

简单,但关键现在正值一个团队成员可以属于很多球队aghhh。 我已经有一个team_to_member查询表。 现在问题出现了,我如何将一个职位与团队挂钩?一个成员可能在一个团队中担任团队负责人,并且目前是团队电台人员和新闻官员在另一个团队中。我怎样才能让每个成员的信息显示他的当前位置,以及他过去的历史,包括过去的球队。 我是否需要添加一个position_to team table,并以某种方式交叉引用,或者我可以将该队伍添加到该成员的职位表中?

这一切都很混乱,这正常化。

回答

5

这是完全合法的有TeamPositionMember表,用列

Team_Id 
Position_Code 
Member_Id 
Start_Date 
End_Date NULLABLE 

而且和主键,如果你想有一个替代ID列;否则它是一个3字段复合主键。 (无论如何,你需要一个唯一性约束。)

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

编辑:

如果你想日期,只是修改如上图所示,并添加START_DATE到PK,让同一个人持有在不同的时间相同的位置。

0

听起来像你需要一个多对多的立场,现在团队表。

+0

它看起来像我去尽可能多的多到多个表到最后,因为我的数据存储表,是正常的! – 2009-06-23 22:21:10

+0

是如果应用程序需要多对多的关系.... :) – Stuart 2009-06-23 22:22:53

+0

他,他,是的,我想这不会是我刚才从来没有像这样的东西的工作。本质上,成员可以在任何团队中工作,任何职位都可以工作,团队可以完成事件,这些事件具有地点,所有事件都会相互改变和交叉引用,并保留历史记录!许多到很多的手段,如果我也需要简单的查询,我可以将它们全部分开! thnkx – 2009-06-23 22:27:19

0

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

+0

但是,如果玩家可以有很多位置,失败...... – Matchu 2009-06-23 22:22:42

+0

若这些位置是不同的球队。一名球员可以在同一个球队中拥有不同的位置吗?然后它变得更复杂.. – MSpreij 2009-06-23 22:24:56

+0

是的想到一个团队作为游艇船员!一名成员可以是A队的队长,也可以是A队的新闻工作者。但是当他感到无聊时,他也只是B队的一名助手,因为他有事要做!如果我查找B队,我希望看到所有队员的名字,他们在B队的位置,也许还有队员的其他队伍和职位!混淆我知道! – 2009-06-23 22:42:43

4

我的第一个想法:

给你的多对多团队/成员表一个ID列。每个团队成员关系现在都有一个ID。

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

这样,团队可以有多个成员,成员可以有多个团队,成员可以在每个团队的基础上有多个职​​位。

现在一切都很好,干,所有的连接似乎工作。这对其他人来说是否合适?

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 
6

是的,许多一对多结表可以有额外的属性(列)。

例如,如果有一个名为多数民众赞成由PassengerID和FLIGHTID键PassengerFlight表的表,有可能是出在给定的飞行给乘客的状态的第三列。两种不同的状态可能是“确认”和“等待列出”,它们中的每一种都以某种方式编码。

此外,可以有三元关系,涉及三个实体,而不仅仅是两个关系。这些表将会有三个外键合在一起是关系表的主键。