3

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

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

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

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

4

3 回答 3

3

我能想到要考虑的六个主要项目,最后五个与 Rails 的“魔法”有关:

  1. 速度。这是巨大的。Active Record,一次插入每行可能需要一秒钟。因此,对于一百万行来说,这是一百万秒 - 那是 11.5,这将给许多人带来不好的评价!

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

  3. 时间戳。如果您想像 rails 一样更新 created_at / updated_at ,您需要手动更新时间戳

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

  5. ActiveRecord gems例如,如果您使用acts_as_audited,它可以让您保留对模型记录的数据更改的记录跟踪,如果您在ActiveRecord 之外,您将没有该功能。

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

于 2012-05-24T00:14:47.827 回答
1

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

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

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

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

于 2012-05-23T23:39:23.943 回答
0

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

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

数据操作——这在某种程度上与数据验证有关,但如果您正在执行任何类型的数据操作(在网络上的数据输入和插入数据库之间),您至少希望在上传时重新创建此操作它。

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

于 2012-05-23T23:34:54.103 回答