【问题标题】:Database Trigger Usage - Best Practices数据库触发器使用 - 最佳实践
【发布时间】:2011-08-18 19:51:09
【问题描述】:
背景简介:
我目前维护着一个已有 15 年历史的库存管理系统。为了提供单个项目和套件的实时数量(可能嵌套到第 N 级),当请求页面时,库存会动态分配给订单(分配优先级由收到日期和日期确定预期的)。根据系统中有多少订单,更具体地说,这些订单中有多少包含嵌套套件,性能可能是一个问题。
问题:
我们目前正在使用 SOA 原则设计一个新的库存管理系统。与动态分配库存不同,我们希望在每次可能影响项目分配数据的插入、更新和删除发生后更新分配表。关于分配表是应该由数据库中的触发器更新还是由 C# 订单服务更新存在一些争论。
- 哪种方法最符合 SOA 原则?
- 哪种方法性能更好?
- 这是正确使用触发器吗?
- 这两种方法是否被整个社区普遍接受为“正确的做事方式”?
提前感谢您的宝贵时间!
【问题讨论】:
标签:
sql-server
sql-server-2008
database-design
triggers
【解决方案1】:
我认为 HLGEM、Jimbo、Joel Brown 的其他 3 个答案都是正确的。
只是为了回答您的每一个具体问题
哪种方法最符合 SOA 原则?
两者都取决于您的架构的其余部分。你还有多少其他系统?其他系统需要直接访问数据库还是通过此服务访问数据库?
哪种方法性能更好?
两种方式都没有真正的区别。
这是正确使用触发器吗?
是的
这两种方法是否被整个社区普遍接受为“正确的做事方式”?
社区似乎对此决定存在分歧,应该逐案评估。
【解决方案2】:
我认为这归结为关于是否在 TSQL 中具有任何业务逻辑(存储过程或触发器)的古老宗教战争。有些人喜欢将尽可能多的逻辑引入数据库层,而另一些人则认为这是您能做的最糟糕的事情。
请查看this question,对各种利弊进行冗长的辩论。无论您认为哪个论点最有说服力,都是您应该采取的方式。
【解决方案3】:
触发器是唯一可以保证数据保持同步的解决方案。您不能保证值不会在应用程序之外即时更改(比如修复一些大数据问题),因此触发器是唯一正确的解决方案。
【解决方案4】:
如果插入、更新和删除是由存储过程执行的,那么分配表也应该在这些存储过程中更新 - 这将是理想的解决方案。
否则,如果应用程序正在执行插入、更新和删除操作,那么触发器将满足您的需要 - 但请记住,应始终避免使用触发器,并且如果您必须让它们尽可能简单,这是因为触发器很快就会变得非常难以调试。