[英]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.