powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный поиск товаров по набору атрибутов
61 сообщений из 61, показаны все 3 страниц
Тяпничный поиск товаров по набору атрибутов
    #39368242
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет коллеги.

Илья. Белая Сова. Дима-Т. Саша-Меркурий. Лётчик Петрав. Изопропил.
Petalvik. Softwarer. Володя двухтысячный. Сидоров. Блажкович. Док. Зяма. Жук-Ботан и прочие почитателю скруля.

Начинаем мозговой штурм. Мы оптимизируем поиск по EAV.

В продолжение моего занудства по поводу EAV-модели и поиска товаров. Дима уже вкурсе.
Для всех остальных - вводная:

Дано:

интернет магазин на базе классического стека LAMP (Здесь MySQL можно
заменить на произвольную реляционную DBMS не важно какую. Главное - реляционную).

Список товаров на более чем 10 000 позиций.

Товары побиты на категории (например Холодильники, Плазмы, Печи e.t.c)

Каждый товар обладает базовым набором характеристик таких как : код
товара, название, описание, цена предложения, остаток на складе.
(далее можно детализировать еще другие характеристики но в данном
обсуждении они не особо важны. Нас будет интересовать следующий пункт).


Каждый товар обладает расширенным набором характеристик которые
имеют достаточно вольную спецификацию. Например для Плазмы - это
диагональ экрана (''), поддержка FullHD, потребляемая мощность (Вт),
разрешение (два числа) и т.п. список атрибутов в виде строкового название
и значения произвольных типов. Количество расширенных характеристик
изначально неизвестно. Тоесть их может быть до нескольких десятков.

На уровне ТЗ предполагается что база использует модель EAV
как наиболее дешевый и доступный способ реализовать список расширенных
характеристик.

Интернет-магазин находится под постоянной нагрузкой. Поисковые
операции по товарам осуществляются каждую секунду.

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

Владелец магазина - борется за клиентов и желает создать
самые комфортные условия для быстрой работы.

UI магазина спроектирован таким образом что клиент
ничего не вводит с клавиатуры а только отмечает checkboxes.
Все вещественные характеристики товаров
перед поиском разбиты на группы. Например диагональ плазмы.
Пример:
Код: sql
1.
2.
3.
4.
5.
6.
Диагональ
[x] 39"-43"
[ ] 46"-50"

[x] FullHD
[x] HD Ready




Что-бы я здесь хотел обсудить. Возможные алгоритмы и структуры данных
которые помогут ускорить поиск по модели EAV.
Можно - доработки к PG и MySQL. Можно - различные варианты кешей.
Можно - использование С/C++ в стеке LAMP. Текстовый поиск,
деревья, JSON, и все что может быть полезно - приветствуется.
На консистентность кеша и БД можно пока забить. Скорость важнее.

Варианты покупки кластеров или облак мы здесь обсуждать не будем.
Это банально и не является темой для Программирования.

Мы будем обсуждать инженерный и творческий подход

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

Очень прошу вас не кидать в меня ссылками в Git или SVN, т.к. на анализ
и понимание готовых решений у меня уйдут месяцы и это никоим образом
не способствует топику и не гарантирует удачи. Если вы сами разработали
или участвовали в подобном - прошу вас кратко описать суть технологии.

Итак начинаем brainstorm!

С уважением
mayton

P.S. Поиск должен быть ультра-быстрым (с) :)
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368247
Фотография fixxer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулить по словам Faceted index/Faceted search. Вкратце - набор индексов по значениям категорий или отрезкам значений + оптимальное применение набора таких индексов. Умеет любой промышленный индекс сервер, бери любой на вкус, Solr, ElasticSearch, Sphinx, SearchTank.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368279
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton , давай посчитаем...

Список на 10к товаров. У каждого товара есть несколько характеристик (если посмотреть на том же яндекс-маркете, то в среднем у категории товара их там 20-30, редко более полусотни). К тому же крайне редко попадается характеристика с очень уж обширным диапазоном значений, лично я не видал ни одной, в которой количество значений превосходило бы 64 (или хотя бы приближалось к нему). Но если брать по максимуму... пусть 20к товаров по 50 характеристик, кодирование которых требует 64 битов, это получится порядка сотни мегабайт. Не самый большой объём. А с учётом того, что таблица строго RO - грузим копию таблицы в память, и вот тебе уже минус дисковая подсистема и прирост скорости.

Далее. Стопудово у тебя уже есть статистики. Нас интересуют две. Первая - это частота использования той или иной характеристики для фильтрации. Вторая - это селективность характеристики. Это я к чему? к тому, что индексировать по всем возможным совокупностям характеристик - занятие совершенно безнадёжное, но вот выделить основные группы, индексация которых даст значительный эффект (частая применимость и высокая селективность) нужно. Очень желательно, если данных хватит, выделить пары, а то и тройки, самых востребованных групп характеристик для составных индексов. Индекс из совокупности более чем 3 полей, мне кажется, будет маловостребован, и будет работать исключительно префиксом из 2-3 полей - а тогда нафига козе баян?

Что имеем в итоге. Работа чисто в памяти, индексный отбор достаточно высокой селективности, и всё это на сравнительно небольшом объёме данных. Не думаю, что скорость работы будет такова, что у посетителей будут поводы для недовольства, даже если использовать "младшие" СУБД (во всяком случае MySQL из лампы должен летать, хотя я бы рекомендовал собирать систему самостоятельно, а не ставить готовый комплекс, начальная настройка делается один раз), просто сервер БД нужно будет настроить должным образом, чтобы он не испытывал проблем ни с памятью под Memory-таблицы, кэш индексов и буферы сортировки, ни с количетсвом процессорного времени. А если претензии по скорости будут - то это будут претензии не к СУБД, а к другим компонентам системы.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368579
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerГулить по словам Faceted index/Faceted search. Вкратце - набор индексов по значениям категорий или отрезкам значений + оптимальное применение набора таких индексов. Умеет любой промышленный индекс сервер, бери любой на вкус, Solr, ElasticSearch, Sphinx, SearchTank.

