当前位置: 首页 > 面试题库 >

更新非规范化数据库表

濮君植
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 用例说明 我们有一个关系数据库,其中包含有关我们日常运营的数据。目的是允许用户使用全文本搜索引擎来搜索重要数据。数据经过规范化,因此不是进行全文查询的最佳形式,因此,其想法是对数据的一部分进行规范化,然后将其实时复制到Elasticsearch,这使我们能够创建快速而准确的搜索应用程序。 我们已经有了一个启用数据库操作(插入,更新,删除)事件搜索的系统。这些事件仅包含已更改的列和主键(

  • 非规范化数据不存储规范化的数据。换句话说非规范化意味着相同数据的多个拷贝同时存在。 上一章中,我们在帖子中非规范化评论总数,以避免每次都加载所有的评论。在数据建模意义上说这是冗余的,因为我们可以通过计数每个评论,随时计算出该总数(当不考虑运行速度)。 非规范化通常意味着额外的开发工作。在例子中,我们每次添加或删除评论时,还需要同时更新相关的帖子,以确保 commentsCount 字段保持准确。这

  • 我阅读了cassandra数据建模,除了非规范化数据可能会发生变化之外,一切都很清楚。我如何同步它?当用户电子邮件更改时,更新的方法是什么: < code>groupname是组的一部分,数据模型中的用户可能不知道任何组,因此在用户更改后无法更新电子邮件。 下面描述的解决方案是否合适? 向用户模型中添加一列(类型

  • 问题内容: 出于性能原因,我有一个非规范化的数据库,其中某些表包含从其他表的许多行聚合而来的数据。我想通过使用SQLAlchemy事件来维护此非规范化数据缓存。举例来说,假设我正在编写论坛软件,并希望每个人都有一个专栏来跟踪线程中所有注释的组合词数,以便有效地显示该信息: 因此,每次插入注释时(为简单起见,我们永远不要编辑或删除注释),我们希望更新关联对象的属性。所以我想做类似的事情 因此,当我插

  • 问题内容: 我想知道是否有人对如何规范化数据库有任何建议。现在,我不是要设计结构,而是要实际将数据库数据从旧结构移动到新的规范化结构。我知道我可以编写类似PHP脚本的内容,但是我想知道是否有一种方法可以在SQL中进行。特别是MySQL。 **编辑:有人尝试过SwisSQL吗?这是一个迁移工具,但我不确定它是否能满足我的要求。 问题答案: 这是在脚本中标准化表的示例。我建议你做这样的事情 您将首先创

  • 表规范 命名统一小写下划线 非CMF核心应用,统一带应用表前缀,如portal_ 插件表,统一带插件表前缀,如:demo_ 表默认编码utf8mb4,默认排序规则utf8mb4_general_ci 引擎统一innodb 写表注释 字段规范 命名统一小写下划线 非自增主键一定要写字段注释 数据类型尽量用数字类型,数字类型的比字符类型的要快很多。 数据类型尽量小,这里的尽量小是指在满足可以预见的未来