SQL中带子表的连接表

时间:2009-07-15 22:23:53

标签: database entity-framework

我有一个由PlayerTeam联结表加入的两个sql表Players and Teams。玩家可以在团队中工作多年。处理这种关系的最佳方法是什么?我从一个PlayerTeamYear表开始,但是对PlayerTeam中两列的外键引用似乎都很笨重,特别是因为我想将它转换为Entity Framework。这必须是一种常见的情况。

谢谢!

2 个答案:

答案 0 :(得分:2)

我会将年份添加到PlayerTeam表中,因此它的主键中有三列。

答案 1 :(得分:0)

上面的建议很好。我实际上在PlayerTeam表中添加了两列:一年和一个代理键作为主键。

可以这样想:播放器表描述了所有玩家,团队表描述了所有团队,而PlayerTeam表描述了玩家和团队之间的关系。这种关系还应该包括球员在特定球队时的情况。

您可能还需要考虑其他一些事项。玩家是否有可能离开团队并且没有加入另一个团队?例如,玩家可以退休还是休息一年,你想记录下来吗?如果是这样,您可能需要考虑在PlayerTeam表中添加另一个日期列,以指示玩家何时离开特定团队。

如果您担心调用变得复杂,您可以考虑创建表,以便可以使用自然连接加入它们。自然连接(如果可用)连接在两个表中,其中有相同名称的列。一般来说,我喜欢解决这个问题的方式是这样的(请原谅伪代码):

PlayerTable:
(int) player_id PRIMARY KEY AUTOINCREMENT
...
other data

TeamTable:
(int) team_id PRIMARY KEY AUTOINCREMENT
...
other data

PlayerTeamTable:
(int) player_team_id PRIMARY KEY AUTOINCREMENT
(int) player_id FOREIGN KEY references PlayerTable(player_id)
(int) team_id FOREIGN KEY references TeamTable(team_id)
(datetime) joined_team
(datetime) left_team

通过这种方式,您可以运行一个简单的查询来查找当前属于特定团队的所有人:

select * from PlayerTable natural join TeamTable, PlayerTeamTable where team_name = 'Liverpool' and left_team = NULL;

或者那种效果。这可能不是特别有效(您可能希望在select查询上运行“explain”),但处理起来非常简单。