MySQL,家庭传感器数据库结构

MySQL,家庭传感器数据库结构,mysql,Mysql,我的房子里有一些传感器。现在我要把它们记录到数据库中。因此,由于我是MySQL新手,我需要一些帮助来设置正确的结构。 实际值每5分钟自动存储一次。 由于值的数量在运行一年后非常高,我将编写一个C程序,计算每天的最小值、最大值和平均值,并保存这一天的值 这就是我想要的结构,我知道MySQL中不允许使用子表,我需要帮助: Database: SensorData | |-----------------------

我的房子里有一些传感器。现在我要把它们记录到数据库中。因此,由于我是MySQL新手,我需要一些帮助来设置正确的结构。 实际值每5分钟自动存储一次。 由于值的数量在运行一年后非常高,我将编写一个C程序,计算每天的最小值、最大值和平均值,并保存这一天的值

这就是我想要的结构,我知道MySQL中不允许使用子表,我需要帮助:

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