2009-02-18 51 views
2

我正在设计一个数据库来存储产品信息,我想存储几个月的历史(价格)数据以供将来参考。不过,我希望在一段时间后,尽可能少地花时间重写初始条目以查找初始条目。有没有人有如何解决这个问题的好主意?我最初的设计是创建一个名为历史数据的表格,并且每天都会抽取活动数据并将其存储到具有时间戳的历史数据库中。有没有人有更好的主意?或者可以看到我的问题?你将如何维护SQL表中的历史记录?

+0

我htaler同意,我平时也与更新触发器去在现场表上。在更新时向历史表插入新记录。然后,您可以安排一个SQL作业来清理过时的历史数据。 – parapet 2009-02-18 08:35:41

回答

1

这是一个比最初看起来更广泛的话题。关于“随时间变化的事物”,Martin Fowler有一个不错的narrative

2

首先,我想对您提出的解决方案发表评论。当然,薄弱环节实际上可能会在你的间隔期间发生一次以上的变化。这意味着,该记录在一天中更改了三次,但只记录了最后一次更改。

可能有更好的解决方案,但它必须是事件驱动的。如果您的数据库服务器支持事件或触发器(如MS SQL),则应该编写一个触发器代码,用于在历史记录表中创建条目。如果您的服务器不支持触发器,则可以将存档代码添加到应用程序(在保存操作期间)。

1

您可以在价格表上放置一个触发器。这样,您可以在每次更新或删除事件时将旧价格存档在另一张表中。

0

如果您所需的历史数据是当天数据结束的快照,则您的方法似乎很有用 - 过去,我使用了一种类似的方法来处理当天的新数据(时间戳)然后使用“删除所有今天具有时间戳<的数据 - x”,其中x是我想保留的数据的时间段。

如果您需要跟踪所有历史记录更改,那么您需要查看触发器。

0

我想,一个设定时间后,开始覆盖初始条目以最小的努力来找到最初条目

我们的数据存储在归档表,使用一个触发器,因为其他人建议。我们的存档表具有AuditDate的附加列,并存储“已删除”数据 - 即先前版本的数据。当前数据只存储在实际表中。

我们沿着“删除3个月以上的所有存档数据,至少存在一个3个月以下的存档记录;删除超过6个月的所有存档数据“

因此,如果在过去3个月没有价格变化,您仍然可以在3-6个月前的价格变化记录。

(问,如果你需要的自引用联接做删除或触发存储在归档表格变化的一例)

相关问题