【问题标题】:SQL - Table Design - DateCreated and DateUpdated columnsSQL - 表设计 - DateCreated 和 DateUpdated 列
【发布时间】:2010-09-19 05:30:55
【问题描述】:
对于我的应用程序有几个实体类,User、Customer、Post 等等
我即将设计数据库,我想存储创建和更新实体的日期。这就是棘手的地方。当然,一种选择是为每个实体表添加 created_timestamp 和 update_timestamp 列,但这不是多余的吗?
另一种可能性是创建一个存储此信息的日志表,并且可以使其包含对任何实体的更新的跟踪。
有什么想法吗?我倾向于实施后者。
【问题讨论】:
标签:
sql
timestamp
insert-update
【解决方案1】:
您需要多久在表示层中包含创建/更新的时间戳?如果答案不仅仅是“非常时期一次”,我认为在每个表中都包含这些列会更好。
【解决方案2】:
我用“日志”或“事件”表做后者。根据我的经验,“更新”的时间戳很快就会变得令人沮丧,因为很多时候你发现自己处于一个你想要的不仅仅是最新的更新时间的修复中。
【解决方案3】:
在我几年前参与的一个项目中,我们实施了触发器来更新我们所谓的审计表(它存储有关所做更改的基本信息,每个表一个审计表)。这包括修改日期(和最后修改日期)。
它们仅应用于关键表(而不是连接或引用数据表)。
这消除了必须考虑 LastCreated 和 LastModified 字段的许多正常挫败感,但引入了保持触发器最新的烦恼。
最后,触发器/审计表设计运行良好,我们只需要在 ETL(!) 之前删除并重新应用触发器即可。
【解决方案4】:
我能想到的单一日志表用于所有表的方法有两个主要问题:
- 日志表的设计将(可能)限制所有其他表的设计。日志表很可能有一个名为 TableName 的列,然后是另一个名为 PKValue 的列(它将存储您正在记录的记录的主键值)。如果您的某些表具有复合主键(即多列),那么您的日志表的设计必须考虑到这一点(可能通过具有 PKValue1、PKValue2 等列)。
- 如果这是某种 Web 应用程序,那么可从触发器获得的用户身份将是应用程序的帐户,而不是 Web 应用程序用户的 ID(这很可能是您真正想要存储的内容)在您的 CreatedBy 字段中)。这只会帮助您区分由您的网络应用代码创建的记录和其他方式创建的记录。
CreatedDate 和 ModifiedDate 列并不是多余的,因为它们是在每个表中定义的。我会坚持这种方法,并在每个表上放置插入和更新触发器以填充这些列。如果我还需要记录进行更改的最终用户,我会跳过触发器并从我的应用程序代码中填充时间戳和用户字段。
【解决方案5】:
它适用于我从事的基于网络的 CMS。创建日期和最后更新日期将显示在大多数页面上,并且会有最后创建(和更新)页面的列表。管理界面也将使用此信息。