我有一个关于我们在许多解决方案中看到的每个记录的两个附加列(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")以及您可能想要添加的任何其他内容,例如"删除".
我想知道你对这个设计有什么看法.我最感兴趣的是最佳实践,有效和随着时间的推移而扩展.参考,链接,博客条目非常受欢迎.我知道至少有一项专利(待定)试图解决这个问题,但似乎目前细节尚未公开.
干杯,爱德华多
当你在它时,也记录进行更改的用户.
具有独立表设计的缺陷(除了其他人突出显示的连接性能之外)是假设每个表都有一个密钥的标识列.这并非总是如此.
如果您使用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
我使用了一个设计,其中每个要审计的表都有两个表:
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
.通过这种方式,您可以记录对表格所做的每一次更改.应用程序对此没有真正的了解,因为它是由数据库触发器维护的.
它工作得相当好,并且不需要对应用程序代码进行任何更改来实现.
我想我更喜欢将时间戳添加到各个表中.在复合键上加入时间戳表 - 其中一个是字符串 - 会变慢,如果你有大量数据,它最终将成为一个真正的问题.
此外,很多时候,当您查看时间戳时,您正在调试应用程序中的问题并且您希望数据就在那里,而不是总是必须加入另一个表.