database - 审计表 : Each field for table or one table

标签 database audit

除了审计字段外,我的项目中的一切都很好。在我们想象的宇宙中,只需对插入和更新进行审计。

我提出了一个类似于下一个例子的表格:

但我的团队不这么想,他们在每个表上放了一列来跟踪更新或插入时间。当我问为什么?时,他们告诉我这是他们在工作中保持跟踪的方式。

最后我放弃了,我把每个字段都放在每个表上。因为除了我以外的所有团队都告诉我要放置那些字段。

例子:

他们的方法

Table Customer
+-------------+-------------+-----+--------------------------------+-------------+
| Name        | LastName    | ... | LastModification (Audit Field) | User        |
+-------------+-------------+-----+--------------------------------+-------------+
| varchar(30) | varchar(50) | ... | datetime                       | varchar(30) |
+-------------+-------------+-----+--------------------------------+-------------+

我的做法

Table Customer
+-------------+-------------+-----+
| Name        | LastName    | ... |
+-------------+-------------+-----+
| varchar(30) | varchar(50) | ... |
+-------------+-------------+-----+

Table Audit
+-----------+------------+--------+------+-------------+
| TableName | TableField | Action | User | DateAndTime |
+-----------+------------+--------+------+-------------+

所以问题是:

哪个设计更好,一张表保存交易历史,还是每张表一个字段? (优点和缺点)

最佳答案

Which is a better design, one table that keep the history of transactions or one field for each table? (Pro and cons)

这里不是关注这 2 个选择,而是对我多年来使用的 4 种方法的回答。各有利弊。

1。就三个字段

只需将三个字段(上次操作、时间戳、更新用户)添加到每个表中,然后就可以收工了。

优点 super 简单。表现良好

缺点 您无法报告您没有的数据,因此此结构几乎什么也告诉您(删除除外)

2。克隆表

每个表都有一个副本加上三个审计字段,每次用户更改记录时,审计表都会插入其中。

优点 表现相当不错。轻松创建用户可以挖掘的逐行历史记录。

缺点

3。仅限历史表

没有基表只有历史表。 这与克隆表基本相同,只是现在您必须始终获取当前记录。

优点 2 的优点,但一切都是插入。比选项 2 更少的维护。

缺点 你最终会失去维护 yield ,因为你最终会维护 View ,或者你会到处散布获取当前记录逻辑

4。通用审计表

此表有四列( Table*, Column_name, old_value, new_value )和三个审计字段。

优点 易于设置和维护。

缺点

  • 它不直观但占用了大量空间,因为您的 old_valuenew_value 字段必须是 nvarchar(max)或等同物,以便它可以接受基表中的任何内容。

  • 读写性能不佳。

  • 逐行设置历史报告很痛苦

  • 如果记录中存在任何类型的工作流,审计报告就会变得非常重要。例如,您收到一个要求,即用户只想查看记录状态变为“已批准”后发生的更改。即使在选项 2 和 3 中也很难做到这一点,但在通用审计方法中会成为一场灾难。

总结

我更喜欢#2 克隆表方法,因为它似乎最适合我。我遇到过 #1 不足的问题,#4 可能是严重的性能噩梦,需要大量工作才能撤消。

关于database - 审计表 : Each field for table or one table,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7975317/

相关文章:

MySQL 判断系统每小时查询的用户数

php - 如何记录所有网络交易 (PHP/Laravel)

ruby-on-rails - 在 View 中访问数据库对象(和其他重要数据)

java - MongoDB - getCollection(String name) 和 getCollectionFromString(String collectionName) 之间的区别?

mysql - 对 MySQL 表实现审计

postgresql - 返回 PostgreSQL 中更新值的变化

php - MySQL 在日期时间列上选择 1 小时前或更新的记录

mysql - 复杂连接和选择查询

node.js - 数据库客户端抽象

sql-server - Sql Server中如何跟踪表结构的变化