更新非规范化数据库表

我正在使用Ruby on Rails 3.0.7和MySQL 5.在我的应用程序中,我有两个数据库表,比如TABLE1和TABLE2,并且出于性能原因,我已经在TABLE2中对一些数据进行了非规范化,因此我在那一个中​​重复了TABLE1的值。 现在,在TABLE1中,我需要更新一些涉及的值,当然,我必须正确更新TABLE2中的非规范化值。

我能做些什么来以高效的方式更新这些值? 也就是说,如果TABLE2包含很多值(1.000.000或更多),那么保持更新两个表(技术,实践,……)的最佳方法是什么?

在更新数据库表所花费的时间内会发生什么? 例如,用户在加入某些涉及非规范化值的网站页面时会遇到一些问题? 如果是这样,那些是什么以及如何处理这种情况?

有几种方法可以处理这种情况:

  1. 您可以使用数据库触发器。 这不是一个与数据库无关的选项,据我所知,它的RoR支持是不存在的。 如果你的情况绝对没有数据不一致这可能是实现你的目标最高效的方式,但我不是数据库专家。
  2. 您可以使用批处理操作定期同步两个表。 此方法允许您的两个表分开,然后经常重新同步数据。 如果您的情况允许发生这种漂移,这可以是一个很好的选择,因为它允许在非工作时间更新数据库。 如果您需要每5分钟进行一次同步,您可能需要查看其他选项。 这可以由您的ruby代码处理,但需要某种后台作业运行器(cron,delayed_job,redis等)
  3. 您可以在Rails模型中使用回调。 您可以使用"after_update :sync_denormalized_data" 。 此回调将包装在数据库级事务中(假设您的数据库支持事务)。 您将拥有Rails级别代码,一致的数据,并且不需要后台进程,每次都要进行两次写入。
  4. 我没有想到的一些机制….

这些类型的问题非常特定于应用程序。 即使在同一个应用程序中,您也可以使用多种方法,具体取决于所涉及的灵活性和性能要求。

或者您可以维护规范化的数据集并使用两个非正规化表。 并定期同步它们。 其他方式有一个规范化的表结构来维护数据(插入/更新/删除)并写一个物化视图来进行报告,这是你通过非标准化视图实现的。 您可以根据需要为物化视图设置数据更新参数。