1

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

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

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

4

2 回答 2

3

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

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

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

于 2011-06-30T04:22:53.307 回答
1

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

于 2011-06-29T09:23:10.530 回答