实体修订架构设计

时间:2012-09-18 01:14:48

标签: sql-server-2005

SQL Server 2005。

在我们的应用程序中,我们有一个具有父表的实体以及几个子表。我们希望跟踪对该实体的修订。在来回走动之后,我们将其缩小到两种方法可供选择。

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

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

  3. 这两种方法似乎都令人头痛,但我仍然倾向于解决#2解决方案#1。这是一个已经庞大的数据库,并且已经存在性能问题。在每次修订时使用XML blob进行膨胀(并且会有很多)似乎是一种可怕的方式。为所有事情创建历史表是我愿意吃的成本,只要没有更好的方法来做到这一点。

    有什么建议吗?

    谢谢, Tedderz

1 个答案:

答案 0 :(得分:3)

数字2几乎肯定是要走的路,我用历史表做了类似的事情,尽管我也使用“事件”表来将变化相互关联,而不是使用时间戳。我想这就是“修订版”的意思。我的“事件”表包含一个唯一的ID,一个时间戳(当然),负责更改的应用程序用户,以及一个“动作”指示符,它代表用户所做的导致更改发生的应用程序级动作。 / p>

为什么#2?因为您可以更轻松地partition表来存档或滚动旧条目。因为索引更容易。因为它更容易查询。因为它的开销比XML少,而且要小得多。

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