小编典典

更新非规范化数据库表

sql

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

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

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


阅读 201

收藏
2021-04-07

共1个答案

小编典典

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

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

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

2021-04-07