6

对于我的应用程序有几个实体类,User、Customer、Post 等

我即将设计数据库,我想存储创建和更新实体的日期。这就是棘手的地方。当然,一种选择是为每个实体表添加 created_timestamp 和 update_timestamp 列,但这不是多余的吗?

另一种可能性是创建一个存储此信息的日志表,并且可以使其包含对任何实体的更新的跟踪。

有什么想法吗?我倾向于实施后者。

4

5 回答 5

6

我能想到的单一日志表用于所有表的方法有两个主要问题:

  1. 日志表的设计(可能)会限制所有其他表的设计。日志表很可能有一个名为 TableName 的列,然后是另一个名为 PKValue 的列(它将存储您正在记录的记录的主键值)。如果您的某些表具有复合主键(即多于一列),那么您的日志表的设计必须考虑到这一点(可能通过具有 PKValue1、PKValue2 等列)。
  2. 如果这是某种 Web 应用程序,那么触发器中可用的用户身份将是应用程序的帐户,而不是 Web 应用程序用户的 ID(这很可能是您真正想要存储在 CreatedBy 中的内容)场地)。这只会帮助您区分由您的 Web 应用程序代码创建的记录和以其他方式创建的记录。

CreatedDate 和 ModifiedDate 列并不是多余的,因为它们是在每个表中定义的。我会坚持这种方法,并在每个表上放置插入和更新触发器以填充这些列。如果我还需要记录进行更改的最终用户,我会跳过触发器并从我的应用程序代码中填充时间戳和用户字段。

于 2008-10-26T02:26:53.227 回答
5

我用“日志”或“事件”表做后者。以我的经验,“更新”的时间戳很快就会变得令人沮丧,因为很多时候你发现自己处于一个你想要的不仅仅是最新的更新时间的修复中。

于 2008-10-26T00:06:18.580 回答
0

您需要多久在表示层中包含创建/更新的时间戳?如果答案不仅仅是“很长时间一次”,我认为在每个表中都有这些列会更好。

于 2008-10-26T00:05:42.217 回答
0

在我几年前参与的一个项目中,我们实现了更新我们所谓的审计表的触发器(它存储了有关所做更改的基本信息,每个表一个审计表)。这包括修改日期(和最后修改日期)。

它们仅应用于关键表(而不是连接或引用数据表)。

这消除了许多必须考虑 LastCreated 和 LastModified 字段的正常挫败感,但引入了保持触发器最新的烦恼。

最后,触发器/审计表设计运行良好,我们只需要在 ETL(!)之前删除并重新应用触发器即可。

于 2008-10-26T01:07:00.363 回答
0

它适用于我从事的基于网络的 CMS。创建日期和最后更新日期将显示在大多数页面上,并且会有最后创建(和更新)页面的列表。管理界面也将使用此信息。

于 2008-10-26T12:23:35.287 回答