Да, я например на Solr это щупал, отлично работает.
(правда, Solr-индексы , да и все из этого списка наверное, они off-line, но не важно).

В документации по Solr есть пример Web-APP где это просто тупо реализовано, можно изучать.

Фасетный поиск встроен в Solr и имеется в его API.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368590
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если честно не вижу тормозов с классической реляционной структурой.
Накидал по-быстрому

ТаблицаОписаниеCategoryСправочник категорийValueЗначения внутри категорииTovarСправочник товаровAttributeПривязка товаров к значениям
Для ускорения выборок небольшая денормализация: продублировал cat_id из Value в Attribute

А дальше выбираем таким запросом
Код: sql
1.
2.
3.
4.
5.
6.
7.
select tov_id from (
	select tov_id, cat_id from Attribute where val_id = 1
		union (select tov_id, cat_id from Attribute where val_id in (3, 5))
		union (select tov_id, cat_id from Attribute where val_id = 7)
	) T
	group by tov_id
	having count(*) = 3


Не думаю что с твоими объемами будет дольше 10 мс выборка идти. Тем более что запрос отлично параллелится.

Для ускорения выборки можно создать индекс (val_id, tov_id, cat_id) который полностью уберет обращения к таблице.

Про размер:
Предположим в среднем 50 атрибутов на товар, тогда по размеру Attribute получится примерно 500 000 записей, 16 байт на запись итого 8 Мб.

Можно затестить, надо только генератор данных сделать
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368621
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

С классической схемой проблема будет в том, что надо будет по всем полям таблицы товаров иметь возможность
делать быстрый поиск по любому поднабору атрибутов и быструю агрегацию (подсчёт кол-ва товаров) также по любому набору атрибутов.

Это возможно, но для этого нужно создавать очень много индексов, по всем сочетаниям атрибутов.
Очевидно, что чем больше атрибутов, то тем больше их сочетаний, и тем больше будет индексов.

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

Применение EAV позволит об этом вообще не думать, но зато придётся думать о другом. :-)
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368634
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, внимательнее на структуру посмотри, там все уже есть и дополнительно ничего не надо.
Все решается тем запросом, который я написал. Запрос строится динамически.

Там пример как-будто выбран фильтр по 3-м категориям:
КатегорияЗначения1123 537
для каждой категории отдельный подзапрос
Код: sql
1.
select tov_id, cat_id from Attribute where val_id in (список val_id фильтра данной категории)


и в конце отбор только товаров попавших во все категории
Код: sql
1.
	having count(*) = {количество категорий в фильтре}
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368647
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T , ты явно толкаешь ТС в направлении динамического sql... не самый лучший выбор. А уж группировка несортированной объединённой выборки - если получится дофига записей и она захочет материализоваться, ты состаришься ждать результата.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368667
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina Dima T , ты явно толкаешь ТС в направлении динамического sql... не самый лучший выбор.
ХЗ за что его так не любят. План для простых запросов быстро строится. Граблей с построением планов параметризованных запросов тоже полно.

AkinaА уж группировка несортированной объединённой выборки - если получится дофига записей и она захочет материализоваться, ты состаришься ждать результата.
Давай прикинем: допустим очень дотошный пользователь натыкает фильтр по 10 категориям, под одну 80% товаров, под другую 20% и т.д. Думаю в среднем 30-50% товаров на категорию, тогда 10*50%=500% товаров в конечной выборке, или 10000*500% = 50 000 записей. Как-то ни разу не дофига.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368706
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет коллеги.

Отвечу всем чуть позже когда доберусь до нормальной клавиатуры.

Всем спосибо за активность
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368715
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonUI магазина спроектирован таким образом что клиент
ничего не вводит с клавиатуры а только отмечает checkboxes.
Все вещественные характеристики товаров
перед поиском разбиты на группы.
Это очень упрощает задачу. Главная таблица связи товаров с их характеристиками упрощается, поскольку значение характеристики представлено одним полем-ссылкой на справочник групп. Критерии в поисковом запросе сводятся к "Тип_характеристики=? and Группа_значения=?", что покрывается индексом. Отсутствие having в запросе позволяет нечёткий поиск по релевантности.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368865
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZiv, внимательнее на структуру посмотри, там все уже есть и дополнительно ничего не надо.
Все решается тем запросом, который я написал. Запрос строится динамически.



А, так это у тебя не классическая схема, а наоборот.
Я прочитал "классическая", и дальше не глядел даже :-)
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368886
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivА, так это у тебя не классическая схема, а наоборот.
Я прочитал "классическая", и дальше не глядел даже :-)
Классическая в смысле что по всем правилам теории реляционных БД спроектировано. И без всякой экзотики типа JSON и т.д.

