您将如何维护SQL表中的历史记录?

我正在设计一个数据库来存储产品信息,而且我想存储几个月的历史(价格)数据以供未来参考。 可是,我想在设定的时间以后,以最小的努力开始覆盖初始条目,以查找初始条目。 有谁对如何解决这个问题有个好主意? 我最初的设计是要有一个名为历史数据的表,天天,它都会提取活动数据并将其存储到带有时间戳的历史数据库中。 有谁有更好的主意吗? 仍是能够看到个人问题在哪里? html


#1楼

这个话题比最初看起来要普遍得多。 马丁·福勒(Martin Fowler)对“随时间变化的事物”有一个很好的叙述数据库


#2楼

首先,我想评论一下您提出的解决方案。 固然,最弱的部分是,您的间隔之间实际上可能存在多个变化。 这意味着该记录在一天中被更改了三次,可是您只存档了最后的更改。 服务器

可能有更好的解决方案,但它必须是事件驱动的。 若是您拥有支持事件或触发器的数据库服务器(例如MS SQL),则应编写触发器代码以在历史表中建立条目。 若是您的服务器不支持触发器,则能够将归档代码添加到您的应用程序中(在“保存”操做期间)。 spa


#3楼

您能够在价格表上放置触发器。 这样,您能够在每次更新或删除事件时将旧价格归档到另外一个表中。 设计


#4楼

IMO若是您所需的历史数据是一天结束数据的快照,那么您的方法彷佛是正确的-过去,我对隔夜做业(SP)使用了相似的方法,该任务能够获取当天的新数据,对其进行时间戳记,而后使用“删除全部时间戳<今天-x的数据”,其中x是我要保留的数据时间段。 htm

若是您须要跟踪全部历史记录更改,则须要查看触发器。 事件


#5楼

我想在设定的时间后,以最小的努力开始覆盖初始条目,以查找初始条目 ci

正如其余人所建议的,咱们使用触发器将数据存储在存档表中。 咱们的存档表具备AuditDate的附加列,并存储“已删除”数据-即数据的先前版本。 当前数据仅存储在实际表中。 get

咱们根据“删除三个月以上的全部存档数据,其中存在至少一个小于三个月的存档记录;删除六个月以上的全部存档数据”的行,对存档表进行修剪。 产品

所以,若是最近3个月内没有价格变化,您仍会拥有3到6个月前的价格变化记录。

(询问您是否须要使用self-referencing-join的示例来执行删除操做,或使用触发器将更改存储在Archive表中)

相关文章
相关标签/搜索