2016-06-08 3 views
1

У меня есть некоторые датчики в моем доме. И сейчас я собираюсь записывать их в базу данных. Так как я новичок в MySQL, мне понадобится помощь, настроив правильную структуру. Фактические значения сохраняются автоматически каждые 5 минут. Поскольку количество значений после года действительно очень высокое, я напишу программу на C#, которая рассчитает для каждого дня MIN, MAX & AVG и сохранит значения за этот день.MySQL, структура базы данных домашних датчиков

Эта структура я хочу иметь и, как я знаю, к югу таблицы не в MySQL мне нужна помощь:

Database: SensorData 
       | 
       |----------------------- 
       |      | 
Tables: LivingRoom    Outside 
       |      | 
       |------------   | 
       |   |   | 
Columns: Temperature Humidity Temperature 

Эти колонны держат «реальные» значения в день. Но теперь я буду вычислять MIN, MAX и AVG этих столбцов. И я не знаю, где разместить результаты, которые я могу легко выбрать: 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    |  | 
+----------------+--------------+------+-----+-------------------+-------+ 

или

+----------------+--------------+------+-----+-------------------+-------+ 
| Field   | Type   | Null | Key | Default   | Extra | 
+----------------+--------------+------+-----+-------------------+-------+ 
| Datum   | timestamp | NO | PRI | CURRENT_TIMESTAMP |  | 
| Temperatur  | decimal(5,2) | YES |  | NULL    |  | 
| Humidity  | decimal(5,2) | YES |  | NULL    |  | 
+----------------+--------------+------+-----+-------------------+-------+ 

мая кто-то есть идея для интеллектуального решения ... Я полностью гибко отношусь к дизайну базы данных/таблицы/столбца, поскольку я только начал проектировать.

ответ

0

Как насчет этого? В одном столе вы можете иметь ENUM для гостиной/снаружи.

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; 

, а затем вы можете запустить этот запрос, чтобы получить MAX, MIN и AVG для всех данных, которые вы сгруппированных в день !.

SELECT MAX(temperature),MIN(temperature),AVG(temperature) FROM sensor_data GROUP BY DATE(time_recorded) ORDER BY DATE(time_recorded); 
+0

ENUM - это новое для меня. THX для этого! Но это приведет только к объединению двух таблиц в одну таблицу. Но как обрабатывать мин, макс ... для температуры и влажности. Если я добавлю столбец MIN, MAX и AVG, я должен отделить, если это значения для температуры или влажности датчика. – Portisch

+0

Для этого вам не нужна другая таблица. Mysql имеет встроенные функции, которые могут сделать это прямо на этой таблице, когда вам это нужно. Пример: 'select MAX (температура) FROM sensor_data WHERE type = 'Living Room' GROUP BY DATE (время);' – phreakv6

0

Я буду удалять фактические (все 5 минут), сохраненные значения каждый день, и прежде чем я сделать резервную копию этого дня минимум, максимум, .. Я не интересует, что температура была 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 
); 

Manuel обработка:

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; 
0

Таблица: датчиков

Описание: Используется для хранения основной информации датчика, например, название и местонахождение

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; 

Стол: sensors_data

Описание: Используется для данных датчиков магазина, включая температуру и влажность на основе дней и времени

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 

Стол: sensors_data

Описание: использовано для хранения средних данных датчиков, включая температуру и влажность, исходя из дней

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 

Вы создаете ели и заполняли таблицу sensors_data_average, используя значения в sensor_data каждый день, неделю или месяц, а затем удаляли данные, которые использовались для создания средних значений из базы данных.

Смежные вопросы