Структура таблицы MySQL для архивирования данных различных типов

Рейтинг: 4Ответов: 3Опубликовано: 29.09.2014

Необходимо в таблицу с определенной периодичностью заносить значения различных параметров. Значения могут быть целочисленные, дробные и булевые (хотелось бы еще строки, но не обязательно).

Сейчас структура такая:

+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| tag_id     | int(11)      | YES  | MUL | NULL    |                |
| value      | varchar(255) | NO   |     | NULL    |                |
| date       | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

date - время измерения;
value - значение параметра;
tag_id - ссылка на другую таблицу с описанием параметра.

Чутье подсказывает, что хранить числа в строке неправильно. Как быть, посоветуете?

Ответы

▲ 3

По-хорошему надо приводить любой архивируемый тип к типу архива самостоятельно. Например есть сериализация, т.е. перевод любого значения в строку. Или можно конвертировать любой тип в бинарные данные. Соотв. использовать или text/varchar (у последнего ограничение по символам) или blob

▲ 1

Можете хранить значения в отдельных колонках: столько колонок, сколько у вас "параметров". Каждая колонка с нужным типом, у каких-то колонок тип может совпадать, это непринципиально. Все колонки с атрибутом NULL. Это как раз тот случай, когда null-able уместен.

CREATE TABLE `multi` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `tag_id` int(11) NOT NULL,
  `field_a` int(10) NULL,
  `field_b` float(10,2) NULL,
  `field_c` tinyint(1) NULL,
  PRIMARY KEY (`id`)
);

Писать и добывать в/из разных колонки зависимости от tag_id. Если понадобится имитировать одну универсальную колонку, то можно использовать доступ к полю по номеру:

SELECT tag_id, ELT(tag_id, field_a, field_b, field_c) AS value
FROM multi
▲ 1

Вообще, задача не полна без описания алгоритма дальнейшего использования. По какому принципу потом в эту таблицу будут запросы делаться?

Почему tag_id может быть NULL? Насколько я понимаю, именно по нему будет определяться, что же за параметр тут сохранен?

Так-то делал бы так. Допускаем, что в таблице с описанием есть поле type, описывающие тип параметра

CREATE TABLE main (
id int(11) NOT NULL AUTO_INCREMENT,
tag_id int(11) NOT NULL,
PRIMARY KEY(id)
);

CREATE TABLE int_values (
id int(11),
value int(11),
FOREIGN KEY (id) REFERENCES main(id)
);

CREATE TABLE bool_values (
id int(11),
value BOOL,
FOREIGN KEY (id) REFERENCES main(id)
);

и так далее.