many-to-many 记录之间关系的正确数据库建模
Proper database modeling for many-to-many relationship between records
我构建了一个小型数据库应用程序,我可以使用一些关于最佳方法的输入来创建我的 table 之间的关系。
我想我已经弄明白了,但我已经盯着它看了太久了,我需要第二套眼睛和意见。
此模型适用于赛车 driver。我在设置关系时卡住的地方是部门 table。基本上一个driver可以分多个。为了解决这个问题,我添加了一个 DriverDivision table,它基本上是一个允许我将 driver 映射到多个分区的查找。
您可以从 driver 的模型中看到还有一个 PointsStanding
和一个 RaceResults
table。这与 driver 关联为 1:M。我遇到困难的地方是我还需要按部门过滤结果和排名。我还需要在 Division 和这两个 table 之间创建查找 table 吗?查看模型我可以通过 DriverInfo 页面获得所有结果,但我不知道这是否是正确的方法?导航这将始终 return 一个完整的 object 所以我可以看到所有结果以及与之相关的 drivers。我是偏离轨道还是有更好的 model/pattern 可以遵循?当我第一次开始这个模型时,我认为 driver 将是主要点,但感觉可能是除法。 driver 必须与分区相关联,积分和结果与 driver 相关联,但我需要能够按分区查看所有积分和所有排名。
如果有任何建议或建议,我将不胜感激。
-干杯
首先,DriverDivisionId 是做什么用的?我假设您将它用作 division/driver 组合的主键,但您可以同时使用 DivisionId 和 DriverId 作为主键。
其次,您也可以将 divisionId 添加到积分榜和比赛结果中,然后使用 driverId 和 divisionId 来获取特定 division/racer 组合的结果
编辑:
考虑一分钟后,我想我会再添加一个 table,一个 'Race' table,这将是所有种族的列表。在那里你需要一个 'RaceId' 来识别种族。然后你可以在那里存储关于这场比赛的所有信息(包括分区),并且在 RaceResults table 中你会有你的 RaceId,DriverId,PositionFinished,PositionStarted,RacerPoints
据我了解您的post,一名赛车手参加了多场比赛,每场比赛都属于一个组别。
一个问题是,车手是否可以属于一个部门但不参加该部门的任何比赛?根据答案,您可能不需要 Driver 和 Division 之间的关系。 RaceResult 和 Divison 之间的关系更有意义。
所以你会得到类似的东西:
Driver -->> RaceResult <<-- Race
<<-- Division
在我看来,您可以根据过去的比赛结果计算排名。如果那是真的,我根本不会将排名存储在数据库中。存储您也可以计算的结果必然会导致不一致:例如,如果某些更新了比赛结果,但没有更新排名。
最后,您的 table 结构对于初始设计来说似乎非常通用。我会尝试将其简化为应用程序第一个版本所需的基本信息存储。
我构建了一个小型数据库应用程序,我可以使用一些关于最佳方法的输入来创建我的 table 之间的关系。
我想我已经弄明白了,但我已经盯着它看了太久了,我需要第二套眼睛和意见。
此模型适用于赛车 driver。我在设置关系时卡住的地方是部门 table。基本上一个driver可以分多个。为了解决这个问题,我添加了一个 DriverDivision table,它基本上是一个允许我将 driver 映射到多个分区的查找。
您可以从 driver 的模型中看到还有一个 PointsStanding
和一个 RaceResults
table。这与 driver 关联为 1:M。我遇到困难的地方是我还需要按部门过滤结果和排名。我还需要在 Division 和这两个 table 之间创建查找 table 吗?查看模型我可以通过 DriverInfo 页面获得所有结果,但我不知道这是否是正确的方法?导航这将始终 return 一个完整的 object 所以我可以看到所有结果以及与之相关的 drivers。我是偏离轨道还是有更好的 model/pattern 可以遵循?当我第一次开始这个模型时,我认为 driver 将是主要点,但感觉可能是除法。 driver 必须与分区相关联,积分和结果与 driver 相关联,但我需要能够按分区查看所有积分和所有排名。
如果有任何建议或建议,我将不胜感激。
-干杯
首先,DriverDivisionId 是做什么用的?我假设您将它用作 division/driver 组合的主键,但您可以同时使用 DivisionId 和 DriverId 作为主键。
其次,您也可以将 divisionId 添加到积分榜和比赛结果中,然后使用 driverId 和 divisionId 来获取特定 division/racer 组合的结果
编辑:
考虑一分钟后,我想我会再添加一个 table,一个 'Race' table,这将是所有种族的列表。在那里你需要一个 'RaceId' 来识别种族。然后你可以在那里存储关于这场比赛的所有信息(包括分区),并且在 RaceResults table 中你会有你的 RaceId,DriverId,PositionFinished,PositionStarted,RacerPoints
据我了解您的post,一名赛车手参加了多场比赛,每场比赛都属于一个组别。
一个问题是,车手是否可以属于一个部门但不参加该部门的任何比赛?根据答案,您可能不需要 Driver 和 Division 之间的关系。 RaceResult 和 Divison 之间的关系更有意义。
所以你会得到类似的东西:
Driver -->> RaceResult <<-- Race
<<-- Division
在我看来,您可以根据过去的比赛结果计算排名。如果那是真的,我根本不会将排名存储在数据库中。存储您也可以计算的结果必然会导致不一致:例如,如果某些更新了比赛结果,但没有更新排名。
最后,您的 table 结构对于初始设计来说似乎非常通用。我会尝试将其简化为应用程序第一个版本所需的基本信息存储。