更新非规范化数据库表

时间:2011-06-29 08:18:04

标签: mysql sql ruby-on-rails database denormalization

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

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

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

有几种方法可以解决这种情况:

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