首页 > 解决方案 > 如何在 SQL 中构造传感器数据?

问题描述

我想将来自多个气象站的传感器数据存储在 SQL 数据库中,以便可以通过 django 网页查看。

为了使解释简单,我每隔几分钟从每个气象站读取一些传感器(布尔值和浮点值)。我还想存储每个读数的时间戳。

在 SQL 数据库中构造这些数据的最佳方法是什么?我想让系统运行多年,所以它必须能够存储几十万个值。我还需要读取这些值以显示在图表中。

标签: mysqlsqldjangosqlitetime-series

解决方案


首先,您可以有 2 张桌子 -stationsreadings.

stations表有一个自动增量 id 字段以及有关您需要/拥有的站点的任何其他信息。例如:

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL DEFAULT '0',
`lat` DOUBLE NOT NULL DEFAULT '0',
`lng` DOUBLE NOT NULL DEFAULT '0',
...other things
PRIMARY KEY (`id`)

readings表包含在给定时间来自电台的单个报告的条目(我猜这些值将在几分钟内取平均值):

`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`time` TIMESTAMP NOT NULL,
`id_station` INT NOT NULL,
`temp` DOUBLE NULL,
`humidity` DOUBLE NULL,
`wind_speed` DOUBLE NULL,
`wind_dir` DOUBLE NULL,
`pressure` DOUBLE NULL,
`squirrel_count` DOUBLE NULL,
... other things 
PRIMARY KEY (`id`),
INDEX `time` (`time`),
INDEX `id_station` (`id_station`)

根据读数的数量和服务器的“大”程度,您可能可以使用此表进行汇总(例如每天)并创建图表,或者您可能需要在另一个表中预先汇总数据以进行报告。

例如:脚本/SQL proc 每天运行一次查询,该查询汇总前一天的数据并将其插入到另一个表中。第二个表与第一个表几乎相同,只是它只包含每日平均值(而不是几分钟的平均值)。

您可以根据报告的需要使用预聚合来创建具有不同粒度(每小时、每天、每周...)的多个表。您需要多少和哪些取决于您希望它运行多快以及您拥有的硬件。


推荐阅读