繁体   English   中英

带有旋转数据的mysql数据库

[英]mysql database with revolving data

我不确定表达这个问题的最佳方法!

我有一个mysql数据库,需要检索和存储过去的24个数据值,并且数据始终需要是最后的24个数据值。

我已经完成了所有工作,但是我确信必须有更好的方法来做到这一点!

刚才,我的mysql数据库有ID,时间戳等列,然后有24个数据列:

data_01
data_02
data_03
data_04
data_05
etc

有多个行用于不同的ID。

我每小时运行一次cron作业,该作业会删除列“ data_24”,然后重命名所有列:

data_01 -> data_02
data_02 -> data_03
data_03 -> data_04
data_04 -> data_05
data_05 -> data_06
etc

然后添加一个新的空白列:

data_01

然后将新数据添加到此新的空白列中。

这听起来像是明智的方法吗,还是有更好的方法呢?

我对这种方法的担心是,在检索新数据之前,必须先完成列的删除,重命名和添加,以便存在用于添加数据的新列。

如果由于某种原因数据检索失败,那么我的表将包含一列以NULL作为数据值的列。

重命名此类的列不是一个好主意。

我很好奇您如何插入和更新此数据,但是必须有更好的方法来执行此操作。

看来可行的两件事:

不重命名该列,而是将数据移动到下一列:

  update YourTable 
  set data1 = :newvalue, 
      data2 = data1, 
      data3 = data2, 
      ...;

或者通过将数据分布在24行而不是24列。 每个数据在表中(或在ID为外键的新表中)都是一行。 每次插入新值时,您也可以删除相同ID的最旧值。 您可以在一个原子事务中完成此操作,因此每个id最多不会超过24行。

insert into YourTable(id, data) 
values (:id, :newvalue);

delete from YourTable
where id = :id
order by timestamp desc
limit 1;

这会将行数(而不是数据量)乘以24,因此对于1000行(如您所提到的),您所谈论的是24000行,如果您具有正确的索引,这仍然是花生。

我们在MySQL中获得的表具有超过1亿行。 与重写1000行的完整表相比,操作24000行要容易得多,这实际上是通过重命名列来完成的工作。

因此,第二种选择当然是我的偏爱。 它将为您提供一个简单的结构,并且如果您决定不清理旧数据,或者将其移至单独的作业,或者保留100个项目而不是24个项目,那么只需更改3行代码即可轻松实现,而不是用它彻底检查表结构和应用程序。

老实说,这看起来不是明智的瘦身方法。

恕我直言,使用多行而不是使用宽表更加灵活。

您可以定义列(id,entity_id,创建的)。 然后,您将能够以“日志”方式写入记录。

当您需要以以前的方式选择数据时,可以使用MySQL视图。 就像是

  CREATE VIEW my_view AS 
  SELECT data_01, ..., data_24   -- here you should put the aggregated values aliased as data_01 ... data_24
  FROM my_table 
  WHERE my_table.created >= DATE_SUB(NOW(), INTERVAL 1 DAY)
  GROUP BY ... -- here you should aggregate the fields by hours
  ORDER BY created;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM