更新闭包表的最佳方法是什么?

时间:2011-04-08 23:10:11

标签: sql sql-server triggers transitive-closure-table

我有一个表使用adjacency list方法(表 A )关联记录,另一个表使用closure table关联相同的记录(表 B < / em>的)。它们都捕获相同的图形,因此它们都需要保持同步。

问题是,更新闭包表的最佳方法是什么?

我认为,有三种选择:

  1. 触发器。在 A 上的INSERT / UPDATE / DELETE中,运行一个计算新闭包的sproc。 缺点: A 的更改会导致长时间的同步(锁定?)操作;可能死锁(?)。
  2. 应用程序代码。将 A 中的更改缩小为添加/更新/删除方法(例如存储库模式),并通过调用计算新闭包的sproc来重载它们。 缺点:额外往返DB;如果另一个thead同时以相反的方式修改 A B ,则可能存在完整性问题;例如,如果另一个应用程序决定修改 A 而不是 B ,则可能存在完整性问题。
  3. 背景更新程序。编写一个辅助进程,不断查找 A 的更新,并对闭包表进行相应的更新。 缺点:复杂(写入和管理的额外服务);没有同步的窗户。
  4. 即使没有“最佳”选项,任何关于权衡的想法都会受到最大的赞赏!

1 个答案:

答案 0 :(得分:4)

如果您的层次结构与我所处理的大部分内容完全一样,那么我可能会使用触发器。真的取决于更新频率和读取负载。