审计表结构

时间:2010-11-18 21:36:23

标签: database-design

我正在为我的数据库构建审计表,需要选择要实现的样式。我目前正在考虑三个选项,所有选项都将使用触发器填充:

  1. 包含字段id |的单个表表|专栏|行| old_value | new_value |时间戳|用户身份。这将在一个位置跟踪所有表的所有更改,并具有最小化表数的好处。它确实使查询有点困难,但并非不可能。
  2. 除#table之外的多个表,除了没有表列。这会将每个表的更改分成各自的历史记录表。
  3. 镜像要跟踪的原始表的架构的多个表。这将使触发器更容易编写,如果有人想要恢复到特定记录,将使数据的恢复更容易,但是会以牺牲存储为代价,因为每个字段,即使它没有改变,也会被复制,可能是多次。此外,它很难确切地知道哪个字段从一个版本更改为下一个版本。
  4. 这三个选项中的每一个都是可行的,据我所知,没有提供的功能在另一个选项中是不可能的。所以必须有一些我没有考虑的东西或一些更标准的模式。如果它有任何区别,这个解决方案必须适用于mysql和sql server(虽然我可以稍后解决代码的细节)。

3 个答案:

答案 0 :(得分:4)

审计表受到严重影响,您不希望只有一个表用于所有审计,否则您将受阻。

除了我们每个表有两个表(一个存储更改实例和一个存储实际数据的表)之外,我们执行第二个操作。这使得很容易找到存储在amillion记录中的所有记录导入到表中实例因为它们都是相同的实例。这意味着我们可以在添加新表时轻松编写创建新审计表的脚本。

在第二个的情况下,我建议编写一个proc来恢复特定的记录,以便恢复很容易,你不必每次都弄明白。

答案 1 :(得分:1)

不是答案,只是进一步的问题:审核表的目的是什么?你为什么想要它们,需要它们,还是必须拥有它们?他们将如何使用,他们将回答什么问题或他们将解决的情况?它们的使用频率或频率很低?您必须保留这些数据多长时间,以及在截止日期之后如何清除或存档这些数据?

前面两个答案[theChrisKen,HLGEM]不同意,但是 - 基于他们之前的工作 - 我敢打赌他们都是正确的。如果您考虑如何使用它们以及该用法的性能要求,可以帮助您确定哪种型号最适合您的情况。

答案 2 :(得分:0)

我会选择1号牌。如果您决定在跟踪中添加其他字段并且除了删除WHERE表的必要性之外几乎没有增加,那么2号将难以维护?条款。 3号是矫枉过正。这就是备份的用途。