2010-05-04 117 views
5

我有一些数据值需要存储在我的rails应用程序中,并且想知道是否有任何替代方法可以创建数据库表来执行此简单任务。将数据存储在没有数据库的Ruby on Rails中

背景:我正在为Rails应用上的ruby写一些分析和仪表板工具,我希望通过缓存永远不会改变的结果来加速仪表板。现在,我将所有用户拖至最近30天,并对其进行重新排列,以便每天可以看到新用户的数量。它效果很好,但需要相当长的时间,实际上我只需要计算最近的一天,并将其余的数组存储在其他地方。

哪里是最好的方式来存储这个数组?

创建数据库表似乎有点矫枉过正,我不确定全局变量是否是正确的答案。坚持这样的数据是否有最佳做法?

如果有人做过这样的事情,请告诉我你做了什么以及结果如何。

回答

11

Ruby有一个名为PStore的内置哈希键值存储库。这提供了简单的基于文件的事务持久性。

+0

我很喜欢这个,不知道它是否存在,基于问题描述,并且经验是否会推荐这种方法而不是其他建议“仅使用数据库”? – Schneems 2010-05-04 15:45:40

+0

如果你的用例只是序列化一个数组,它听起来是这样的,那为什么不呢?如果它不适合你,那么很容易就可以换成另一种解决方案。 – 2010-05-04 15:51:56

1

使用像sqlite这样的轻量级数据库不应该感觉像是过度杀伤。或者,您可以使用像东京内阁这样的密钥存储解决方案,或者甚至手动将数组存储在一个平面文件中,但是我真的没有看到使用sqlite时有任何矫枉过正。

+0

我猜矫枉过正我觉得将来自写架构,迁移数据库,处理在我的Rails项目中的两个不同的适配器(目前使用MYSQL的everythign其他),然后编写sql查询(因为这些项目不与模型绑定)...当一天结束时,我想要回来的是[1,2,3,4,5] 。我不介意做这一切,我只是好奇,看看别人如何接近相同的情况。 – Schneems 2010-05-04 15:01:01

1

如果你有一个数据库已经,这真的不是什么大不了的事,以创建一个单独的表来跟踪这样的事情。在进行报告时,创建与您所描述的完全相同的衍生汇总表通常对您有利。您可以使用简单的SQL语句根据需要更新这些内容,并且不用担心临时存储会以某种方式消失。

这就是说,您试图生成的报告类型实际上是可以实时完成的事情,除了超大型数据集之外。关键是要有索引来描述你想要做的确切的分组操作。例如,如果按日历日期分组,则可以根据需要创建“日期”字段并将其同步到“created_at”时间。在这个日期字段上的索引将做一个GROUP BY CREATED_DATE非常快:

SELECT created_date AS on_date, COUNT(id) AS new_users FROM users GROUP BY created_date 
+0

不幸的是,我不是仅仅为用户做这件事,而是其他一些元素,比如每天发送的数千封电子邮件数量(以每天为单位),因此拉动最后30天的模型数据需要花费很长时间。 然后,一旦我得到的对象,我必须采取created_at(日期/时间对象)和评估迭代通过组合对象。也许有更好的办法,但我还没有能够击中头部。 – Schneems 2010-05-04 15:41:36

+1

添加一个索引列,它是一个日期而不是日期时间,这将有助于在首先生成报告时提供帮助。即使对于大量数据,一次添加一天的数据也是非常有效的,但添加所有历史数据的设置时间可能相当长。插入分组计数应该只需几秒钟,并且最多只需要每天进行一次,可以轻松完成后台任务或cron任务。如果你想要做的就是计算它们,不要实际加载模型。直接使用SQL。 – tadman 2010-05-04 17:10:08

相关问题