新手关系数据库设计问题在这里。这是“我觉得我做错了。这是什么?”题。归结为,在设计关系数据库时如何避免不必要的复杂性。我也意识到这是一个关于类结构设计的问题,看到我正在使用ORM而我真的把这些表当作对象。
让我们说我想记录一些未指定数量的“玩家”之间的竞争游戏的结果。这些玩家都属于“排行榜”,因此,排行榜有多个玩家并记录多个结果。每个玩家的“得分”在每个游戏结束时被记录并且属于单个“结果”实例(参见图像)。得分也是它所属的玩家的父级。
编辑:一个例子
leaderboard
表格中的每一行代表一组共同组成联盟的玩家。例如,全部 属于网球联赛的球员也会有同样的表现leaderboard_id
表格中的player
。
results
表格中的一行 代表属于的玩家之间发生的匹配 一个特定的联盟。所以leaderboard_id
与我们相关联 球员被记录在这个联盟中的每个result
。结果表 不会保持每个球员的得分,相反,我试图 规范化(可能不恰当地使用该术语的应用) 这些进入score
表。将这一切融合在一起。我们有一个
Leaderboard
表中的联赛,其中有一场比赛 两个players
之间。这些players
属于联盟 题。这两名球员刚刚打了一场比赛并得分 记录为score
表中的行。收集这些行 一起在一个results_id
下,在一行中引用一行results
表。
Q1 即可。这有意义吗?这个设计有什么明显的错误吗?
按原样,我可以轻松查询特定玩家随时间累积的分数,查找在特定结果中播放的玩家等等。但是,有些动作确实感觉它们应该很简单,但是,对我来说,感觉过于复杂。
例如,如果我想返回特定玩家的最新结果(即不是玩家的分数,而是包含属于的分数的结果我们的球员)。
所以,手动 Q2 。也许这只是缺乏SQL经验,但是,我不应该做JOIN
来查找它,我应该吗?但那么,还有什么选择呢?我应该在玩家和结果之间创建一对多组合,以便我可以简单地查找玩家结果吗?
使用当前的设计来查找玩家的最新结果我需要做这样的事情(python sqlalchemy)
Score.query.join(Result, Player)\
.filter(Player.id ==player_id)\
.order_by(Result.timestamp.desc()).first()
这不好吗?