2011-06-29 29 views
0

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

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

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

+0

您应该使用触发器(或者两个触发器 - 每个表上一个触发器(如果允许更新这两个表)同步保留这些触发器 - 以便在更改一个表时,更改会传播到另一个表表。 – Flimzy

+0

@Flimzy - 正如你所说,为了更新大型表格会有很多工作......性能呢? – user502052

+1

嗯,这意味着你每次更新两张表时都会更新两张表 - 所以表现可能大概是一半(取决于很多因素) - 但这就是你想要的,对吧?没有保持数据一致所带来的性能下降,就无法保证数据的一致性。现在,如果您的数据不必是实时一致的,您可能可以将传播从一个表格传输到另一个表格,而不是每小时/每天/每周/其他,这可能会更有效,具体取决于您的情况。但根据你的问题中的信息,我不能说这是否适合你。 – Flimzy

回答

1

有处理这种情况的几种方式:

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

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

1

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