【问题标题】:Is using triggers best solution for this scenario是否为这种情况使用触发器最佳解决方案
【发布时间】:2015-05-16 13:31:21
【问题描述】:

一个大型 SQL 事务数据库有 100 多个表(并且还会增长)。其中之一称为Order。然后,还有另一个表 WorkLoad 派生自 Order 和许多其他包含所有活动订单列表的连接表。每次创建订单记录,如果满足一定条件,就应该立即插入到WorkLoad表中。最后,还有第三个表 WorkLoadAggregation,它显示了按日期和商店分组的聚合数据,它完全由 WorkLoad 表构建。 WorkLoadAggregation 还应显示实时数据,这意味着如果在 WorkLoad 表中插入记录,则还应更新匹配的日期/商店聚合。

我的想法是通过以下触发器来处理这个问题:

  1. 当记录插入Order表中时,触发器调用存储过程将记录插入WorkLoad表中
  2. 订单记录被删除触发器从 WorkLoad 表中删除记录
  3. 订单记录更新不满足 WorkLoad 条件时,触发器会从 WorkLoad 表中删除记录
  4. 当记录在 WorkLoad 表中插入/删除/更新时,触发器调用存储过程更新 WorkLoadAggregation 表中匹配的日期/商店聚合记录

在如此大的事务数据库和如此频繁的调用中,我没有使用太多触发器。这种方法有什么不好的吗?我最担心的是“链式触发器”的使用,这意味着一个表上的触发器会激活另一个表上的触发器。我一直在阅读一些文章,其中指出开发人员在使用触发器时应该非常谨慎。有没有更好的解决方案?我应该考虑任何 NoSQL 解决方案吗?

数据库托管在 SQL Server 2012 上。

注意:在案例 5)中,被调用的存储过程包含 CTE(有人建议使用索引视图)

【问题讨论】:

  • 如果您使用触发器,请注意以下提示:触发器始终是触发触发器的事务的一部分,并且在您使用回滚或提交时要小心触发器,或者您在触发器中有显式事务。我的意思是,如果您决定在这种情况下使用触发器,请考虑并妥善管理事务,这是我认为的主要提示

标签: sql performance stored-procedures triggers


【解决方案1】:

提供更具体的意见有点困难,但基于问题空间的呈现。我不会推荐这个解决方案,因为它很难有效地测试,而且我可以看到这在高负载时会导致问题。此外,很难量化总体影响,因为我不确定读取负载会是什么样子,以及有多少其他进程可能需要这些表中的信息。

根据您对问题的描述,以及您询问 NoSQL 方法的事实,我认为最终的一致性并不是什么大问题,因此我会推荐一个更加事件驱动的架构。请记住,这可能意味着对您当前的实现进行重大重写,但肯定会允许更好的域分解和扩展。

【讨论】:

  • “我可以看到这在高负载时会导致问题” - 什么类型的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2017-06-30
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多