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

Sql 在单独的表中记录表创建/修改事件是否可行?,sql,model-view-controller,database-design,Sql,Model View Controller,Database Design,我即将开始为MVC web应用程序设计一个数据库,并考虑使用一个名为“changes”或“events”的表来跟踪对数据库所做的所有更改。它将有一个字段,用于表名、记录id、进行更改的用户、时间戳以及它是创建还是修改事件 我的问题是,与每个表中的“创建人”、“创建时间”、“修改人”、“修改时间”字段相比,这是否是一种糟糕的设计实践。我在想,在父模型类中,我将使用一个before save函数记录每一个更改。我可以看出一个陷阱可能是,如果一次更新了许多记录,那么可能很难让函数正确保存更改。我认为您

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


我的问题是,与每个表中的“创建人”、“创建时间”、“修改人”、“修改时间”字段相比,这是否是一种糟糕的设计实践。我在想,在父模型类中,我将使用一个before save函数记录每一个更改。我可以看出一个陷阱可能是,如果一次更新了许多记录,那么可能很难让函数正确保存更改。

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


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

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

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


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

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

当前记录的结束日期为空


基本上,每一条记录都有一个生命周期。

这是一个权衡拥有细粒度信息的好处与每次数据库中发生变化和需要额外存储时写入此表的开销的问题

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


最后,我还建议考虑归档,因为此表可能会很快变得非常大。

回答此问题的关键是“您希望从中获得什么?”如果您这样做,你需要通过触发器而不是通过应用程序来完成,所以你可以捕获所有可能的数据更改。我不知道这是可能的,但是使用数据库触发器听起来是一个很好的方法。这也将给我一个机会来扩大我对数据库的理解。