#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
Почему бы не завести по таблице на каждый тип + таблицу-индекс?
Комментариев нет:
Отправить комментарий