动态 SQL 表是个好主意吗?

Posted

技术标签:

【中文标题】动态 SQL 表是个好主意吗?【英文标题】:Dynamic SQL Tables A Good Idea? 【发布时间】:2016-03-20 15:16:02 【问题描述】:

我希望知识渊博的人能够帮助我解决我面临的问题。

我有一个游戏,我在其中使用 Rails 作为后端来处理许多任务,包括获取高分。在游戏中,用户可以创建自己的关卡,其他用户随后可以在这些关卡上玩。我目前通过以下方式将分数存储在一个名为“scores”的表中

level_id:关卡的id

user_id:关卡用户的id

total_score:用户在该级别上取得的分数

每次用户完成一个级别时,都会显示该级别的高分,但是我看到的问题是我必须为每个级别获取具有相应 level_id 的每个数据库条目,然后对获取的条目进行排序按 total_score 降序排列。我觉得好像有更好的方法可以做到这一点,因为我目前必须对每个级别的每个分数进行排序,这似乎是重复的,而且我发现如果表中有大量条目,这可能会很慢,获取 level_id。

我想知道是否有更好的方法是为每个级别创建一个表,该表可能包含 user_id 和 total_score,并按 total_score 排序。我觉得这似乎会减少需要执行的排序过程的数量,但我想知道在数据库中以这种格式拥有大量表是否有不利之处,或者是否可能有另一种方式解决这个问题?

谢谢,

约翰

【问题讨论】:

用户完成一个关卡后,您是要按降序显示该关卡的有限数量的高分还是该关卡的所有总分? 【参考方案1】:

没有。

您当前的设计很可能已经足够了,每个级别使用一个表会带来一些好处,但会带来很多麻烦。

基本上,ActiveRecord 是围绕“固定”模式构建的(它在运行时不会改变),让每个模型实例占用自己的表是行不通的。相对数据库不是文档存储。

您将需要 batsh*t 疯狂连接来从多个级别提取信息,并且您基本上必须手动执行各种查询或编写自己的 ORM。

您最有可能通过设置分数的默认顺序并加入来完成您想要做的事情:

@level = Level.eager_load(:scores)
              .find(params[:id])

但是首先你需要问问自己这是否是过早的优化过早的优化往往会导致对错误问题的错误答案。

【讨论】:

如果您的想法是在像 MongoDB 这样的非关系型数据库中,您可以将分数嵌入到 Level 文档中,那么您的想法将是有意义的。但是,在关系数据库中,您希望将相同的实体分组到同一个表中,这样您就可以有效地查询它,而不会一团糟。

以上是关于动态 SQL 表是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

将一个更大的数据库表分成更多表是个好主意吗

通过 Spring MVC 框架包含其他 JSP 是个好主意吗?

在 Angular7 应用程序中使用 ComponentFactoryResolver 是个好主意吗?

在 django 生产中记录所有 sql 查询是个好主意吗?

将数据库中的所有数据存储到redux存储中是个好主意

软删除是个好主意吗? [复制]