|
|
|
| Добрый день. Нужно выбрать наиболее приемлемый, с точки зрения занимаемого пространства, вариант хранения данных в таблице.
Есть четыре параметра, которые нужно хранить в таблице. Назовём их var0, var1, var2 и var3.
Каждый из них хранит одно целое число (int) от 0 до 5 (возможно от -1 до 5).
При десятке тысяч записей, какой вариант будет занимать меньше места?
`var0` ENUM( '-1' , '0', '1', '2', '3', '4', '5' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var1` ENUM( '-1' , '0', '1', '2', '3', '4', '5' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var2` ENUM( '-1' , '0', '1', '2', '3', '4', '5' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var3` ENUM( '-1' , '0', '1', '2', '3', '4', '5' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'
`var0` int( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var1` int( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var2` int( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var3` int( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'
`var` int( '4' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1111'
`var` varchar( '4' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1111'
| По сути дела в последних двух вариантах предлагается хранить все четыре цифры сразу вместе, а потом через explode в скрипте разделять. | |
|
|
|
|
|
|
|
для: Vyacheslav Tsvetkov
(05.10.2012 в 14:33)
| | 4 x TINYINT
P.S. Интересно, как вы собираетесь в INT(4) хранить (-1,-1,-1,-1) ? | |
|
|
|
|
|
|
|
для: Sfinks
(05.10.2012 в 15:06)
| | >P.S. Интересно, как вы собираетесь в INT(4) хранить (-1,-1,-1,-1) ?
Это как раз не сложно, можно отвести по 8 бит на каждое из чисел, как раз получится четыре числа, только придется отсекать маской нужное число и осуществлять побитовый сдвиг... В базах данных большого объема таких выкрутасов, конечно, лучше избегать... | |
|
|
|
|
|
|
|
для: cheops
(05.10.2012 в 21:20)
| | То есть Вы считаете, что лучше (если без отрицательных значений) хранить всё же в одном поле, а потом разделять по explode ( '' , $var )? | |
|
|
|
|
|
|
|
для: Vyacheslav Tsvetkov
(06.10.2012 в 16:51)
| | Не лучше. Размер что так что так 4 байта, а доступ и обработка (поиск, выборка, обновление) - пипец. | |
|
|
|
|
|
|
|
для: Sfinks
(05.10.2012 в 15:06)
| | Если отсечь отрицательные варианты лучше всего будет:
`var0` tinyint( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var1` tinyint( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var2` tinyint( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1',
`var3` tinyint( '1' ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '1'
| ? | |
|
|
|
|
|
|
|
для: Vyacheslav Tsvetkov
(06.10.2012 в 16:50)
| | Достаточно
`var0` tinyint NOT NULL DEFAULT 1
и т.д.
все остальное лишнее | |
|
|
|
|
|
|
|
для: Sfinks
(06.10.2012 в 17:09)
| | Почему не так:
`var0` tinyint( '1' ) NOT NULL DEFAULT '1'
| Ведь я явно указываю сразу, даже при каких-то сбоях при обработке запросов на запись, в поле не запишется число больше 9 или меньше -9. | |
|
|
|
|
|
|
|
для: Vyacheslav Tsvetkov
(06.10.2012 в 20:31)
| | Кто вам сказал? Вот проверьте скрипт:
CREATE TABLE IF NOT EXISTS `attribute_value` (
`id` int(11) NOT NULL,
`id_attr` tinyint(1) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `attribute_value` (`id`, `id_attribute`, `id_value`) VALUES
(3, 3),
(13, 15);
| Все прекрасно запишется.
Длинна целочисленных типов задана самим типом. Для tinyint это от -128 до +127. И зачем еще указывается длинна в скобках, я, честно говоря, не знаю. | |
|
|
|
|
|
|
|
для: Sfinks
(07.10.2012 в 09:46)
| | Хорошо, спасибо. | |
|
|
|