有没有更好的方法来获取旧数据?

时间:2009-07-16 00:21:50

标签: php database database-design application-design

假设你有一个这样的数据库:

books
-----
id
name

你想获得数据库中的书籍总数,最简单的sql:

"select count(id) from books"

但是现在你想获得上个月的书总数 ......

  

编辑:但有些书已经出版了   自上个月以来从表中删除

很明显你已经过了一个月已经过去了 - “books”表总是最新的并且有些记录已被删除

我的方法是在月末运行一个cron作业(或计划任务)并将总计存储在另一个名为report_data的表中,但这看起来很笨拙。有更好的想法吗?

8 个答案:

答案 0 :(得分:3)

添加值default columnGETDATE(),将其命名为“DateAdded”。然后,您可以在任意两个日期之间查询以查找该日期期间有多少本书,或者您可以指定一个日期以查明在某个日期之前有多少本书(一直到历史记录)。

每条评论:你不应该删除,你应该soft delete

答案 1 :(得分:1)

我同意JP,做一个软删除/逻辑删除。对于每个查询一个额外的AND语句,它使一切变得更容易。此外,您永远不会丢失数据。

当然,如果极端尺寸成为问题,那么,你可能不得不开始实际移动/移除行。

答案 2 :(得分:1)

  

我的方法是在月末运行一个cron作业(或计划任务)并将总计存储在另一个名为report_data的表中,但这看起来很笨拙。

我使用此方法收集和存储历史数据。它比软删除解决方案更简单,因为:

  • “report_data”表非常容易从
  • 生成报告/图表
  • 您不必为需要删除图书的任何内容实施特殊的软删除代码
  • 您不必在从books表中选择的每个查询的末尾添加“和active = 1”

因为执行历史报告的代码与其他使用书籍的代码是隔离的,所以这实际上是不那么笨重的解决方案。

答案 3 :(得分:1)

如果您需要上个月的数据,则不应删除旧数据。相反,您可以进行“逻辑删除”。

我会在表格中添加一个状态字段和一些日期。

books
_____
id
bookname
date_added
date_deleted
status (active/deleted)

从那里你可以查询:

SELECT count(id) FROM books WHERE date_added <= '06/30/2009' AND status = 'active'

注意:我不是最好的架构,但你明白了......;)

答案 4 :(得分:1)

如果更改表的架构太多了,我会添加跟踪更改的触发器。使用这种方法,您可以跟踪各种事物,如添加日期,删除日期等。

答案 5 :(得分:1)

看看你的问题以及不愿意改变架构和代码,我建议你按照你在每个月末计算书籍的想法,并将月份的计数存储在另一个表中。您可以使用数据库调度程序来调用SP来执行此操作。

答案 6 :(得分:1)

您刚刚走过了历史数据库或数据仓库的道路。

数据仓库通常存储有关事物格式的数据,以便以后的数据将被添加到当前数据而不是取代当前数据。有关数据仓库的知识有很多。如果你以严肃的方式走在那条路上,我会推荐Ralph Kimball或Bill Inmon的一本书。我更喜欢Kimball。

以下是网站:http://www.ralphkimball.com/

http://www.inmoncif.com/home/

另一方面,如果您迈出这一领域的第一步是您计划采取的唯一步骤,那么您建议的解决方案就足够了。

答案 7 :(得分:0)

执行所需操作的唯一方法是在books表“date_added”中添加一列。然后你可以运行像

这样的查询
select count(id) from books where date_added <= '06/30/2009';