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