首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Ruby on Rails应用程序中将一个表拆分为3个表

在Ruby on Rails应用程序中将一个表拆分为3个表
EN

Stack Overflow用户
提问于 2012-01-05 14:30:57
回答 4查看 100关注 0票数 0

我有一个名为Stream的类,它的数据库中有许多记录,而且还在不断地向其中添加更多的记录。streams表中名为rating的字段可以是-1、0、1或为null。我会说“rating”为rating -1、0或1,而"unrated“为空。到目前为止,streams表中有24M条记录。有20M是有等级的,4M是未有等级的。需要经常在streams表中查询未评级的记录。问题是,查询这么大的表需要时间。

我想把streams表分解成3个单独的表。可以有一个分级流表、一个未分级流表和一个旧的未分级流表。它的工作方式是,创建一个新的流。新记录未分级,因此将其放入未分级流表中。如果已评等,则会将其移动到“评等流”表中。如果超过一周未评级,它将被移动到旧的未评级流表中。我仍然需要能够无缝地使用Stream类中的方法和关联,例如:

代码语言:javascript
复制
buzz.rated_streams.first
interest.unrated_streams.first
user.old_streams.first
RatedStream.find(1).buzz
UnratedStream.find(2).interest
OldStream.find(3).user

可以更快地查询未评级的streams表。rated表对于分析很有用。旧的未分级的streams表将是旧数据的转储。

我有几个问题要问。打破桌子是个好主意吗?如果是这样,我该如何做才能避免破坏一切,并使用Stream类中相同的方法和关联呢?如果打破桌子是一个坏主意,我应该怎么做呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-05 14:33:47

我觉得这是个不错的主意。大量的自定义代码(不能保证能正常工作)。

相反,您应该在rating上创建索引。这可能会解决查询的所有问题(您可能还希望将其设为covered )。

票数 1
EN

Stack Overflow用户

发布于 2012-01-05 16:28:39

一个好的设计取决于为什么你需要频繁查询一个有400万个匹配项的布尔属性。您是否在维护要评级的流的待办事项列表?您是否正在显示“未分级流的数量”计数器?您是否也在通过其他属性进行查询?

假设是第一个,你可以这样做

  • 拥有streams表中有关流的大部分信息。
  • 创建一个streams_ratings表,该表通过belongs_to :streams
  • 创建streams_tasks表,该表具有belongs_to :streams的优先级、分配的评核人、分配的日期等。通过对需要使用StreamTask.first(:assignee => 'unassigned').stream进行评级的流进行索引。您可以使用命名作用域创建此smoother.
  • When完成后,创建一个新的StreamTask

并删除该StreamRating

票数 1
EN

Stack Overflow用户

发布于 2012-01-05 15:25:42

不确定您使用的是哪个DB,但您可以对表进行分区以提高性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8738541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档