1

SQL 服务器 2005。

在我们的应用程序中,我们有一个带有父表和几个子表的实体。我们希望跟踪对此实体所做的修订。来来回回之后,我们将其范围缩小到两种可供选择的方法。

  1. 有一个实体的历史表。在 sproc 更新表之前,从父表和所有子表中检索实体的整个当前状态。将其 XML 化并作为 XML 数据类型粘贴到历史表中。包括一些要查询的列,以及修订号/创建日期。

  2. 对于每个表,创建一个具有相同列的匹配历史表。还有一个修订号/创建日期。在 sproc 更新单个表之前,检索该表的记录的现有状态,并将其复制到历史表中。所以,它有点像SVN。如果我想获取修订版 Y 的实体,我需要获取每个表中的历史记录,其最大修订号不大于 Y。一个实体可能在一个表中有 50 个修订记录,但在一个表中只有 3 个修订记录一个子表等。我可能希望将整个实体的修订计数器保留在某个地方。

这两种方法似乎都让人头疼,但我仍然更喜欢解决方案#2而不是解决方案#1。这是一个已经很大的数据库,并且已经存在性能问题。在每次修订时都使用 XML blob 使其膨胀(并且会有很多)似乎是一种可怕的方式。为所有内容创建历史表是我愿意付出的代价,只要没有更好的方法来做到这一点。

有什么建议么?

谢谢,泰德兹

4

1 回答 1

3

数字 2 几乎可以肯定是要走的路,我用我的历史表做这样的事情,尽管我也使用“事件”表来将更改相互关联,而不是使用时间戳。我想这就是您所说的“修订计数器”的意思。我的“事件”表包含一个唯一的 ID、一个时间戳(当然)、负责更改的应用程序用户和一个“操作”指示符,它表示用户所做的导致更改发生的应用程序级操作。

为什么是#2?因为您可以更轻松地对表进行分区以归档或滚降旧条目。因为它更容易索引。因为查询起来要容易得多。因为它的开销比 XML 少,而且要小得多。

此外,考虑使用触发器而不是编写存储过程来完成所有这些工作。触发器几乎总是要避免的,但对于这样的事情,它们是执行这类事情的一种相当轻量级和健壮的方式。

于 2012-09-18T01:26:13.287 回答