如何建模表层次结构

时间:2011-01-07 21:04:23

标签: sql database-design architecture hierarchy

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

有一个派生表Driver_Team。在该表中有一个Driver_TeamId。在Race Results表中使用该Driver_TeamId。这似乎解决了我认为我将使用的大多数查询,但感觉很尴尬,我没有在任何地方看到它。

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

最后一个:拥有一个联结表Driver_Team,但在Race Results表中只有Driver.DriverId作为外键。问题是,像“团队x在赛季中获得多少积分/几个赛季”这样的问题确实非常糟糕。

我错过了另一种解决方案吗?如果是,请告诉我! :-)否则,哪些解决方案似乎最好?

谢谢!

5 个答案:

答案 0 :(得分:0)

您的第一个选项获得我的投票。我还建议添加一个Race表(用于保存跟踪,日期,条件等数据),并使Race_Results成为Driver_Team和Race的组合。

alt text

答案 1 :(得分:0)

我建议如下:

RaceResult - Driver - DriverTeam - Team

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

答案 2 :(得分:0)

只是头脑风暴,一个对象模型可能看起来像这样。注意RaceResult上明显缺少“id”字段,因为终点位置完全可以作为一个自然键(每个终点位置一个驱动器)。当然,也可能有很多其他选择。

Team:
  id
  name

Driver:
  id
  name
  team_id

Race:
  id
  venue
  date

RaceResults:
  position
  driver_id
  race_id

答案 3 :(得分:0)

对于你所讨论的那种查询,我认为DriverId和TeamId都应该在RaceResults中。如果要存储有关驱动程序和团队之间关联的其他信息,则应将其放在单独的表中。这似乎会产生一些冗余,因为竞赛表中的驾驶员/团队对将受到DriverTeam表中的雇佣日期的限制,但考虑到合同和时间表的复杂性,我认为最终可能不会特别多余的。

我喜欢您计划数据库支持查询的方式。多年来,我在DB设计中遇到了太多的OOP思想!

答案 4 :(得分:0)

如果您只在RaceResults表中存储DriverId和TeamId,那么您就无法将驱动程序与没有RaceResult的团队关联。

相关问题