Я к тому что это лишнее:
maytonМожно - доработки к PG и MySQL. Можно - различные варианты кешей.
Можно - использование С/C++ в стеке LAMP. Текстовый поиск,
деревья, JSON, и все что может быть полезно - приветствуется.
На консистентность кеша и БД можно пока забить. Скорость важнее.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368967
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TХЗ за что его так не любят. План для простых запросов быстро строится.Планировщик - он один на инстанс сервера, и работает в одном потоке. При большом потоке запросов он запросто может стать узким местом.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368976
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaDima TХЗ за что его так не любят. План для простых запросов быстро строится.Планировщик - он один на инстанс сервера, и работает в одном потоке. При большом потоке запросов он запросто может стать узким местом.
Можно конкретики: где именно он однопоточный? О каком сервере речь? Я честно сознаюсь что в эту тему никогда не вникал, но не вижу проблем сделать его многопоточным. Тут нет ничего требующего однопоточности. План строится на статистиках, а они не очень меняются, да даже если и меняются и план будет построен на предыдущей статистике, то это просто проблема одного конкретного запроса.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39368993
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T , речь о MySQL-сервере (автор изначально обозначил, что платформа событий - лампа). У него работает ОДИН процесс парсера-оптимизатора-планировщика на инстанс. Сколько бы процессов не было, сколько бы процессоров не стояло в системе. By design. И если запросы "короткие", но их дохрена, то они тупо построятся в очередь, ожидая обработки - с кэшированием плана у MySQL негусто.
Насчёт проблем - боюсь, что проблем-таки есть у него. Не надо спрашивать, какие именно - не в курсе. Но вариантов масса. Начиная от того, что ядро изначально не предназначено, и кончая вульгарным "а кто это будет делать"... Оракл всё-таки не благотворительная организация.
Изменяется ли алгоритм работы планировщика, если набирается такая очередь, скажем, в сторону упрощения ценой ускорения построения плана, пусть даже неоптимального - я не знаю.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369001
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina , соглашусь что MySQL редкостная хрень, но популярная. 10 лет назад сравнивал его с MSSQL и был в шоке: одни и те же запросы на порядок тормознее. Переписывал запросы.
Сам с ним живу, твой аргумент еще один толчок уйти на что-то другое. Но пока он справляется с нагрузкой, потому дальше пользую.

