当前位置:  开发笔记 > 前端 > 正文

如何避免向表中添加时间戳字段?

如何解决《如何避免向表中添加时间戳字段?》经验,为你挑选了3个好方法。

我有一个关于我们在许多解决方案中看到的每个记录的两个附加列(timeCreated,timeLastUpdated)的问题.我的问题:有更好的选择吗?

场景:你有一个巨大的数据库(就表而言,而不是记录),然后客户来,并要求你为80%的表添加"时间戳".

我相信这可以通过使用单独的表(TIMESTAMPS)来完成.除了明显的时间戳列之外,该表还将具有正在更新的表的表名和主键.(我在这里假设您使用int作为大多数表的主键,但表名很可能必须是字符串).

想象一下这个基本情景.我们有两张桌子:

付款方式: - (你平时的记录)
TIMESTAMP: - {当前时间戳} + { TABLE_UPDATED,id_of_entry_updated,timestamp_type}

请注意,在此设计中,您不需要在本机支付对象中使用这两个"额外"列(顺便说一下,它可能通过您的ORM解决方案),因为您现在正在使用TABLE_UPDATED和编制索引id_of_entry_updated.此外,timestamp_type将告诉您条目是否用于插入(例如"1"),更新(例如"2")以及您可能想要添加的任何其他内容,例如"删除".

我想知道你对这个设计有什么看法.我最感兴趣的是最佳实践,有效和随着时间的推移而扩展.参考,链接,博客条目非常受欢迎.我知道至少有一项专利(待定)试图解决这个问题,但似乎目前细节尚未公开.

干杯,爱德华多



1> Joel Coehoor..:

当你在它时,也记录进行更改的用户.

具有独立表设计的缺陷(除了其他人突出显示的连接性能之外)是假设每个表都有一个密钥的标识列.这并非总是如此.

如果您使用SQL Server,新的2008版本支持他们调用的内容Change Data Capture,这会消除您所谈论的很多痛苦.我认为Oracle可能也有类似的东西.


更新:显然Oracle称其为与SQL Server相同的东西.或者更确切地说,SQL Server将其称为Oracle,因为Oracle的实现是第一次;)
http://www.oracle.com/technology/oramag/oracle/03-nov/o63tech_bi.html



2> davetron5000..:

我使用了一个设计,其中每个要审计的表都有两个表:

create table NAME (
  name_id int,
  first_name varchar
  last_name varchar
  -- any other table/column constraints
)

create table NAME_AUDIT (
  name_audit_id int
  name_id int
  first_name varchar
  last_name varchar
  update_type char(1) -- 'U', 'D', 'C'
  update_date datetime
  -- no table constraints really, outside of name_audit_id as PK
)

创建一个数据库触发器,NAME_AUDIT每次执行任何操作时都会填充NAME.通过这种方式,您可以记录对表格所做的每一次更改.应用程序对此没有真正的了解,因为它是由数据库触发器维护的.

它工作得相当好,并且不需要对应用程序代码进行任何更改来实现.



3> Dana..:

我想我更喜欢将时间戳添加到各个表中.在复合键上加入时间戳表 - 其中一个是字符串 - 会变慢,如果你有大量数据,它最终将成为一个真正的问题.

此外,很多时候,当您查看时间戳时,您正在调试应用程序中的问题并且您希望数据就在那里,而不是总是必须加入另一个表.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有