Как правильно слепить таблицу характеристик в MySQL?

12
edogs software
На сайте с 15.12.2005
Offline
775
#11
LEOnidUKG:
Если всегда 50, то сделайте 50 столбов на каждый из них повести индексы и всё будет летать.

Если выборка по 20 разным свойствам, к примеру, то насчет летать это Вы немного погорячились - может и затупить, мускул не всегда осилит угадать нужную очередность, особенно если выборки по каждому конкретному свойству большие получаются.

Asar:
Для каждого объекта есть 50 характеристик, которые могут иметь значения 0, 1 и 2. Как правильнее слепить таблицу, если потом понадобится делать выборки типа «все объекты, у которых характеристика номер 23 и/или 28 и/или 45 и/или 48 равна 1» ?
Или делаем поля Id объекта, Id характеристики, Значение характеристики. Или делаем поля Id объекта плюс 50 полей характеристик, в которые вписываем значения. Сам думаю, первый вариант быстрее и удобнее (с нуля сделал бы так), но мне в наследство достался второй, оттого впал я в сомнения и спрашиваю здесь совета.

В поисковой таблице оставляете только ID и сами характеристики (никакого хлама типа доп.полей с описаниями, пытайтесь уменьшить размер таблицы, меньше объем - быстрее поиск).

Характеристики могут иметь 0,1,2 => стабильно занимают 2 бита, не фиг выделять по 1 столбцу для каждого значения, трамбуйте. Избыточно трамбовать смысла нет, поэтому за базу берите TINYINT - 1 байт, 8 бит. В каждый столбец влезет по 4 значения (при 2 битах на значение), таким образом хватит 13 столбцов под характеристики, а по размеру 50 столбцов даже tinyint это совсем другое чем 13 столбцов по объему таблицы (меньше объем - быстрее поиск).

Подумайте о том, как их сгруппировать, чем меньше столбцов задействовано в поиске - тем круче, неплохим вариантом будет сдублировать значения в доп. столбцы для более удобного/быстрого поиска (пусть даже увеличив их кол-во). Для ускорения поиска есть так же смысл использовать составные индексы (а не только обычные), myisam поддерживает до 16 столбцов в составном индексе - вполне вписываетесь. Но с индексами тут та проблема - как выделять отдельные свойства, так что использоваться они будут не всегда.

Кроме того, можете использовать set тип поля, опять же трамбуя в один сет - несколько хар-ик.

Если кол-во записей относительно небольшое, есть смысл подумать о memory типе таблице, при допустим 13 байтах под хар-ки и 4 байтах под ИД товара, это 17 байт на строку, что позволит запихнуть в 17 мегабайт - 1 миллион записей, а скорость поиска получится очень неплохой даже без индексов.

p.s.: Кстати, Asar, перед тем как думать о реализации EAV варианта ( хар-ка значение - отдельная таблица), подумайте как Вы собираетесь решать в нем выборки вида "комары породы БББ отсутствующие в регионах ЗЗЗ и ЙЙЙ, но присутствующие в ООО". Если выборки "присутствия" относительно легки в EAV, то вот выборки "отсутствия" в EAV уже достаточно тяжелы, при стандартной реализации.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
LEOnidUKG
На сайте с 25.11.2006
Offline
1762
#12
Если выборка по 20 разным свойствам, к примеру, то насчет летать это Вы немного погорячились - может и затупить, мускул не всегда осилит угадать нужную очередность, особенно если выборки по каждому конкретному свойству большие получаются.

Размер БД мы не знаем, а так же метод управления. В моём варианте можно будет легко редактировать через phpmyadmin.

Но так, конечно если там записей будет мульёны, то лучше вынести в отдельную таблицу, ну и всё что писали выше.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
Asar
На сайте с 23.08.2004
Offline
330
#13

edogs, спасибо за развернутый ответ. Понял, что можно сделать грамотнее, чем 50 столбцов, но это уже сильно выше моего теперешнего уровня. При этом записей всего порядка 20000 (не так уж и много у нас комаров-то), поэтому пашет покамест норм.

Насчет отсутствия и, в меньшей степени, варианта «и» сейчас сам уже загрузился, перевожу таблицу, которая была Id Характеристика Значение, тоже в море столбцов.

E
На сайте с 21.09.2009
Offline
283
#14

edogs, а как это трамбуйте? По задаче Пифагоровы штаны в любую сторону 50 значений. И мне виделось не TINYINT, а ENUM.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий