【发布时间】:2010-10-18 00:17:26
【问题描述】:
我正在创建一个审计表,用于跟踪对主表中记录所做的更改。
这里的审计表是主表(比如员工表)的完全相同的副本,但对于主表中发生的每次更改,只会有“插入”。所以它会有重复(相同的 EmployeeID),所以我应该为每个条目添加单独的 Audit_ID 吗?
【问题讨论】:
我正在创建一个审计表,用于跟踪对主表中记录所做的更改。
这里的审计表是主表(比如员工表)的完全相同的副本,但对于主表中发生的每次更改,只会有“插入”。所以它会有重复(相同的 EmployeeID),所以我应该为每个条目添加单独的 Audit_ID 吗?
【问题讨论】:
确定您需要表中的某种主键。
如果有的话,删除重复项和跟踪“插入原因”(用于调试目的)会更容易。
一些RDBMS(如MySQL 和InnoDB)实际上会为您创建一个隐藏的主键,如果您没有明确执行此操作,那么您只需自己执行并使其可见且可用。
【讨论】:
您几乎必须这样做,因为 Employee 中的 EmployeeID 将是唯一的(更新不会添加新行,只需修改现有行),审计表将有多个行相同的 EmployeeId(一个用于该员工的初始插入,一个用于后续更新)。
此外,Employee 中的实体是员工。但是审计中的实体是审计记录。他们应该有自己的身份证。
如果出现问题并且您需要实际更新或删除审计记录,您将需要此功能。实际上,如果插入员工,则更新一列的值,然后再次更新为原始值,您现在在审计中有两条相同的记录。哪个必须一起删除或更新(除非您在更新或删除中使用了限制子句。)混乱。
这也指出了向审计表添加时间戳的用处。但是不要认为您应该使用它和employeeid 作为复合键。首先,复合键很烂。其次,时间戳的粒度完全有可能小于系统执行两次更新(同一员工的两次更新,例如批处理操作)所花费的时间。 (Sybase 日期时间的粒度为 3 毫秒;Intel Core 2 Extreme 在这段时间内可以执行近 200 百万条指令。)
【讨论】:
是的。我相信每个表中的非语义主键是最佳实践,因为它允许您以实用的方式引用它。您可以比使用日期更容易地可视化“从audit-id 到audit-id+1 的变化”。
【讨论】:
您可以使用员工 ID 和审核日期时间作为复合键...
【讨论】: