SQL - 表设计 - DateCreated和DateUpdated列

时间:2008-10-26 00:02:50

标签: sql timestamp insert-update

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

我即将设计数据库,我想存储创建和更新实体的日期。这是它变得棘手的地方。当然有一个选择是为每个实体表添加created_timestamp和update_timestamp列但不是那个还原剂?

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

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

5 个答案:

答案 0 :(得分:6)

单对数表对所有表的方法有两个我能想到的主要问题:

  1. 日志表的设计(可能)会限制所有其他表的设计。很可能日志表有一个名为TableName的列,然后是另一个名为PKValue的列(它将存储您正在记录的记录的主键值)。如果您的某些表具有复合主键(即多个列),则日志表的设计必须考虑到这一点(可能包含PKValue1,PKValue2等列。)
  2. 如果这是某种Web应用程序,则触发器可用的用户身份将是应用程序的帐户,而不是Web应用程序用户的ID(这很可能是您真正要存储的内容)在你的CreatedBy字段中)。这只会帮助您区分由Web应用程序代码创建的记录和以其他方式创建的记录。
  3. CreatedDate和ModifiedDate列不是冗余的,因为它们是在每个表中定义的。我会坚持使用这种方法,并在每个表上放置插入和更新触发器以填充这些列。如果我还需要记录进行更改的最终用户,我会跳过触发器并从我的应用程序代码中填充时间戳和用户字段。

答案 1 :(得分:5)

我使用“日志”或“事件”表执行后者。根据我的经验,“更新”的时间戳很快就变得令人沮丧,因为很多时候你发现自己不仅仅需要最新的更新时间。

答案 2 :(得分:0)

您需要多长时间在表示层中包含已创建/更新的时间戳?如果答案不仅仅是“曾经很长一段时间”,那么我认为通过在每个表格中添加这些列可以提供更好的服务。

答案 3 :(得分:0)

在我几年前工作的项目中,我们实现了触发器,它们更新了我们称之为审计表的内容(它存储了有关所做更改的基本信息,每个表有一个审计表)。这包括修改日期(以及最后修改日期)。

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

这消除了很多正常的挫败感,不得不考虑LastCreated& LastModified字段,但引入了使触发器保持最新的烦恼。

最后,触发/审计表设计运行良好,我们必须记住的是在ETL(!)之前删除并重新应用触发器。

答案 4 :(得分:0)

这是我工作的基于网络的CMS。创建和上次更新日期将显示在大多数页面上,并且将显示最后创建(和更新)页面的列表。管理界面也将使用此信息。