Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Нужно выбрать лучший вариант для хранения данных
 
 автор: Vyacheslav Tsvetkov   (05.10.2012 в 14:33)   письмо автору
 
 

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

Есть четыре параметра, которые нужно хранить в таблице. Назовём их 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 в скрипте разделять.

  Ответить  
 
 автор: Sfinks   (05.10.2012 в 15:06)   письмо автору
 
   для: Vyacheslav Tsvetkov   (05.10.2012 в 14:33)
 

4 x TINYINT

P.S. Интересно, как вы собираетесь в INT(4) хранить (-1,-1,-1,-1) ?

  Ответить  
 
 автор: cheops   (05.10.2012 в 21:20)   письмо автору
 
   для: Sfinks   (05.10.2012 в 15:06)
 

>P.S. Интересно, как вы собираетесь в INT(4) хранить (-1,-1,-1,-1) ?
Это как раз не сложно, можно отвести по 8 бит на каждое из чисел, как раз получится четыре числа, только придется отсекать маской нужное число и осуществлять побитовый сдвиг... В базах данных большого объема таких выкрутасов, конечно, лучше избегать...

  Ответить  
 
 автор: Vyacheslav Tsvetkov   (06.10.2012 в 16:51)   письмо автору
 
   для: cheops   (05.10.2012 в 21:20)
 

То есть Вы считаете, что лучше (если без отрицательных значений) хранить всё же в одном поле, а потом разделять по explode ( '' , $var )?

  Ответить  
 
 автор: Sfinks   (06.10.2012 в 17:10)   письмо автору
 
   для: Vyacheslav Tsvetkov   (06.10.2012 в 16:51)
 

Не лучше. Размер что так что так 4 байта, а доступ и обработка (поиск, выборка, обновление) - пипец.

  Ответить  
 
 автор: Vyacheslav Tsvetkov   (06.10.2012 в 16:50)   письмо автору
 
   для: 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'
?

  Ответить  
 
 автор: Sfinks   (06.10.2012 в 17:09)   письмо автору
 
   для: Vyacheslav Tsvetkov   (06.10.2012 в 16:50)
 

Достаточно
`var0` tinyint NOT NULL DEFAULT 1
и т.д.
все остальное лишнее

  Ответить  
 
 автор: Vyacheslav Tsvetkov   (06.10.2012 в 20:31)   письмо автору
 
   для: Sfinks   (06.10.2012 в 17:09)
 

Почему не так:
`var0` tinyint( '1' ) NOT NULL DEFAULT '1'
Ведь я явно указываю сразу, даже при каких-то сбоях при обработке запросов на запись, в поле не запишется число больше 9 или меньше -9.

  Ответить  
 
 автор: Sfinks   (07.10.2012 в 09:46)   письмо автору
 
   для: 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. И зачем еще указывается длинна в скобках, я, честно говоря, не знаю.

  Ответить  
 
 автор: Vyacheslav Tsvetkov   (07.10.2012 в 13:02)   письмо автору
 
   для: Sfinks   (07.10.2012 в 09:46)
 

Хорошо, спасибо.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования