SQL历史表设计

时间:2012-12-04 19:05:44

标签: sql database database-design

我需要设计一个历史记录表来跟踪编辑时在特定记录上更改的多个值。

实施例
向用户显示编辑记录的页面。

标题:先生 姓名:乔
Tele:555-1234
DOB:1900-10-10

如果用户更改了这些值中的任何一个,我需要跟踪旧值并记录新值。

我想过使用这样的表:

历史
---------------

ID
modifiedUser
modifiedDate
表名
的recordId
属性oldValue
NEWVALUE

这样做的一个问题是每次编辑都会有多个条目。 我正在考虑让另一张桌子对它们进行分组,但你仍然遇到同样的问题。

我还在考虑在历史记录表中保留该行的副本,但这似乎也没有效率。

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:16)

我建议您为每个要跟踪历史记录的表格,使用相同格式的第二个表格(即tblCustomer和tblCustomer_History)以及日期列。

每当进行编辑时,都会将旧记录与日期/时间一起插入历史记录表。这很容易做,并且需要很少的代码更改(通常只是一个触发器)

这样可以使您的“真实”表格尽可能小,但会为您提供所有更改的完整历史记录。

但最终,它将归结为您希望使用此数据的方式。如果仅用于审计目的,这种方法很简单,除了额外的磁盘空间以及对主系统的影响很小或没有影响外,几乎没有什么缺点。

答案 1 :(得分:12)

您应该定义您感兴趣的效率类型:您可以拥有存储空间的效率,记录历史记录所需的工作效率(交易成本),或查询记录历史记录的时间效率一种特定的方式。

我注意到您在建议的历史记录表中有一个表名,这意味着有意记录多个表的历史记录,这将排除在历史记录表中存储记录的精确副本的选项,除非所有您跟踪的表格总是具有相同的结构。

如果单独处理列,即每个历史记录只记录一个列值,则必须设计一个能够准确表示您将遇到的每个列值的多态数据类型。

如果主要关注存储空间的效率,那么我会将历史记录分成多个表。这意味着将新的列值表链接到编辑事件表和列定义表。编辑事件表将记录用户和时间戳,列定义表将记录表,列和数据类型。正如@njk所指出的,您不需要旧的列值,因为您始终可以查询上一个编辑以获取旧值。预计这种方法可以节省空间的主要原因是,一般来说,用户将编辑可用字段的一小部分。

如果主要关注查询效率,我会为您要跟踪的每个表设置一个历史记录表,并为每个历史记录表添加一个用户和时间戳字段。就编辑的交易成本而言,这也应该是有效的。

答案 2 :(得分:2)

您无需在历史记录表中记录旧值和新值。只需记录最新值,作者和日期。然后,您可以根据记录日期获取某些user_id的最新记录。如果您要处理大量数据,这可能不是最佳方法。

用户(id,user_id,datetime,author,...)

示例数据

id  user_id  datetime          author  user_title  user_name  user_tele ...
1   1        2012-11-05 11:05  Bob
2   1        2012-11-07 14:54  Tim
3   1        2012-11-12 10:18  Bob