【问题标题】:Store data in Ruby on Rails without Database在没有数据库的情况下在 Ruby on Rails 中存储数据
【发布时间】:2010-05-04 14:45:39
【问题描述】:

我有一些数据值需要存储在我的 Rails 应用程序中,我想知道是否有任何替代方法可以创建数据库表来完成这个简单的任务。

背景:我正在为我的 ruby​​ on rails 应用程序编写一些分析和仪表板工具,我希望通过缓存永远不会改变的结果来加速仪表板。现在我拉出过去 30 天的所有用户,并重新排列它们,以便我可以看到每天的新用户数量。它工作得很好,但需要很长时间,实际上我只需要计算最近的一天,然后将数组的其余部分存储在其他地方。

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

创建数据库表似乎有点矫枉过正,我不确定全局变量是正确的答案。有没有像这样持久化数据的最佳实践?

如果有人之前做过类似的事情,请告诉我你做了什么以及结果如何。

【问题讨论】:

    标签: ruby-on-rails database caching


    【解决方案1】:

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

    【讨论】:

    • 我很喜欢这个,不知道它存在,根据问题描述,经验你会推荐这种方法而不是“只使用数据库”的其他建议吗?
    • 如果您的用例只是序列化一个数组,听起来就是这样,那为什么不呢?如果它不适合您,那么很容易更改为其他解决方案。
    【解决方案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 (日期/时间对象)并评估迭代以对对象进行分组。也许有更好的方法,但我还没能一针见血。
    • 添加一个可索引的列,它是日期而不是日期时间,这将有助于首先生成报告。一次添加一天的数据也相当有效,即使对于大量数据也是如此,但是添加所有历史数据的设置时间可能相当长。插入分组计数应该只需要几秒钟,并且每天最多只需完成一次,作为后台作业或 cron 任务很容易完成。如果您只想计算模型,请不要实际加载模型。直接使用 SQL 即可。
    【解决方案3】:

    使用像 sqlite 这样的轻量级数据库不应该是一种矫枉过正的感觉。或者,您可以使用像 tokyo cabinet 这样的密钥存储解决方案,甚至可以手动将数组存储在一个平面文件中,但我真的不认为使用 sqlite 有什么过分的做法。

    【讨论】:

    • 我想我觉得过度杀伤力来自于编写模式、迁移数据库、在我的 Rails 项目中处理两个不同的适配器(目前使用 MYSQL 处理其他所有问题),然后编写 sql 查询(因为这些项目没有与模型绑定)......在一天结束时,我想要回来的只是 [1,2,3,4,5]。我不介意做所有这些,我只是想看看其他人是如何处理同样情况的。
    猜你喜欢
    • 2010-10-23
    • 2011-08-31
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多