1

我正在创建一个审计表,用于跟踪对主表中的记录所做的更改。

这里的审计表是主表(比如员工表)的完全相同的副本,但对于主表中发生的每次更改只有“插入”。所以它会有重复(相同的 EmployeeID),所以我应该为每个条目添加单独的 Audit_ID 吗?

4

4 回答 4

3

当然,您需要表中的某种主键。

如果有的话,删除重复项和跟踪“插入原因”(出于调试目的)会更容易。

如果您没有明确地执行某些操作RDBMS(例如MySQLwith ),它实际上会为您创建一个隐藏的主键,因此您只需自己执行并使其可见且可用。InnoDB

于 2009-04-07T09:38:35.877 回答
1

您几乎必须这样做,因为 Employee 中的 EmployeeID 将是唯一的(更新不会添加新行,只需修改现有行),审计表将有多个具有相同 EmployeeId 的行(一个用于初始插入,该员工的每个后续更新都有一个)。

此外,Employee 中的实体是员工。但是审计中的实体是审计记录。他们应该有自己的身份证。

如果出现问题并且您需要实际更新或删除审计记录,您将需要此功能。实际上,如果插入员工,则更新一列的值,然后再次更新为原始值,您现在在审计中有两条相同的记录。哪些必须一起删除或更新(除非您在更新或删除中使用了限制子句。)混乱。

这也指出了向审计表添加时间戳的有用性。但不要认为您应该使用它和employeeid 作为复合键。首先,复合键很烂。其次,时间戳的粒度完全有可能小于系统执行两次更新(同一员工的两次更新,例如批处理操作)所花费的时间。(Sybase 日期时间的粒度为 3 毫秒;Intel Core 2 Extreme 在这段时间内可以执行近 2亿条指令。)

于 2009-04-07T09:47:29.677 回答
0

您可以使用员工 ID 和审核日期时间作为复合键...

于 2009-04-07T09:40:12.237 回答
0

是的。我相信每个表中的非语义主键是最佳实践,因为它允许您以实用的方式引用它。您可以比使用日期更容易地可视化“从audit-id到的变化”。audit-id+1

于 2009-04-07T09:43:47.940 回答