将大型数据集加载到Rails应用程序中

时间:2012-05-23 23:25:41

标签: mysql ruby-on-rails activerecord rails-models activerecord-import

我正在处理数百万行数据,我想将其作为模型加载到我的Rails应用程序中。我正在使用MySQL作为数据库,而我正在使用Rails 2.3.14。

我的一位同事表示,不建议直接向MySQL添加记录,绕过Rails ActiveRecord系统。他缺乏具体细节,但它的要点是当你使用它的ActiveRecord系统时,Rails会做很多“魔术”,如果你在这个系统之外输入数据,它会混淆Rails。有人可以详细说明这是否准确?

如果我应该通过ActiveRecord将数据加载到Rails中,我已经读过activerecord-import插件是这类工作的方法。

欢迎任何有关将大量数据加载到Rails中的最佳方法的反馈。

3 个答案:

答案 0 :(得分:3)

我可以想到要考虑的六个主要项目,后五个涉及rails'magic':

  1. <强>速度即可。这是巨大的。活动记录,一次一个插入可能每行需要一秒钟。因此,对于一百万行而言,这是一百万秒 - 这是11.5 DAYS ,这会让很多人不好说唱!

  2. <强>验证即可。您需要确保数据库强制执行模型/现有数据中的相同验证。

  3. <强>时间戳即可。如果要以与rails相同的方式更新created_at / updated_at,则需要手动更新时间戳

  4. 计数器缓存。您需要手动更新计数。

  5. ActiveRecord gems 例如,如果您使用acts_as_audited来保存数据更改到模型记录的记录跟踪,那么如果您在ActiveRecord之外,则不会具有该功能。< / p>

  6. 模型层的业务逻辑。优秀的程序员尽可能将功能放在模型(或更高)级别。这可能包括更新其他数据,发送电子邮件,写入日志等项目。如果未调用ActiveRecord,则不会发生这种情况。

答案 1 :(得分:1)

直接插入MySQL可能会绕过模型观察者,计数器缓存以及您的应用依赖ActiveRecord为您做的其他功能。如果您决定将数据直接插入MySQL,请注意这一点,并确保考虑ActiveRecord将进行的所有更改和验证。无论您编写什么插入脚本都应该进行相同的更改。

示例:您有studentsteachers个表。将记录插入students可能需要您更新teachers.students_count计数器缓存列ActiveRecord通常会为您增加。

除此之外,没有理由不能直接插入数据。除了这些担忧之外,任何担忧都只是毫无根据的FUD。

使用ActiveRecord的真正瓶颈是ActiveRecord模型对象的实例化,这非常复杂。您可能需要考虑将插入/导入脚本编写为rake任务,并使用arel(支持ActiveRecord的低级查询接口)或类似activerecord-import的gem。请记住,这两种方法都会(或至少可以)跳过正常的验证,观察者,计数器缓存等,因此您仍然需要自定义逻辑来解释这一点。

答案 2 :(得分:0)

有几个原因,你不应该直接加载它。其中一些可能适用于您,也可能不适用于您。

数据验证 - 您正在加载尚未验证的数据。您的rails应用程序可能对加载的数据做出了一些假设。此外,未经验证的数据可能会引发一些有趣的问题,因为它会在您的应用程序中运行。

数据操作 - 这与数据验证有一定关系,但如果您正在进行任何类型的数据操作(在Web上的数据输入和插入数据库之间),您至少需要重新创建此操作当你上传它。

总的来说,这可能不是最好的主意,但这不是因为rails中的“魔法”,而是因为你的数据内置了假设,你没有重新创建直接转储。