【问题标题】:Updating denormalized database tables更新非规范化数据库表
【发布时间】:2011-09-24 22:43:34
【问题描述】:

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

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

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

【问题讨论】:

  • 你应该使用一个触发器(或者可能是两个触发器——一个在每个表上,如果你允许更新两个表)来保持它们同步——这样当一个表被改变时,改变传播到另一个表。
  • @Flimzy - 正如你所说,为了更新大表,需要做很多工作......性能如何?
  • 嗯,这意味着您每次更新一个表时都会更新两个表——因此性能可能大约是一半(取决于许多因素)——但这就是您想要的,对吧?如果没有因保持数据一致而带来的性能损失,您就无法获得数据一致性。现在,如果您的数据不必实时一致,您可以每小时/每天/每周/任何时间从一个表到另一个表进行批量传播,这可能更有效,具体取决于您的情况。但根据您问题中的信息,我不能说这是否适合您。
  • @Flimzy - 你需要什么信息才能得到更“多产”的答案?
  • 好吧,就像我说的,我不知道实时更新在您的应用程序中是否重要。

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-17
      • 2023-03-13
      • 2011-11-12
      • 2013-01-18
      • 2016-10-22
      • 2017-10-23
      • 2017-03-01
      • 2016-07-23
      相关资源
      最近更新 更多