Database design 审计表结构

Database design 审计表结构,database-design,Database Design,我正在为我的数据库构建审计表,需要选择要实现的样式。我目前正在考虑三个选项,所有选项都将使用触发器填充: 具有字段id | table | column | row | old | u value | new | u value | timestamp | userid的单个表。这将在一个地方跟踪对所有表的所有更改,并将表的数量降至最低。这确实使查询有点困难,但并非不可能 多个类似#1的表,但没有表列。这将把每个表中的更改分离到它们自己的历史记录表中 多个表镜像要跟踪的原始表的架构。这将使触发器

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

  • 具有字段id | table | column | row | old | u value | new | u value | timestamp | userid的单个表。这将在一个地方跟踪对所有表的所有更改,并将表的数量降至最低。这确实使查询有点困难,但并非不可能
  • 多个类似#1的表,但没有表列。这将把每个表中的更改分离到它们自己的历史记录表中
  • 多个表镜像要跟踪的原始表的架构。这将使触发器更容易写入,如果有人想还原到特定记录,则数据的恢复也会更容易,但这将以存储为代价,因为每个字段即使没有更改,也可能会重复多次。此外,这将使我们很难明确知道哪些字段从一个版本更改到了下一个版本

  • 这三个选项中的每一个都是可以实现的,据我所知,没有一个选项提供的功能在另一个选项中是不可能实现的。所以一定有一些我没有考虑的东西或者一些更标准的模式。如果有什么不同的话,这个解决方案必须同时适用于mysql和sql server(尽管我可以在以后计算出代码的细节)。

    我会选择第一个解决方案。如果您决定在跟踪中添加额外的字段,并且除了删除WHERE表=?条款第三是过度杀伤力。这就是备份的目的。

    审计表受到严重影响,您不希望所有审计都只需要一个表,否则会被阻塞

    我们做一些类似于第二的事情,除了我们每个桌子有两张桌子(一个用于存储更改实例,另一个用于存储实际数据。这使得很容易找到存储在amillion记录导入表中的所有记录,例如,因为它们都在同一个实例中。这意味着我们可以在添加新表时轻松编写创建新审核表的脚本


    在第二个例子中,我建议编写一个过程来还原特定的记录,这样还原就很容易了,你不必每次都弄清楚。不是答案,只是进一步的问题:你的审计表的用途是什么?你为什么想要、需要或必须拥有它们?它们将如何使用,它们将有哪些问题答案或它们将解决的情况?它们的使用频率或不使用频率如何?您必须将此数据保留多长时间,以及在过期日期后如何清除或归档


    前面的两个答案[theChrisKen,HLGEM]但是,根据他们之前的工作,我敢打赌他们都是正确的。如果你考虑如何使用他们以及使用时的性能要求,他们可能会帮助你确定哪种型号最适合你的情况。

    HLGEM提出了一个很好的观点。出于性能原因而打破它是很有意义的,如果您有大量的读/写操作(每天数百万次)或者大批量更新,那么HLGEM的解决方案是一个不错的解决方案。但是,如果您的需求没有那么高,那么选项1是性能和维护之间的一个很好的折衷方案。数据库可以处理很多问题,根据情况,过分强调优化可能是一个错误。哦,如果用户更新一行的5个字段,那么就只更新一个表获取一个更改的新实例,另一个表获取5个新的更新行,所有更新都链接到该实例?这确实使恢复更容易。实际上,由于我们对每个审核表使用相同的结构,我们能够自动创建新的审核表,因此我们几乎不需要维护。它们不会针对每个选项卡进行更改le和我们有一个任务,搜索新表,创建审计表和触发器来维护它们。我真的很喜欢这个答案。它似乎可以处理我们试图完成的所有事情。对于具有旧/新值的表,您如何处理数据类型?您是否将该列作为varchar(max)是否将所有数据类型转换为文本?是,列为nvarchar(最大值)。一定要编写一个检索特定数据的过程,以便重新插入到表中。这种结构有点复杂,因此最好不要试图弄清楚,在需要恢复意外删除的10000条用户记录的压力下,这些记录将用于1)通知订阅用户的更改(以即时、每日、每周或每月的频率)2)在记录本身旁边显示记录更改表3)如果更改不正确或不适当,则恢复到以前的版本。数据是记录的一部分,永远不会被清除。我可以看到,在不同的条件下,克里斯肯和HLGEM如何找到合适的解决方案。我们希望有一个可扩展性好的解决方案,尽管它不会超过几百个用户(我实现了一个3号版本。在SQL Server中,触发器可以识别已修改的每一列。我将其与已修改的整行+一些特定于审核的列(auditdatetime、userinfo等)一起存储.I存储哈希,但创建一个对哈希进行解码并列出受影响列的视图。