- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Переиграть и победить: как анализировать конкурентов для продвижения сайта
С помощью Ahrefs
Александр Шестаков
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Для каждого объекта есть 50 характеристик, которые могут иметь значения 0, 1 и 2. Как правильнее слепить таблицу, если потом понадобится делать выборки типа «все объекты, у которых характеристика номер 23 и/или 28 и/или 45 и/или 48 равна 1» ?
Или делаем поля Id объекта, Id характеристики, Значение характеристики. Или делаем поля Id объекта плюс 50 полей характеристик, в которые вписываем значения. Сам думаю, первый вариант быстрее и удобнее (с нуля сделал бы так), но мне в наследство достался второй, оттого впал я в сомнения и спрашиваю здесь совета.
Для толкового выбора надо бы контекста добавить - что за объекты? что за характеристики? всегда ли объект обладает всеми 50-ю характеристиками? меняется ли число возможных характеристик? превалируют операции записи или чтения? и т.д.
Первый вариант - EAV (Entity Attribute Value) иногда относят к антипаттернам.. При выборе по N характеристикам придется N раз JOIN-ить с таблицей характеристик (длинная портянка).
Для второго варианта JOIN будет один. "Лишние" (неиспользуемые для конкретного элемента) характеристики места занимают не так уж много.. Если характеристики отличаются довольно сильно для различных типов объектов (у товаров/недвижимости итд) - возможно оправдано создание отдельной таблицы характеристик под каждый тип (см ссылку на презентацию выше)
В принципе, первый вариант можно дополнить (привести ко второму) созданием временной таблицы и при поиске по характеристикам JOIN-ить уже с ней.
что за объекты? что за характеристики?
Щас чего-нибудь выдумаю. Например, так: объекты — малярийные комары, характеристики — наличие их по регионам бывшего СССР.
всегда ли объект обладает всеми 50-ю характеристиками?
Да.
меняется ли число возможных характеристик?
Нет.
превалируют операции записи или чтения?
Сплошное чтение.
---------- Добавлено 27.06.2012 в 19:38 ----------
При выборе по N характеристикам придется N раз JOIN-ить с таблицей характеристик (длинная портянка).
Мне нужны выборки — только все объекты с указанными значениями характеристик ... Не вижу большого количества джойнов при этом...
"большое" у каждого своё.. А как смотрели? Если будет работающий пример запроса по 3-4-м характеристикам без увеличения количества JOIN-ов, видимо, вынужден буду согласиться =)
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 и т.д. А потом все то же.
Может, мы о разных вещах говорим. Или я вообще все по-колхозному леплю (сам не программер, вполне могу тупить).
Если всегда 50, то сделайте 50 столбов на каждый из них повести индексы и всё будет летать.
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 ----------
* однако, если число, тип, значения характеристик изначально неизвестно и может "плясать", то первый вариант может показаться менее трудоёмким для реализации..
Ок, будет второй вариант. Спасибо всем за комменты.
Первый вариант - меньше строчек, второй больше соответствует скромно описанной бизнеслогике, не побоюсь этого слова.
Выбирать Вам.
Хм. А с чего там меньше строчек, в первом-то?