在Ruby on Rails中存储数据而不使用数据库

6
我有几个数据值需要存储在我的rails应用程序中,想知道是否有其他方法来完成这个简单的任务而不是创建数据库表。
背景:我正在为我的ruby on rails应用程序编写一些分析和仪表板工具,并希望通过缓存永远不会改变的结果来加快仪表板速度。现在我拉取过去30天的所有用户,并重新排列它们,以便我可以看到每天新增用户的数量。虽然效果很好,但是实际上需要相当长的时间,事实上,我只需要计算最近的一天,然后将其余的数组存储在其他地方。
哪里是存储此数组的最佳方式?
创建数据库表似乎有点过头了,而且我不确定全局变量是否是正确的答案。是否有关于持久化像这样的数据的最佳做法?
如果有人之前做过类似的事情,请告诉我你做了什么以及结果如何。
3个回答

11

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


我非常喜欢这个,之前不知道它的存在。基于问题描述和经验,您会推荐使用这种方法而不是其他建议中的“只使用数据库”吗? - Schneems
如果您的用例只是序列化一个数组,就像您所说的那样,那为什么不呢?如果它对您不起作用,那么随时可以换成另一种解决方案。 - John Topley

2
如果您已经有了一个数据库,为了追踪这种事情,创建一个单独的表并不是什么大问题。在进行报告时,通常最好创建类似于您描述的派生摘要表。您可以使用简单的SQL语句根据需要更新这些表,而且不用担心您的临时存储会消失。
话虽如此,您试图生成的报告类型实际上是可以在实时环境下完成的,除非数据集非常庞大。关键是要有描述您正在尝试执行的确切分组操作的索引。例如,如果您按日历日期分组,则可以创建一个“日期”字段,并根据需要将其同步到“created_at”时间。对该日期字段的索引将使GROUP BY created_date非常快速。
SELECT created_date AS on_date, COUNT(id) AS new_users FROM users GROUP BY created_date

不幸的是,我不仅为用户做这个,还有其他一些元素,比如每天发送的邮件数量,这个数字是以千计计算的(每天),所以拉取过去30天的模型数据需要很长时间。然后,一旦我得到了对象,我必须获取created_at(日期/时间对象)并迭代评估以对对象进行分组。也许有更好的方法,但我还没有找到最佳解决方案。 - Schneems
1
添加一个可索引的列,其中它是一个日期而不是日期时间,这将有助于在生成报告时。每次只添加一天的数据也是相当有效的,即使对于大量数据也是如此,但是添加所有历史数据的设置时间可能会相当长。插入分组计数应该只需要几秒钟,并且每天最多只需要执行一次,可以轻松作为后台作业或cron任务完成。如果您只想计算模型,请不要实际加载模型。直接使用SQL即可。 - tadman

1

使用像sqlite这样的轻量级数据库不应该感觉过度。或者,您可以使用键值存储解决方案,如tokyo cabinet,甚至手动将数组存储在平面文件中,但我真的没有看到在使用sqlite时有任何过度的问题。


我猜我感到过度的原因是要编写模式、迁移数据库、在我的Rails项目中处理两个不同的适配器(目前为其他所有内容使用MYSQL),然后编写SQL查询(因为这些项目与模型没有关联)......当一天结束时,我只想得到[1,2,3,4,5]。我不介意做所有这些事情,我只是好奇看看别人如何处理相同的情况。 - Schneems

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接