database - 触发器与非规范化存储过程的优缺点

标签 database sql-server-2008 stored-procedures triggers denormalization

当涉及到对事务数据库中的数据进行非规范化以提高性能时,有(至少)三种不同的方法:

  1. 通过更新规范化交易数据和非规范化报告/分析数据的存储过程推送更新;

  2. 在更新辅助表的事务表上实现触发器;这几乎总是维护历史的路线;

  3. 将处理推迟到每晚的批处理过程中,可能会在数据集市/仓库中执行 ETL。

为了这个问题的目的,我们假设选项 #3 不可行,因为域要求非规范化数据始终与规范化数据保持一致。我经常处理的分层聚合就是这方面的一个例子。

我已经使用了前两种方法,最近我一直倾向于基于触发器的方法,但我想知道是否有任何我还没有发现的“陷阱”,并认为问这个问题是值得的,这样我在未来做出长期决策时就会有一些想法要牢记在心。

那么根据您的经验,为了维护实时非规范化数据的特定目的,这两种工具的优缺点是什么?在什么情况下您会选择其中一种,为什么?

(附:请不要回答“触发器太复杂”或“所有更新都应始终通过存储过程”之类的答案 - 使其适合问题的上下文。)

最佳答案

触发器是自动的副作用,当您想做某事但由于触发器的副作用而不能做时,几乎肯定会咬住您。主要是让您的系统参与其中在与其他外部系统的某些 XA 事务中。触发器使这不可能。此外,副作用逻辑只能通过再次执行触发器激活器来激活。如果你想在仓库中重新创建数据,你不能只运行一些过程并重新创建它,你必须执行所有将触发触发器的事件,这是一场噩梦。 INSERTS、UPDATES 和 DELETES 应该是幂等的和正交的。触发器不必要地使工作流程复杂化,即使您认为它们正在简化它们,但它们实际上并没有。

关于database - 触发器与非规范化存储过程的优缺点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2088905/

相关文章:

mongodb - 数据库和项目订单(一般)

mysql - 设计一个表结构

database - 在 Firebase 中,有没有办法在不加载所有节点数据的情况下获取节点的子节点数?

c# - 检测 sql-server 表上的更改

sql - 对每个月的字段进行累计和动态求和

c# - 为什么在 MySQL 的存储过程中使用 OUT 参数时 ODBC C# 返回空字符串?

java - 什么时候使用 Statement 而不是 Prepared Statement?

sql - 如何在 SQL Server 中转换日期和时间

sql-server-2005 - 从 Mule 3.5.0 ESB 中的存储过程调用获取返回值

c# - 使用 C# 运行 Postgres 存储过程