数据库+类设计指南 - 这比它需要的更复杂吗?

时间:2015-01-02 14:28:04

标签: mysql oop database-design orm relational-database

新手关系数据库设计问题在这里。这是“我觉得我做错了。这是什么?”题。归结为,在设计关系数据库时如何避免不必要的复杂性。我也意识到这是一个关于类结构设计的问题,看到我正在使用ORM而我真的把这些表当作对象。

背景

让我们说我想记录一些未指定数量的“玩家”之间的竞争游戏的结果。这些玩家都属于“排行榜”,因此,排行榜有多个玩家并记录多个结果。每个玩家的“得分”在每个游戏结束时被记录并且属于单个“结果”实例(参见图像)。得分也是它所属的玩家的父级。

  

编辑:一个例子

     

leaderboard表格中的每一行代表一组共同组成联盟的玩家。例如,全部   属于网球联赛的球员也会有同样的表现   leaderboard_id表格中的player

     

results表格中的一行   代表属于的玩家之间发生的匹配   一个特定的联盟。所以leaderboard_id与我们相关联   球员被记录在这个联盟中的每个result。结果表   不会保持每个球员的得分,相反,我试图   规范化(可能不恰当地使用该术语的应用)   这些进入score表。

     

将这一切融合在一起。我们有一个   Leaderboard表中的联赛,其中有一场比赛   两个players之间。这些players属于联盟   题。这两名球员刚刚打了一场比赛并得分   记录为score表中的行。收集这些行   一起在一个results_id下,在一行中引用一行   results表。

enter image description here

问题

Q1 即可。这有意义吗?这个设计有什么明显的错误吗?

按原样,我可以轻松查询特定玩家随时间累积的分数,查找在特定结果中播放的玩家等等。但是,有些动作确实感觉它们应该很简单,但是,对我来说,感觉过于复杂。

例如,如果我想返回特定玩家的最新结果(即不是玩家的分数,而是包含属于的分数的结果我们的球员)。

所以,手动 Q2 。也许这只是缺乏SQL经验,但是,我不应该做JOIN来查找它,我应该吗?但那么,还有什么选择呢?我应该在玩家和结果之间创建一对多组合,以便我可以简单地查找玩家结果吗?

使用当前的设计来查找玩家的最新结果我需要做这样的事情(python sqlalchemy)

Score.query.join(Result, Player)\
           .filter(Player.id ==player_id)\
           .order_by(Result.timestamp.desc()).first()

这不好吗?

0 个答案:

没有答案