【问题标题】:How to store previous 30 days and next 30 days data?如何存储前 30 天和后 30 天的数据?
【发布时间】:2018-02-19 16:04:04
【问题描述】:

假设我有 100 件商品的价格每天都在变化。假设今天是 2017 年 9 月 11 日,我想存储过去 30 天和接下来 30 天的这 100 件商品的价格,比如从 2​​017 年 8 月 11 日到 2017 年 10 月 11 日。如果我选​​择每个日期作为列名,那么我将有 100 行(每个项目 1 行),每行将有 60 列(每列将显示当天价格的数据)。现在今天结束后,我必须删除对应于 8 月 11 日的列并添加对应于 10 月 12 日的列。我是否应该为此使用 Cron。

【问题讨论】:

    标签: mysql database-design cron time-series nosql


    【解决方案1】:

    如果您选择理性数据库,那么这是一项简单的任务,您只需要创建一个将产品价格与日期联系起来的表。

    一个例子:

    | productId | day        | price  |
    | 1         | 11-09-2017 | 50.25  |
    | 2         | 11-09-2017 | 12.50  |
    

    【讨论】:

    • 我应该如何处理删除数据。假设在 9 月 12 日,不需要 Aug11 数据,那么我应该获取对应于 Aug11 的每一行并删除它们。如果是,那么我应该如何自动化这个任务?我的意思是,每天都必须从数据库中删除数据。
    • 您需要每天运行DELETE查询:DELETE FROM dailyPrices WHERE day + INTERVAL 30 DAY <= NOW()
    • 更常见的方法是将不需要的记录标记为未激活或已归档。为此添加另一列,例如 isActive 类型 ENUM,值为“yes/no”。当您获取数据时,只选择标记为“活动”的数千条记录。然后您将只更新过期记录上的标志:UPDATE dailyPrices SET isActive="no" WHERE day + INTERVAL 30 DAY <= NOW()
    • 我是否应该每天使用 Cron 删除一列(对于低于 30 天标记的列)并添加一个添加新日期的列
    • 不,这将是一个可怕的表结构。理想情况下,表结构永远不应该改变。当您的表结构中有大量数据时,更改ALTERs 将花费大量时间并且会锁定表以进行读写操作。
    【解决方案2】:

    不!一个表中有 60 个滚动行,而不是 60 个滚动列。

    每天INSERT 和DELETE 很容易。对列做同样的事情很麻烦。

    该表将具有(至少):(日期,item_id,价格)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-01
      • 2021-08-25
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多