在单独的表中记录表创建/修改事件是否切实可行?

时间:2013-06-24 19:29:02

标签: sql model-view-controller database-design

我即将开始为MVC Web应用程序设计数据库,并且正在考虑使用名为“changes”或“events”的表来跟踪对数据库所做的所有更改。它将具有表名,记录ID,进行更改的用户,时间戳以及是创建还是修改事件的字段。

我的问题是,与每个表格中的“创建者”,“创建者”,“修改者数量”,“修改日期”字段相比,这是否是一种糟糕的设计实践。我在想,在父类Model中,我会使用before-save函数记录每次更改。我可以看到一个陷阱可能是如果一次更新了许多记录,可能很难让函数正确保存更改。

4 个答案:

答案 0 :(得分:0)

我认为你的方法很好。在单独的表中使用这些事件的一个优点是您可以捕获多个编辑。如果您只有ModifiedDate/ModifiedBy列,则只能看到 last 编辑。

要注意的主要事项是表大小,因为审计表可能非常大。您还可以决定拆分为多个审计表(例如,使用带有_audit后缀的相同表名)以提高查询性能。

答案 1 :(得分:0)

这取决于你需要什么。创建和维护事件表的原因是维护更改的审计跟踪。

对于某些应用程序,行末的已创建/已更新字段是足够的审计跟踪。

对于更安全的应用程序,您需要一个事件表。您还需要在事件表中包含实际更改(之前/之后)。

答案 2 :(得分:0)

还要考虑一个与时间相关的表,其中每个记录都有一个开始和结束日期,以及一个创建者。任何更改实际上都会设置上一条记录的结束日期,并创建一个具有NULL结束日期的新记录。

您当前的记录是具有NULL结束日期的记录。

基本上,每条记录都有一段寿命。

答案 3 :(得分:0)

每当数据库中的某些内容发生变化并需要额外的存储空间时,这就是权衡使用粒度信息和写入此表的开销的好处。

如果您担心在模型类上使用函数,那么另一种选择就是数据库触发器。这将是非常强大的,但是需要设置更多的工作,因为您需要为每个表定义触发器,除非您使用的数据库具有通常记录DML更改的工具。

最后,我还建议考虑归档,因为这张表有可能很快变大。