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

12
Asar
На сайте с 23.08.2004
Offline
334
1484

Для каждого объекта есть 50 характеристик, которые могут иметь значения 0, 1 и 2. Как правильнее слепить таблицу, если потом понадобится делать выборки типа «все объекты, у которых характеристика номер 23 и/или 28 и/или 45 и/или 48 равна 1» ?

Или делаем поля Id объекта, Id характеристики, Значение характеристики. Или делаем поля Id объекта плюс 50 полей характеристик, в которые вписываем значения. Сам думаю, первый вариант быстрее и удобнее (с нуля сделал бы так), но мне в наследство достался второй, оттого впал я в сомнения и спрашиваю здесь совета.

Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#1

Для толкового выбора надо бы контекста добавить - что за объекты? что за характеристики? всегда ли объект обладает всеми 50-ю характеристиками? меняется ли число возможных характеристик? превалируют операции записи или чтения? и т.д.

IL
На сайте с 20.04.2007
Offline
435
#2

Первый вариант - EAV (Entity Attribute Value) иногда относят к антипаттернам.. При выборе по N характеристикам придется N раз JOIN-ить с таблицей характеристик (длинная портянка).

Для второго варианта JOIN будет один. "Лишние" (неиспользуемые для конкретного элемента) характеристики места занимают не так уж много.. Если характеристики отличаются довольно сильно для различных типов объектов (у товаров/недвижимости итд) - возможно оправдано создание отдельной таблицы характеристик под каждый тип (см ссылку на презентацию выше)

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

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Asar
На сайте с 23.08.2004
Offline
334
#3
Алексей Барыкин:
что за объекты? что за характеристики?

Щас чего-нибудь выдумаю. Например, так: объекты — малярийные комары, характеристики — наличие их по регионам бывшего СССР.

Алексей Барыкин:
всегда ли объект обладает всеми 50-ю характеристиками?

Да.

Алексей Барыкин:
меняется ли число возможных характеристик?

Нет.

Алексей Барыкин:
превалируют операции записи или чтения?

Сплошное чтение.

---------- Добавлено 27.06.2012 в 19:38 ----------

ivan-lev:
При выборе по N характеристикам придется N раз JOIN-ить с таблицей характеристик (длинная портянка).
Мне нужны выборки — только все объекты с указанными значениями характеристик и все характеристики для отдельного объекта. Не вижу большого количества джойнов при этом...
IL
На сайте с 20.04.2007
Offline
435
#4
Asar:
Мне нужны выборки — только все объекты с указанными значениями характеристик ... Не вижу большого количества джойнов при этом...

"большое" у каждого своё.. А как смотрели? Если будет работающий пример запроса по 3-4-м характеристикам без увеличения количества JOIN-ов, видимо, вынужден буду согласиться =)

Asar
На сайте с 23.08.2004
Offline
334
#5

ivan-lev, делаю так:

SELECT DISTINCT Id FROM table WHERE ChrId = 1 AND ChrVal = 1 AND ChrId = 2 AND ChrVal = 1... и т.д. по необходимости. Пробегаюсь while+mysql_fetch_assoc, получаю список Id через запятую, использую его для второго запроса WHERE Id IN (, , , ,)

По второму варианту — SELECT Id FROM table WHERE `1` = 1 AND `2` = 1 и т.д. А потом все то же.

Может, мы о разных вещах говорим. Или я вообще все по-колхозному леплю (сам не программер, вполне могу тупить).

LEOnidUKG
На сайте с 25.11.2006
Offline
1776
#6

Если всегда 50, то сделайте 50 столбов на каждый из них повести индексы и всё будет летать.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
IL
На сайте с 20.04.2007
Offline
435
#7
Asar:
ivan-lev, делаю так:
SELECT DISTINCT Id FROM table WHERE ChrId = 1 AND ChrVal = 1 AND ChrId = 2

ChrId=1 AND ... AND ChrId=2

точно работает?

---------- Добавлено 27.06.2012 в 20:35 ----------

* по поводу разных вещей - я о том, чтоб всё получить одним запросом без лишних пробежек..

* теряются преимущества типа поля для ChrVal (скорость сравнения чисел или EVAL выше, чем строкотекстов)

* И бонусом - не только выборки делать, но и сортировать второй вариант удобнее =)

---------- Добавлено 27.06.2012 в 20:41 ----------

* однако, если число, тип, значения характеристик изначально неизвестно и может "плясать", то первый вариант может показаться менее трудоёмким для реализации..

Asar
На сайте с 23.08.2004
Offline
334
#8

Ок, будет второй вариант. Спасибо всем за комменты.

G
На сайте с 05.02.2012
Offline
73
#9

Первый вариант - меньше строчек, второй больше соответствует скромно описанной бизнеслогике, не побоюсь этого слова.

Выбирать Вам.

Карамба!
Asar
На сайте с 23.08.2004
Offline
334
#10

Хм. А с чего там меньше строчек, в первом-то?

12

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