1

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

books
-----
id
name

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

"select count(id) from books"

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

编辑:但自上个月以来,有些书已从表中删除

很明显,你不能总计过去一个月 - “书籍”表始终是最新的,并且一些记录已经被删除

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

4

8 回答 8

3

添加一个具有GETDATE()值的默认列,将其称为“DateAdded”。然后,您可以在任意两个日期之间查询以找出该日期期间有多少本书,或者您可以只指定一个日期来找出某个日期之前有多少本书(一直到历史记录)。

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

于 2009-07-16T01:40:40.507 回答
1

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

当然,如果极端尺寸成为问题,那么是的,您可能必须开始物理移动/删除行。

于 2009-07-16T01:55:38.787 回答
1

我的方法是在月底运行一个 cron 作业(或计划任务)并将总数存储在另一个名为 report_data 的表中,但这似乎很笨重。

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

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

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

于 2009-07-16T02:02:18.000 回答
1

您刚刚在历史数据库或数据仓库的道路上迈出了一小步。

数据仓库通常以某种格式存储有关事物方式的数据,以便以后的数据将添加到当前数据中,而不是取代当前数据。有很多关于数据仓库的知识。如果你正认真地走这条路,我建议你读一本 Ralph Kimball 或 Bill Inmon 的书。我更喜欢金博尔。

这是网站:http ://www.ralphkimball.com/

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

另一方面,如果您进入该领域的第一步是您计划采取的唯一步骤,那么您提出的解决方案就足够了。

于 2009-07-16T12:43:35.030 回答
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'

注意:这不是最好的模式,但你明白了...... ;)

于 2009-07-16T04:03:17.287 回答
1

如果更改表的架构工作量太大,我会添加跟踪更改的触发器。使用这种方法,您可以跟踪各种事情,例如添加日期、删除日期等。

于 2009-07-16T04:04:18.907 回答
1

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

于 2009-07-16T04:13:35.253 回答
0

做你想做的唯一方法是在书表“date_added”中添加一列。然后你可以运行一个查询

select count(id) from books where date_added <= '06/30/2009'; 
于 2009-07-16T01:31:26.867 回答