Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

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

#mysql


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

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

+------------+--------------+------+-----+---------+----------------+
| 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 - ссылка на другую таблицу с описанием параметра.

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


Ответы

Ответ 1



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

Ответ 2



Можете хранить значения в отдельных колонках: столько колонок, сколько у вас "параметров". Каждая колонка с нужным типом, у каких-то колонок тип может совпадать, это непринципиально. Все колонки с атрибутом 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

Ответ 3



Вообще, задача не полна без описания алгоритма дальнейшего использования. По какому принципу потом в эту таблицу будут запросы делаться? Почему 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) ); и так далее.

Ответ 4



Почему бы не завести по таблице на каждый тип + таблицу-индекс?

Комментариев нет:

Отправить комментарий