Но в ТЗ было по другому
maytonЗдесь MySQL можно заменить на произвольную реляционную DBMS не важно какую. Главное - реляционную".
Сегодня есть куча предложений того же постгреса. Не хочешь MySQL - замени. Нет ведь речи о готовом работающем проекте, на котором возникнут проблемы "переезда"
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369026
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого тут текста. Ну ладно. Попробую ответить.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369039
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tв ТЗ было по другомуНу тогда берём любую СУБД с олапкой - самая для него задача.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369048
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вариант Дмитрия не устраивает, в таком случае я также склоняюсь к BI, реляционный OLAP
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369052
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения за оффтоп. Дмитрий, не первый раз встречаю что атрибуты отношений имеют префикс относящийся к имени отношения, но никогда не понимал зачем это. Когда я спрашивал, мне говорили о том, что ребятам элементарно join ить удобно, однако разве кто-то используется JOIN без псевдонимов. В том случае, если один из атрибутов отношения является foreign key то я согласен с тем, что желательно добавить префикс указывающий на имя таблицы, в противном случае, мне до сих пор не понятно, зачем это нужно, видимо в силу малого опыта в области баз данных. Объясни пожалуйста для большинство все так делают, ибо это вопрос уже несколько лет лежит у меня в голове фоном))) Надеюсь что это холивар, если так, то удаляйте сразу мое сообщение, а то основная тема загнется
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369053
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь что это НЕ холивар
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369180
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПрошу прощения за оффтоп. Дмитрий, не первый раз встречаю что атрибуты отношений имеют префикс относящийся к имени отношения, но никогда не понимал зачем это. Когда я спрашивал, мне говорили о том, что ребятам элементарно join ить удобно, однако разве кто-то используется JOIN без псевдонимов. В том случае, если один из атрибутов отношения является foreign key то я согласен с тем, что желательно добавить префикс указывающий на имя таблицы, в противном случае, мне до сих пор не понятно, зачем это нужно, видимо в силу малого опыта в области баз данных. Объясни пожалуйста для большинство все так делают, ибо это вопрос уже несколько лет лежит у меня в голове фоном))) Надеюсь что это холивар, если так, то удаляйте сразу мое сообщение, а то основная тема загнется
Не совсем понял о чем речь, если об использовании имени TOV_ID вместо ID для ключа таблицы, то тут на JOIN`е жизнь не заканчивается. Те же имена внешних ключей надо давать, если им каждый раз имя придумывать, то можно наплодить TOV_ID, TOVAR_ID и т.п., а так один раз назвал и тупо дублируешь название.
Потом когда на клиенте обрабатываешь результат запроса ты уже не видишь откуда данное поле взялось. Если поле называется ID или NAME то надо в запрос смотреть, а так сразу понятно что такое TOV_ID откуда бы оно не взялось.

В первых поделках у меня были имена ID, NAME и т.п. тоже не понимал нафига лишние буквы писать, потом когда размеры написанного выросли - понял что неудобно с такими именами работать.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369233
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TMasterZivА, так это у тебя не классическая схема, а наоборот.
Я прочитал "классическая", и дальше не глядел даже :-)
Классическая в смысле что по всем правилам теории реляционных БД спроектировано. И без всякой экзотики типа JSON и т.д.



Да, это лишнее, я согласен, но "классическая" -- это не EAV, а обычная горизонтальная таблица.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369288
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fixxerГулить по словам Faceted index/Faceted search. Вкратце - набор индексов по значениям категорий или отрезкам значений + оптимальное применение набора таких индексов. Умеет любой промышленный индекс сервер, бери любой на вкус, Solr, ElasticSearch, Sphinx, SearchTank.
Добрый день. Большое спасибо за терминологию. Ну... если фасетный - то пускай будет фасетный поиск.
Я не против.

По поводу промышленных индекс-серверов. Solr - это КМК платный продукт на базе технологий Apache Lucene
и возможно еще кое-чего. C Apache Lucene я работал. Это full-text search. Достаточно сложный и избыточный
механизм который созавался для various text и поиска релевантных документов в соответствии с Search Query.
Использовать в данной задаче FTS я считаю немного избыточным т.к. стек у настоящего FTS очень длинный
(есть фаза очистки оригинального текста и приведения его к каноническим формам) а у нас задача более
простая. Найти товар по набору признаков.

ElasticSearch - это ЕМНИП бесплатный вариант Solr (впрочем здесь я могу ошибаться пускай меня поправят).

С продуктами Shinx, SearchTank я не сталкивался и незняю что это такое. Опять-же опираясь на свой тезис
о простом стеке LAML я не хотел-бы переводить обсуждение этой задачи в обсуждение применения конкретного
коробочного продукта.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369291
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina mayton , давай посчитаем...

Список на 10к товаров. У каждого товара есть несколько характеристик (если посмотреть на том же яндекс-маркете, то в среднем у категории товара их там 20-30, редко более полусотни). К тому же крайне редко попадается характеристика с очень уж обширным диапазоном значений, лично я не видал ни одной, в которой количество значений превосходило бы 64 (или хотя бы приближалось к нему). Но если брать по максимуму... пусть 20к товаров по 50 характеристик, кодирование которых требует 64 битов, это получится порядка сотни мегабайт. Не самый большой объём. А с учётом того, что таблица строго RO - грузим копию таблицы в память, и вот тебе уже минус дисковая подсистема и прирост скорости.
Несколько дополнений. Действительно у товара обычно не более полусотни уникальных характеристик.
Но ваше предположение о том что в целой категории товаров (телевизоры, холодильники) 50 характеристик - неверно.
Технологии меняются каждые 2-3 года и новые характеристики добавляются к новым товарам (SmartTv=true),
а старые постепенно уходят (VGA разъем=true).
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369293
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Далее. Стопудово у тебя уже есть статистики. Нас интересуют две. Первая - это частота использования той или иной характеристики для фильтрации. Вторая - это селективность характеристики. Это я к чему? к тому, что индексировать по всем возможным совокупностям характеристик - занятие совершенно безнадёжное, но вот выделить основные группы, индексация которых даст значительный эффект (частая применимость и высокая селективность) нужно. Очень желательно, если данных хватит, выделить пары, а то и тройки, самых востребованных групп характеристик для составных индексов. Индекс из совокупности более чем 3 полей, мне кажется, будет маловостребован, и будет работать исключительно префиксом из 2-3 полей - а тогда нафига козе баян?
Я согласен насчет селективности. Но такую характеристику как частота использования мы никак не можем
детектировать. Собственно... это маркетинговая информация которая у нас появится уже в фазе эксплуатации
магазина. Поэтому сейчас мы не можем ее использовать как 100% надежного актора. Хотя заложить в поисковой
механизм популярные checkbox мы можем.

Далее. Индекс из более чем 3х полей - важен и нужен. Это я вам говорю как регулярный клиент магазинов электроники.
И поскольку мы не можем на данном этапе определить маркетинговые свойсвта (или преимущеста) одного атрибута
над другим то я все-таки предлагаю индексировать все.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369295
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaЧто имеем в итоге. Работа чисто в памяти, индексный отбор достаточно высокой селективности, и всё это на сравнительно небольшом объёме данных. Не думаю, что скорость работы будет такова, что у посетителей будут поводы для недовольства, даже если использовать "младшие" СУБД (во всяком случае MySQL из лампы должен летать, хотя я бы рекомендовал собирать систему самостоятельно, а не ставить готовый комплекс, начальная настройка делается один раз), просто сервер БД нужно будет настроить должным образом, чтобы он не испытывал проблем ни с памятью под Memory-таблицы, кэш индексов и буферы сортировки, ни с количетсвом процессорного времени. А если претензии по скорости будут - то это будут претензии не к СУБД, а к другим компонентам системы.

Я не знаю - что значит собирать систему самостоятельно. Это - покупка VPS ? И установка вручную PHP, Apache, MySQL?
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369315
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaDima TХЗ за что его так не любят. План для простых запросов быстро строится.Планировщик - он один на инстанс сервера, и работает в одном потоке. При большом потоке запросов он запросто может стать узким местом.
Мой пример 20011643 можно к параметризованному свести, в итоге будет не более сотни видов запросов типа такого
Код: sql
1.
2.
3.
4.
5.
6.
7.
select tov_id from (
	select distinct tov_id from Attribute where val_id = @p1
		union all (select distinct tov_id from Attribute where val_id in (@p2, @p3))
		union all (select distinct tov_id from Attribute where val_id in (@p4, @p5, @p6))
	) T
	group by tov_id
	having count(*) = 3


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

PS Сразу не сообразил что cat_id в запросе лишний и дублировать его не надо в таблицу Attribute.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369318
mini.weblab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
20011643
Если честно не вижу тормозов с классической реляционной структурой.
...
А дальше выбираем таким запросом

хорошая оптимизация. почти готовый продукшн
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369320
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЕсли честно не вижу тормозов с классической реляционной структурой.
Накидал по-быстрому

ТаблицаОписаниеCategoryСправочник категорийValueЗначения внутри категорииTovarСправочник товаровAttributeПривязка товаров к значениям
Для ускорения выборок небольшая денормализация: продублировал cat_id из Value в Attribute

Хм... моя модель вышла более скромной. 3 таблицы. Где-то я просчитался?
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369322
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TА дальше выбираем таким запросом
Код: sql
1.
2.
3.
4.
5.
6.
7.
select tov_id from (
	select tov_id, cat_id from Attribute where val_id = 1
		union (select tov_id, cat_id from Attribute where val_id in (3, 5))
		union (select tov_id, cat_id from Attribute where val_id = 7)
	) T
	group by tov_id
	having count(*) = 3


Не думаю что с твоими объемами будет дольше 10 мс выборка идти. Тем более что запрос отлично параллелится.

Хм... из личного опыта. Запросы с group by ... having всегда работали тяжело и не в OLTP-стиле.

По поводу параллелизма. Для обыкновенных DBMS он остаётся мифом. Практически очень мало
запросов могут в explain plan выдать признаки параллелизма. Только Oracle при условии что
таблицы были создани о опцией partitioning или с хинтом +parallel могут генерировать запуск
map-reduce процессов для генерации выборки. Для других dbms - я не вкурсе но у меня
есть предположения что параллелизм остаёся несбыточной мечтой.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369323
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПро размер:
Предположим в среднем 50 атрибутов на товар, тогда по размеру Attribute получится примерно 500 000 записей, 16 байт на запись итого 8 Мб.

Можно затестить, надо только генератор данных сделать
Разрази меня гром. Я не понимаю как ты посчитал про 8 мегабайт. Здесь оценки можно уверенно дать
только после моделирования. Опции хранения - это самая загадочная часть dbms и здесь я-бы не стал
делать прогнозы.

По поводу генерации данных. Это больной вопрос. Забегая вперед я даже скажу что он на 60%-80% определяет
саму постановку. Тоесть эффективность решения нашей задачи не столько зависит от формул или технологий
сколько от гистограммы наших данных и характера нагрузки.

По сабжу я пока решил сделать так. Я нагуглил штук 10 магазинов стройматериалов и скачал их прайсы в виде
xls, и думаю что если их обработать и загрузить то будет вполне себе нормальный набор для тестов.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369326
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TДавай прикинем: допустим очень дотошный пользователь натыкает фильтр по 10 категориям, под одну 80% товаров, под другую 20% и т.д. Думаю в среднем 30-50% товаров на категорию, тогда 10*50%=500% товаров в конечной выборке, или 10000*500% = 50 000 записей. Как-то ни разу не дофига.
В данной задаче я надеюсь что мы придем к мысли что нужен custom-алгоритм и структура данных для кеша
характеристик товаров. Но перед тем как мы к этому придем нужно сначала взять MySQL/PG и выжать ее как лимон.
Тоесть понять на какие цифры можно расчитывать. Для простоты будем считать что данные даже лежат в буферном
кеше блоков.

Тоесть даже дисковый IO мы уберем из нашей формулы.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369330
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХм... моя модель вышла более скромной. 3 таблицы. Где-то я просчитался?
Таблица PROD_ATTRS как понимаю у тебя не нормализована. Твой ATTR_NAME надо в отдельную таблицу ATTRIBUTES, а сюда ATTR_ID.
Раз по ТЗ все галочками, то ATTR_VALUE вообще не надо. У тебя два значения TRUE/FALSE, TRUE есть запись в PROD_ATTRS, FALSE - нет записи.

У меня Category это категории характеристик (Диагональ, Разрешение и т.д.) а у тебя как понимаю группа товаров (Телевизор, Холодильник и т.д.) это надо добавить для наполнения базы, но я это вообще не рассматривал, т.к. вопрос о поиске.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369331
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭто очень упрощает задачу. Главная таблица связи товаров с их характеристиками упрощается, поскольку значение характеристики представлено одним полем-ссылкой на справочник групп. Критерии в поисковом запросе сводятся к "Тип_характеристики=? and Группа_значения=?", что покрывается индексом. Отсутствие having в запросе позволяет нечёткий поиск по релевантности.
Хм... мне не очень нравится постановка нечеткого поиска. Я как клиент интернет магазинов
желаю точный поиск. К примеру я указал что я ищу зеркальный фотик где производитель никон
и матрица в 24 мегапиксела и я хочу получить список именно из этих позиций товара без всяких
посторонних похожих.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
[x] Nikon
[ ] Kodak

[ ] 16 Mpix
[ ] 20 Mpix
[x] 24 Mpix

[ ] SuperZoom
[x] Reflex
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369333
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivDima TMasterZiv, внимательнее на структуру посмотри, там все уже есть и дополнительно ничего не надо.
Все решается тем запросом, который я написал. Запрос строится динамически.



А, так это у тебя не классическая схема, а наоборот.
Я прочитал "классическая", и дальше не глядел даже :-)
Коллеги!

Я предлагаю не спекулировать термином классического или не классического .

Есть LAMP. И есть база с товарами. Надо извлекать товары как можно быстрее.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TAkinaпропущено...
Планировщик - он один на инстанс сервера, и работает в одном потоке. При большом потоке запросов он запросто может стать узким местом.
Можно конкретики: где именно он однопоточный? О каком сервере речь? Я честно сознаюсь что в эту тему никогда не вникал, но не вижу проблем сделать его многопоточным. Тут нет ничего требующего однопоточности. План строится на статистиках, а они не очень меняются, да даже если и меняются и план будет построен на предыдущей статистике, то это просто проблема одного конкретного запроса.
Здесь я - пас. Я не знаю какие планировщики в LAMP.

Если вы смоделируете узкое место в optimizer - буду рад.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369335
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AkinaDima Tв ТЗ было по другомуНу тогда берём любую СУБД с олапкой - самая для него задача.
Хм... ну попробуйте найти такую любую.

Насколько мне известно OLAP бывает разных под-типов. И тот который (R)OLAP (реляционный OLAP) по сути
является программной надстройкой над обычной DBMS и я сильно сомневаюсь что эта надстройка
будет эффективнее чем наш поиск по EAV.

А коробочные решения OLAP - обычно дороги и требуют большой сноровки в изначальной конфигурации.

Может кто-либо из вас похвастаться что он конфигурил OLAP-системы под ключ?
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369337
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПрошу прощения за оффтоп. Дмитрий, не первый раз встречаю что атрибуты отношений имеют префикс относящийся к имени отношения, но никогда не понимал зачем это. Когда я спрашивал, мне говорили о том, что ребятам элементарно join ить удобно, однако разве кто-то используется JOIN без псевдонимов. В том случае, если один из атрибутов отношения является foreign key то я согласен с тем, что желательно добавить префикс указывающий на имя таблицы, в противном случае, мне до сих пор не понятно, зачем это нужно, видимо в силу малого опыта в области баз данных. Объясни пожалуйста для большинство все так делают, ибо это вопрос уже несколько лет лежит у меня в голове фоном))) Надеюсь что это холивар, если так, то удаляйте сразу мое сообщение, а то основная тема загнется
Это действительно холивар и оффтоп. И лучше эту тему поднять отдельным топиком.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369339
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonХм... из личного опыта. Запросы с group by ... having всегда работали тяжело и не в OLTP-стиле.
Не уверен что так происходит, но тут после выборок подзапросов серверу можно снимать блокировки с рабочей таблицы, сливать результат union во временную таблицу и group by делать по ней. Про тяжесть уже писал, group by по 50к записей это не много.
maytonПо поводу параллелизма. Для обыкновенных DBMS он остаётся мифом. Практически очень мало
запросов могут в explain plan выдать признаки параллелизма.
В данном случае имеем как раз то что параллелится, несколько подзапросов объединенных через union, каждый можно выполнять независимо от других. Это редкий случай когда есть что параллелить.

Можно написать так чтобы не параллелилось
Код: sql
1.
2.
3.
select distinct tov_id from Attribute where val_id = @p1 
		and tov_id in ((select tov_id from Attribute where val_id in (@p2, @p3)
				and tov_id in (select tov_id from Attribute where val_id in (@p4, @p5, @p6)))


group by тут не надо, в промежуточных таблицах много данных не возникнет, но это не параллелится.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369350
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TПро размер:
Предположим в среднем 50 атрибутов на товар, тогда по размеру Attribute получится примерно 500 000 записей, 16 байт на запись итого 8 Мб.

Можно затестить, надо только генератор данных сделать
Разрази меня гром. Я не понимаю как ты посчитал про 8 мегабайт. Здесь оценки можно уверенно дать
только после моделирования. Опции хранения - это самая загадочная часть dbms и здесь я-бы не стал
делать прогнозы.
Все просто: таблица Attribute это привязка товара к галочке. Т.е. чтобы товар "ТВ Gnusmas 40" FullHD" найти галочками, то надо этот товар привязать к двум Value, т.е. 39"-43" и FullHD. Это две записи в таблицу Attribute.
Ты написал что товаров 10000, Akina 20009771 предположил что привязок не более 50 на товар, вот я и прикинул 50*10000.

maytonПо поводу генерации данных. Это больной вопрос. Забегая вперед я даже скажу что он на 60%-80% определяет
саму постановку. Тоесть эффективность решения нашей задачи не столько зависит от формул или технологий
сколько от гистограммы наших данных и характера нагрузки.

По сабжу я пока решил сделать так. Я нагуглил штук 10 магазинов стройматериалов и скачал их прайсы в виде
xls, и думаю что если их обработать и загрузить то будет вполне себе нормальный набор для тестов.
Выделение характеристик и привязку к ним кто будет делать? Жопа в этом, написания в прайсах не нормализованы, я про ИИ потому и писал что сложная это работа выделять характеристики и привязывать к ним.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369351
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНе уверен что так происходит, но тут после выборок подзапросов серверу можно снимать блокировки с рабочей таблицы, сливать результат union во временную таблицу и group by делать по ней. Про тяжесть уже писал, group by по 50к записей это не много.

Ну... я еще раз акцентирую внимание на том что пользователь нашего API это праздный клиент.
Который может рассеянно кликать-кликать на один и тот-же checkbox просто "по приколу".
Таков он есть. А мы на каждый его клик будем создавать временную таблицу?

По поводу 50k записей я погорячился. Может их будет даже меньше. Но в любом случае
желательно убрать из стека такие операции как write temporary table при формировании
курсора.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369352
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВсе просто: таблица Attribute это привязка товара к галочке. Т.е. чтобы товар "ТВ Gnusmas 40" FullHD" найти галочками, то надо этот товар привязать к двум Value, т.е. 39"-43" и FullHD. Это две записи в таблицу Attribute.
Ты написал что товаров 10000, Akina 20009771 предположил что привязок не более 50 на товар, вот я и прикинул 50*10000.

А ну ОК.

Выделение характеристик и привязку к ним кто будет делать? Жопа в этом, написания в прайсах не нормализованы, я про ИИ потому и писал что сложная это работа выделять характеристики и привязывать к ним.
Да это сложная работа. И я думаю она пойдет отдельным топиком. Подключу энтузиастов к парсингу.
А кто распарсит быстрее всех - пополню телефончик.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369355
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDimitry SibiryakovЭто очень упрощает задачу. Главная таблица связи товаров с их характеристиками упрощается, поскольку значение характеристики представлено одним полем-ссылкой на справочник групп. Критерии в поисковом запросе сводятся к "Тип_характеристики=? and Группа_значения=?", что покрывается индексом. Отсутствие having в запросе позволяет нечёткий поиск по релевантности.
Хм... мне не очень нравится постановка нечеткого поиска. Я как клиент интернет магазинов
желаю точный поиск. К примеру я указал что я ищу зеркальный фотик где производитель никон
и матрица в 24 мегапиксела и я хочу получить список именно из этих позиций товара без всяких
посторонних похожих.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
[x] Nikon
[ ] Kodak

[ ] 16 Mpix
[ ] 20 Mpix
[x] 24 Mpix

[ ] SuperZoom
[x] Reflex


Сибиряков прав: если сначала выдать то что совпадает по всем трем характеристикам (count(*) = 3), затем по двум, то никому хуже не будет. Покупатель в начале увидит то что просил, но дальше вполне может оказаться близкое, но то что не просил. Возможно оно больше его устроит по каким-то пятым свойствам не упомянутым в фильтре.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369358
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TСибиряков прав: если сначала выдать то что совпадает по всем трем характеристикам (count(*) = 3), затем по двум, то никому хуже не будет. Покупатель в начале увидит то что просил, но дальше вполне может оказаться близкое, но то что не просил. Возможно оно больше его устроит по каким-то пятым свойствам не упомянутым в фильтре.
Я приму это как доп-фичу. Но основной business-req. должен звучать именно как точный поиск по
атрибутам товара.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369359
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TНе уверен что так происходит, но тут после выборок подзапросов серверу можно снимать блокировки с рабочей таблицы, сливать результат union во временную таблицу и group by делать по ней. Про тяжесть уже писал, group by по 50к записей это не много.

Ну... я еще раз акцентирую внимание на том что пользователь нашего API это праздный клиент.
Который может рассеянно кликать-кликать на один и тот-же checkbox просто "по приколу".
Таков он есть. А мы на каждый его клик будем создавать временную таблицу?
Я не про временную в терминологии БД, давай назовем ее промежуточной.

Вобщем я о том что сервер сначала сделает
Код: sql
1.
2.
3.
	select distinct tov_id from Attribute where val_id = @p1
		union all (select distinct tov_id from Attribute where val_id in (@p2, @p3))
		union all (select distinct tov_id from Attribute where val_id in (@p4, @p5, @p6))


сохранит результат куда-то во временную/промежуточную таблицу T, затем выполнит
Код: sql
1.
2.
3.
select tov_id from  T
	group by tov_id
	having count(*) = 3


Результат вернет клиенту, а T удалит.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369362
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот модель, которую я накрапал в четверг. Она отражена в скриншоте с Modeller.

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

Вобщем хотелось бы прояснить почему у нас число таблиц разное.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
DROP TABLE PROD_ATTRS;
DROP TABLE PRODUCTS;
DROP TABLE PRODUCT_CATEGORIES;

DROP SEQUENCE PRODUCT_CATEGORIES_SEQ;

CREATE SEQUENCE PRODUCT_CATEGORIES_SEQ;

CREATE TABLE PRODUCT_CATEGORIES(
 CAT_ID        NUMBER PRIMARY KEY,
 CAT_NAME      VARCHAR2(255) UNIQUE NOT NULL,
 PARENT_CAT_ID NUMBER
);

DROP SEQUENCE PRODUCTS_SEQ;

CREATE SEQUENCE PRODUCTS_SEQ;

CREATE TABLE PRODUCTS(
 PROD_ID       NUMBER PRIMARY KEY,
 CAT_ID        NUMBER NOT NULL,
 PROD_CODE     VARCHAR2(60) UNIQUE NOT NULL,
 NAME          VARCHAR2(255) UNIQUE NOT NULL,
 DESCRIPTION   VARCHAR2(4000),
 PRICE         NUMBER NOT NULL,
 WEIGHT        NUMBER(5,2) CHECK (WEIGHT >= 0),
 STOCK_REMAINS NUMBER DEFAULT 0
);

ALTER TABLE PRODUCTS ADD CONSTRAINT PRODUCTS_FK FOREIGN KEY(CAT_ID) REFERENCES PRODUCT_CATEGORIES(CAT_ID);

CREATE TABLE PROD_ATTRS(
 PROD_ID       NUMBER,
 ATTR_NAME     VARCHAR2(255) NOT NULL,
 ATTR_VALUE    VARCHAR2(255)
);

CREATE UNIQUE INDEX PROD_ATTRS_PK ON PROD_ATTRS(PROD_ID,ATTR_NAME) COMPRESS 1;

ALTER TABLE PROD_ATTRS ADD PRIMARY KEY(PROD_ID,ATTR_NAME) USING INDEX;

ALTER TABLE PROD_ATTRS ADD CONSTRAINT PROD_ATTRS_FK FOREIGN KEY(PROD_ID) REFERENCES PRODUCTS(PROD_ID);

...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369363
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИндекс из более чем 3х полей - важен и нужен. Это я вам говорю как регулярный клиент магазинов электроники. И поскольку мы не можем на данном этапе определить маркетинговые свойсвта (или преимущеста) одного атрибута над другим то я все-таки предлагаю индексировать все.Это может быть важно со стороны клиента или там маркетолога. Который где-то в чём-то другом, конечно, умный, но вот в SQL он ноль без палочки. На предлагаемой системе индекс даже из трёх атрибутов будет крайней редкостью, в большинстве своём будут индексы из 2 атрибутов, и то далеко не все атрибуты охвачены. Диски имеют конечный объём, а количество индексов растёт факториально. Зачем создавать индекс, который будет использован 1 раз в месяц с вероятностью в 65%?
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369372
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДима. К тебе просьба оценить разницу между твоей и моей моделью. Может я чего-то недосказал
или наоборот ты глубже сделал нормализацию.
Это та же картинка только текстом. Картинкой понятней. Хоть чуть-чуть поясни какая таблица что содержит. Я тут 20016306 уже пытался гадать что к чему, пока добавить нечего.

Давай конкретный пример рассмотрим:
Товар "ТВ Gnusmas 40" FullHD" надо привязать к галочкам 39"-43" и FullHD

Как это сохранится в твоей БД?

У меня будет так:

Tovar
tov_idtov_name1ТВ Gnusmas 40" FullHD
Category
cat_idcat_name2Диагональ3Разрешение
Value
val_idcat_idval_name4239"-43"53FullHD
Attribute
tov_idval_id1415
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369374
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл группировку товаров, то что он в группе товаров Телевизоры\Телевизоры ЖК

Tovar
tov_idtov_name1ТВ Gnusmas 40" FullHD
Category
cat_idcat_name2Диагональ3Разрешение6Телевизор7Телевизор ЖК
Value
val_idcat_idval_name4239"-43"53FullHD86Телевизор97Телевизор ЖК
Attribute
tov_idval_id14151819
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39369382
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще подумал, удобнее для выборок так хранить

Tovar
tov_idtov_name1ТВ Gnusmas 40" FullHD
Category
cat_idcat_name2Диагональ3Разрешение6 Группа товаров
Value
val_idcat_idval_name4239"-43"53FullHD86Телевизор96Телевизор ЖК
Attribute
tov_idval_id14151819[/quot]
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39370620
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм.. я немного не так использовал Category.

Чуть позже отпишу.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374210
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Здарова други. Я немного был занят на неделе и задачей не занимался.

По сабжу я не отказываюсь от своих ресёрчей но пока беру паузу.
Ничего пока не готово.

Забегая вперед я хочу сказать что я планировал используя биткарты или хеши
превнести некий дополнительный атрибут в таблицу tovar но при этом дать
положительную (иногда ложно-положительную) вероятность для срабатывания
поискового предиката

Код: sql
1.
WHERE tovar_attributes CONTAINS('Диагональ=39..43 AND ....')


Ложные срабатывания предиката - отсекаются на 2-й фазе фильтрации через
EAV, но я надеюсь что это будет менее чем 3% от общего объема выборки
что само по себе очень круто.

Здесь я могу пойти по ложному пути Паниковского создания движка
для Full Text Search но нет (!) я этого не хочу. FTS слишком крут и избыточен.
Мне хватит и списка атрибутов.

2) Против Диминой модели я не имею ничего против просто у меня таблица категорий
это были категории товаров а не атрибутов.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374295
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЗабегая вперед я хочу сказать что я планировал используя биткарты или хеши
превнести некий дополнительный атрибут в таблицу tovar но при этом дать
положительную (иногда ложно-положительную) вероятность для срабатывания
поискового предиката

Код: sql
1.
WHERE tovar_attributes CONTAINS('Диагональ=39..43 AND ....')


Не понимаю где ты эти биткарты обрабатывать собрался? На стороне SQL-сервера нет встроенных средств для этого. Тащить их сначала на клиента, как-то алгоритмически обрабатывать, получать набор TOV_ID и дозапрашивать с фильтром по нему тоже сомнительный алгоритм.

Я про биткарты думал. Полностью занести все характеристики товара в биткарту можно и она будет небольшая по размеру.
Можно сформировать биткарту фильтра и сравнить ее со всеми биткартами товаров, тоже не сложно.

Но на двойном выборе начнутся проблемы:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
Диагональ
[ ] 10-19"
[x] 20-29"
[x] 30-39"

Разрешение
[ ] HD Ready
[x] Full HD


т.е.
Код: sql
1.
WHERE tovar_attributes CONTAINS('(Диагональ=20-29 OR Диагональ=30-39) AND ....')


Тут надо уже две биткарты фильтра. При совпадении с любой товар считается подходящим.
И чем больше групп с несколькими галками, тем больше карт-фильтров, причем прогрессия геометрическая.
Например 3 категории по 2,3,3 галки дадут 2*3*3 = 18 карт-фильтров.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374448
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дима.

Я-же писал в введении.
Что-бы я здесь хотел обсудить. Возможные алгоритмы и структуры данных
которые помогут ускорить поиск по модели EAV.
Можно - доработки к PG и MySQL. Можно - различные варианты кешей.
Можно - использование С/C++ в стеке LAMP. Текстовый поиск,
деревья, JSON, и все что может быть полезно - приветствуется.
На консистентность кеша и БД можно пока забить. Скорость важнее.

Далее. Про геометрическую прогрессию я ничо не понял. В моём понимании - фасетный
поиск - это просто игра с предикатами. Чем больше юзер накликал - тем больше предикатов
в списке. Там нет места геом-прогрессии или я по другому понимаю саму предметную область.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374478
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДалее. Про геометрическую прогрессию я ничо не понял.
Думал про биткарты для усовершенствования моей реализации. Она отлично ложится в биткарту, а дальше начинаются описанные проблемы. Хотел выше предложить экзотическое решение на биткартах, потом понял что сложная хрень получится и скорее всего не быстрая.

Идея была такая: каждый бит в карте соответствует характеристике
ХарактеристикаЗначениеДиагональ 10-19"00000001Диагональ 20-29"00000010Диагональ 30-39"00000100Разрешение HD Ready00001000Разрешение Full HD00010000
Каждый товар имеет свою биткарту характеристик
ТоварБиткартаТВ100001001ТВ200001010
Затем по фильтру делается биткарта и сравнивается
Код: plaintext
1.
if(Биткарта товара & Фильтр == Фильтр) товар подходит


но тут возникает проблема с двойным выбором: если пользователь выбрал например как я написал 20044056 то надо сравнивать уже с двумя фильтрами 00001010 и 00001100
Код: plaintext
1.
if(Биткарта товара & 00001010 == 00001010 || Биткарта товара & 00001100 == 00001100) товар подходит


И количество фильтров это произведение количества галок в каждой категории характеристик. В этом примере 1*2 = 2. Т.е. геометрическая прогрессия.

Если ты как-то по другому биткарты хочешь задействовать или фильтр блума, то раскрывай свою мысль.

PS В реализацию фасетного поиска не вникал.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374488
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё Дима. Я понял свою ошибку. Что-то в исходной постановке неверно. По крайней мере неверно
моё упрощение.

Почитал кое что из публичных материалов (презентаций).

http://flamenco.berkeley.edu/talks/chi_course06_4_23.ppt

Фасет это нечно более сложное и это не тег и не категория. По крайней мере надо еще
это обдумать.

Вобщем беру паузу.
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374560
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. В шахматы играешь?
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374617
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Тяпничный поиск товаров по набору атрибутов
    #39374620
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgm, я вспомнил эту статью. Я еще когда-то читал. Про Редиску. Но спасибо за напоминалку.
...
Рейтинг: 0 / 0
61 сообщений из 61, показаны все 3 страниц
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Тяпничный поиск товаров по набору атрибутов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]