2011-01-07 96 views
1

我正在尝试制作关于公式1的应用程序。我有三个表格:Team,Driver和Race Results。我在考虑三种选择(也许我错过了更多):如何建模表层次结构

有派生表Driver_Team。在该表中有一个Driver_TeamId。在比赛结果表中使用该Driver_TeamId。这似乎解决了我认为我将要使用的大多数查询,但感觉很尴尬,我从来没有见过它。

在比赛结果表中有Driver.DriverId和Team.TeamId。这存在无法添加额外信息的问题。我还不知道什么信息,也许是加入新团队开始的日期。然后我需要一个联结表(因为这些信息不是与Race Result相关的)。

最后一个:有一个联结表Driver_Team,但在Race Results表中只有Driver.DriverId作为外键。问题是,诸如“球队x在季节/几个赛季获得多少分”这样的疑问实在太可怕了。

我是否缺少另一种解决方案?如果是,请告诉我! :-)否则,这些解决方案哪一个最好?

谢谢!

回答

0

您的第一个选项获得我的投票。我还建议添加一个Race表(保存诸如曲目,日期,条件等数据),并将Race_Results设置为Driver_Team和Race的组合。

alt text

+0

是的,别人的建议,以及增加一个种族表,我完全同意。在里面!我已经绘制出来了,它有很大的意义,有三张表Race,Team和Driver的交界表。 – 2011-01-07 21:36:16

0

我建议如下:

RaceResult - 驱动程序 - DriverTeam - 团队

凡RaceResult包含race_date,DriverTeam包含(driver_idteam_idteam_join_dateteam_leave_date)。然后,即使查询可能很复杂,您也可以获得所有关于您的问题的信息。

+0

所以,比赛结果表只包含race_date?或者你的意思是说那张桌子也得到了driver_id和team_id? – 2011-01-07 21:33:16

+0

你应该接受Joe Stefanelli的回答。即使我的想法和日期很好,他的快速肮脏的解决方案将完成这项工作。 – 2011-01-07 21:43:49

0

只是头脑风暴,一个对象模型可能看起来像这样。请注意RaceResult上“id”字段的显着缺失,因为终点位置完美地作为一个自然键(每个终点位置有一名车手)。当然,也可能有很多其他选项。

Team: 
    id 
    name 

Driver: 
    id 
    name 
    team_id 

Race: 
    id 
    venue 
    date 

RaceResults: 
    position 
    driver_id 
    race_id 
+0

使用比赛表感兴趣。当然有其中之一是有道理的。但是,你是否仍然需要写一个很长的查询来查看一个团队x在季节/几个赛季得到多少分?由于一个团队一个赛季最多可以有四名车手,所以查询至少包含一个IN和一些日期比较...... – 2011-01-07 21:32:42

0

对于你说的那种查询,我认为DriverId和TeamId都应该在RaceResults中。如果您想存储有关驾驶员与团队之间的关联的其他信息,则应将其放置在单独的表格中。这似乎创造冗余的一点点,因为在比赛中表中的驱动器/队对将在DriverTeam表就业日期的限制,但考虑到合同和日程安排的复杂性,我认为这可能最终会被不特别多余的。

我喜欢你计划数据库的方式来支持你的查询。多年来,我在DB设计中遇到过多的面向对象思维!

0

如果您只存储DriverId和TeamId在RaceResults表,那么你就不能驾驶一个团队没有RaceResult关联。