MySQL,家庭传感器数据库结构
我的房子里有一些传感器。现在我要把它们记录到数据库中。因此,由于我是MySQL新手,我需要一些帮助来设置正确的结构。 实际值每5分钟自动存储一次。 由于值的数量在运行一年后非常高,我将编写一个C程序,计算每天的最小值、最大值和平均值,并保存这一天的值 这就是我想要的结构,我知道MySQL中不允许使用子表,我需要帮助:MySQL,家庭传感器数据库结构,mysql,Mysql,我的房子里有一些传感器。现在我要把它们记录到数据库中。因此,由于我是MySQL新手,我需要一些帮助来设置正确的结构。 实际值每5分钟自动存储一次。 由于值的数量在运行一年后非常高,我将编写一个C程序,计算每天的最小值、最大值和平均值,并保存这一天的值 这就是我想要的结构,我知道MySQL中不允许使用子表,我需要帮助: Database: SensorData | |-----------------------
Database: SensorData
|
|-----------------------
| |
Tables: LivingRoom Outside
| |
|------------ |
| | |
Columns: Temperature Humidity Temperature
这些列包含实际的日值。
但现在我将计算这些列的最小值、最大值和平均值。
我不知道在哪里放置我可以轻松选择的结果,比如:
Sensordata.LivingRoom.Temperature.MIN或Sensordata.LivingRoom.Temperature.MAX
但这需要一个列中的表
这些表格非常简单,如下所示:
+----------------+--------------+------+-----+-------------------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+-------------------+-------+
| Datum | timestamp | NO | PRI | CURRENT_TIMESTAMP | |
| Temperatur | decimal(5,2) | YES | | NULL | |
+----------------+--------------+------+-----+-------------------+-------+
或
也许有人有一个智能解决方案的想法。。。
我对数据库/表/列的设计非常灵活,因为我刚刚开始设计。这个怎么样?在单个表中,您可以拥有客厅/室外的枚举
CREATE TABLE `sensor_data` (
`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
`type` enum('Living Room','Outside') NOT NULL,
`time_recorded` datetime NOT NULL,
`temperature` decimal(5,2) NOT NULL,
`humidity` decimal(5,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
然后,您可以运行此查询以获取按天分组的所有数据的最大值、最小值和平均值
SELECT MAX(temperature),MIN(temperature),AVG(temperature) FROM sensor_data GROUP BY DATE(time_recorded) ORDER BY DATE(time_recorded);
我每天都会删除所有5分钟的实际存储值,然后用min,max,….对这一天进行备份,。。我对过去3周上午9点20分的气温不感兴趣。不管怎样,使用枚举,我想我得到了一个结果:
CREATE TABLE `sensor_data` (
`time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`sensor` enum('Living Room','Outside') NOT NULL,
`temperature` decimal(5,2) NULL,
`humidity` decimal(5,2) NULL,
`calc_type` enum('none','temperature','humidity') NOT NULL DEFAULT 'none',
`MIN` decimal(5,2) NULL,
`MAX` decimal(5,2) NULL,
`AVG` decimal(5,2) NULL
);
曼纽尔处理:
insert into sensor_data (sensor, temperature) values ('Living Room', '24.5');
insert into sensor_data (sensor, humidity) values ('Living Room', '53');
insert into sensor_data (sensor, temperature) values ('Outside', '23.5');
SELECT MIN(temperature) FROM sensor_data WHERE DATE(time) = '2016-06-08' AND sensor = 'Outside';
SELECT MIN(temperature) FROM sensor_data WHERE DATE(time) = '2016-06-08' AND sensor = 'Living Room';
SELECT MIN(humidity) FROM sensor_data WHERE DATE(time) = '2016-06-08' AND sensor = 'Living Room';
INSERT INTO sensor_data (time, sensor, calc_type, MIN) VALUES ('2016-06-08', 'Outside', 'temperature', '23.5');
INSERT INTO sensor_data (time, sensor, calc_type, MIN) VALUES ('2016-06-08', 'Living Room', 'temperature', '24.5');
INSERT INTO sensor_data (time, sensor, calc_type, MIN) VALUES ('2016-06-08', 'Living Room', 'humidity', '53');
SELECT MIN FROM sensor_data WHERE DATE(time) = '2016-06-08' AND sensor = 'Outside' AND calc_type = 'temperature' AND temperature IS NULL;
SELECT MIN FROM sensor_data WHERE DATE(time) = '2016-06-08' AND sensor = 'Living Room' AND calc_type = 'temperature' AND temperature IS NULL;
SELECT MIN FROM sensor_data WHERE DATE(time) = '2016-06-08' AND sensor = 'Living Room' AND calc_type = 'humidity' AND humidity IS NULL;
表:传感器
描述:用于存储基本传感器信息,如名称和位置
CREATE TABLE `sensors` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`model` varchar(32) DEFAULT NULL,
`location` varchar(32) DEFAULT NULL,
`status` int(11) DEFAULT '1',
`created` datetime DEFAULT '0000-00-00 00:00:00',
`modified` datetime DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
表:传感器数据
描述:用于存储传感器数据,包括基于日期和时间的温度和湿度
CREATE TABLE `sensors_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sensor_id` int(11) NOT NULL,
`temperature` decimal(5,2) NOT NULL DEFAULT 0,
`humidity` decimal(5,2) NOT NULL DEFAULT 0,
`created` datetime DEFAULT '0000-00-00 00:00:00',
`modified` datetime DEFAULT '0000-00-00 00:00:00',
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
表:传感器数据
描述:用于存储传感器数据平均值,包括基于天数的温度和湿度
CREATE TABLE `sensors_data_average` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sensor_id` int(11) NOT NULL,
`type_key` varchar(8) NOT NULL,
`temperature` decimal(5,2) NOT NULL DEFAULT 0,
`humidity` decimal(5,2) NOT NULL DEFAULT 0,
`date` date DEFAULT '0000-00-00',
`created` datetime DEFAULT '0000-00-00 00:00:00',
`modified` datetime DEFAULT '0000-00-00 00:00:00',
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
表:类型
描述:用于存储传感器数据类型MIN、MAX、AVG
CREATE TABLE `type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL,
`key` varchar(8) NOT NULL,
`created` datetime DEFAULT '0000-00-00 00:00:00',
`modified` datetime DEFAULT '0000-00-00 00:00:00',
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
INSERT INTO type SET `name` = 'Minimum', `key` = 'min', created = NOW(), modified = NOW();
INSERT INTO type SET `name` = 'Maximum', `key` = 'max', created = NOW(), modified = NOW();
INSERT INTO type SET `name` = 'Average', `key` = 'avg', created = NOW(), modified = NOW();
根据这些表,以下是您的关系:
sensors have many sensors_data
sensors have many sensors_data_average
sensors_data belongs to sensors
sensors_data_average belongs to sensors
sensors_data_average has one type
您可以每天、每周或每月使用传感器数据中的值创建并填充传感器数据平均值表,然后从数据库中删除用于创建平均值的数据。ENUM对我来说是新的。谢谢!但这只会将两个表合并到一个表中。但是如何处理最小值,最大值,。。。温度和湿度。如果我加上一列MIN、MAX和AVG,我必须把它们分开,如果它们是传感器的温度或湿度值,你不需要另外的表格。Mysql内置了一些函数,可以在需要时在这个表上实现这一点。示例:从传感器_数据中选择MAXtemperature,其中类型=按日期时间分组的“客厅”;
sensors have many sensors_data
sensors have many sensors_data_average
sensors_data belongs to sensors
sensors_data_average belongs to sensors
sensors_data_average has one type