【问题标题】:Is there a better way to get old data?有没有更好的方法来获取旧数据?
【发布时间】:2010-11-11 05:05:03
【问题描述】:

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

books
-----
id
name

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

"select count(id) from books"

但现在你想获取上个月的图书总数...

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

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

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

【问题讨论】:

  • 您无法更改表架构以包含“日期”列?
  • 上个月的图书总数是多少?上个月添加的?

标签: php database database-design application-design


【解决方案1】:

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

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

【讨论】:

  • 不应该删除,你说?我们这里越来越近了。顺便说一句,当它像这样简单时,我通常会删除
  • 但是现在 b/c 您尝试报告数据库的历史状态并不简单。 :) 所以,你的要求是很难删除不是正确的答案。
  • 真真。由于额外的 sql(其中 is_deleted 1),我从不喜欢这样做。有任何 MySQL 快捷方式或技巧来处理这个问题吗?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

    • 这里的一个负面因素是,如果您需要查看数字是如何生成的,您将永远无法再次看到该数据
    【解决方案4】:

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

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

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

    您可以从那里查询:

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

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

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

          【讨论】:

            【解决方案8】:

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

            select count(id) from books where date_added <= '06/30/2009'; 
            

            【讨论】:

            • 我应该提到书籍可以从表中删除。很抱歉让你们中的一些人走错了路
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-14
            • 2014-05-14
            • 2011-03-09
            • 1970-01-01
            • 2021-11-27
            相关资源
            最近更新 更多