|
|
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Akina mayton , давай посчитаем... Список на 10к товаров. У каждого товара есть несколько характеристик (если посмотреть на том же яндекс-маркете, то в среднем у категории товара их там 20-30, редко более полусотни). К тому же крайне редко попадается характеристика с очень уж обширным диапазоном значений, лично я не видал ни одной, в которой количество значений превосходило бы 64 (или хотя бы приближалось к нему). Но если брать по максимуму... пусть 20к товаров по 50 характеристик, кодирование которых требует 64 битов, это получится порядка сотни мегабайт. Не самый большой объём. А с учётом того, что таблица строго RO - грузим копию таблицы в память, и вот тебе уже минус дисковая подсистема и прирост скорости. Несколько дополнений. Действительно у товара обычно не более полусотни уникальных характеристик. Но ваше предположение о том что в целой категории товаров (телевизоры, холодильники) 50 характеристик - неверно. Технологии меняются каждые 2-3 года и новые характеристики добавляются к новым товарам (SmartTv=true), а старые постепенно уходят (VGA разъем=true). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 16:45 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Далее. Стопудово у тебя уже есть статистики. Нас интересуют две. Первая - это частота использования той или иной характеристики для фильтрации. Вторая - это селективность характеристики. Это я к чему? к тому, что индексировать по всем возможным совокупностям характеристик - занятие совершенно безнадёжное, но вот выделить основные группы, индексация которых даст значительный эффект (частая применимость и высокая селективность) нужно. Очень желательно, если данных хватит, выделить пары, а то и тройки, самых востребованных групп характеристик для составных индексов. Индекс из совокупности более чем 3 полей, мне кажется, будет маловостребован, и будет работать исключительно префиксом из 2-3 полей - а тогда нафига козе баян? Я согласен насчет селективности. Но такую характеристику как частота использования мы никак не можем детектировать. Собственно... это маркетинговая информация которая у нас появится уже в фазе эксплуатации магазина. Поэтому сейчас мы не можем ее использовать как 100% надежного актора. Хотя заложить в поисковой механизм популярные checkbox мы можем. Далее. Индекс из более чем 3х полей - важен и нужен. Это я вам говорю как регулярный клиент магазинов электроники. И поскольку мы не можем на данном этапе определить маркетинговые свойсвта (или преимущеста) одного атрибута над другим то я все-таки предлагаю индексировать все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 16:51 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
AkinaЧто имеем в итоге. Работа чисто в памяти, индексный отбор достаточно высокой селективности, и всё это на сравнительно небольшом объёме данных. Не думаю, что скорость работы будет такова, что у посетителей будут поводы для недовольства, даже если использовать "младшие" СУБД (во всяком случае MySQL из лампы должен летать, хотя я бы рекомендовал собирать систему самостоятельно, а не ставить готовый комплекс, начальная настройка делается один раз), просто сервер БД нужно будет настроить должным образом, чтобы он не испытывал проблем ни с памятью под Memory-таблицы, кэш индексов и буферы сортировки, ни с количетсвом процессорного времени. А если претензии по скорости будут - то это будут претензии не к СУБД, а к другим компонентам системы. Я не знаю - что значит собирать систему самостоятельно. Это - покупка VPS ? И установка вручную PHP, Apache, MySQL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 16:53 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
AkinaDima TХЗ за что его так не любят. План для простых запросов быстро строится.Планировщик - он один на инстанс сервера, и работает в одном потоке. При большом потоке запросов он запросто может стать узким местом. Мой пример 20011643 можно к параметризованному свести, в итоге будет не более сотни видов запросов типа такого Код: sql 1. 2. 3. 4. 5. 6. 7. т.е. при генерации запроса ставить сначала категории с одной галкой, затем с двумя и т.д. PS Сразу не сообразил что cat_id в запросе лишний и дублировать его не надо в таблицу Attribute. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:11 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
20011643 Если честно не вижу тормозов с классической реляционной структурой. ... А дальше выбираем таким запросом хорошая оптимизация. почти готовый продукшн ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:19 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TЕсли честно не вижу тормозов с классической реляционной структурой. Накидал по-быстрому ТаблицаОписаниеCategoryСправочник категорийValueЗначения внутри категорииTovarСправочник товаровAttributeПривязка товаров к значениям Для ускорения выборок небольшая денормализация: продублировал cat_id из Value в Attribute Хм... моя модель вышла более скромной. 3 таблицы. Где-то я просчитался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:21 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TА дальше выбираем таким запросом Код: sql 1. 2. 3. 4. 5. 6. 7. Не думаю что с твоими объемами будет дольше 10 мс выборка идти. Тем более что запрос отлично параллелится. Хм... из личного опыта. Запросы с group by ... having всегда работали тяжело и не в OLTP-стиле. По поводу параллелизма. Для обыкновенных DBMS он остаётся мифом. Практически очень мало запросов могут в explain plan выдать признаки параллелизма. Только Oracle при условии что таблицы были создани о опцией partitioning или с хинтом +parallel могут генерировать запуск map-reduce процессов для генерации выборки. Для других dbms - я не вкурсе но у меня есть предположения что параллелизм остаёся несбыточной мечтой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:27 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TПро размер: Предположим в среднем 50 атрибутов на товар, тогда по размеру Attribute получится примерно 500 000 записей, 16 байт на запись итого 8 Мб. Можно затестить, надо только генератор данных сделать Разрази меня гром. Я не понимаю как ты посчитал про 8 мегабайт. Здесь оценки можно уверенно дать только после моделирования. Опции хранения - это самая загадочная часть dbms и здесь я-бы не стал делать прогнозы. По поводу генерации данных. Это больной вопрос. Забегая вперед я даже скажу что он на 60%-80% определяет саму постановку. Тоесть эффективность решения нашей задачи не столько зависит от формул или технологий сколько от гистограммы наших данных и характера нагрузки. По сабжу я пока решил сделать так. Я нагуглил штук 10 магазинов стройматериалов и скачал их прайсы в виде xls, и думаю что если их обработать и загрузить то будет вполне себе нормальный набор для тестов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:32 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TДавай прикинем: допустим очень дотошный пользователь натыкает фильтр по 10 категориям, под одну 80% товаров, под другую 20% и т.д. Думаю в среднем 30-50% товаров на категорию, тогда 10*50%=500% товаров в конечной выборке, или 10000*500% = 50 000 записей. Как-то ни разу не дофига. В данной задаче я надеюсь что мы придем к мысли что нужен custom-алгоритм и структура данных для кеша характеристик товаров. Но перед тем как мы к этому придем нужно сначала взять MySQL/PG и выжать ее как лимон. Тоесть понять на какие цифры можно расчитывать. Для простоты будем считать что данные даже лежат в буферном кеше блоков. Тоесть даже дисковый IO мы уберем из нашей формулы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:36 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
maytonХм... моя модель вышла более скромной. 3 таблицы. Где-то я просчитался? Таблица PROD_ATTRS как понимаю у тебя не нормализована. Твой ATTR_NAME надо в отдельную таблицу ATTRIBUTES, а сюда ATTR_ID. Раз по ТЗ все галочками, то ATTR_VALUE вообще не надо. У тебя два значения TRUE/FALSE, TRUE есть запись в PROD_ATTRS, FALSE - нет записи. У меня Category это категории характеристик (Диагональ, Разрешение и т.д.) а у тебя как понимаю группа товаров (Телевизор, Холодильник и т.д.) это надо добавить для наполнения базы, но я это вообще не рассматривал, т.к. вопрос о поиске. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:42 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovЭто очень упрощает задачу. Главная таблица связи товаров с их характеристиками упрощается, поскольку значение характеристики представлено одним полем-ссылкой на справочник групп. Критерии в поисковом запросе сводятся к "Тип_характеристики=? and Группа_значения=?", что покрывается индексом. Отсутствие having в запросе позволяет нечёткий поиск по релевантности. Хм... мне не очень нравится постановка нечеткого поиска. Я как клиент интернет магазинов желаю точный поиск. К примеру я указал что я ищу зеркальный фотик где производитель никон и матрица в 24 мегапиксела и я хочу получить список именно из этих позиций товара без всяких посторонних похожих. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:43 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
MasterZivDima TMasterZiv, внимательнее на структуру посмотри, там все уже есть и дополнительно ничего не надо. Все решается тем запросом, который я написал. Запрос строится динамически. А, так это у тебя не классическая схема, а наоборот. Я прочитал "классическая", и дальше не глядел даже :-) Коллеги! Я предлагаю не спекулировать термином классического или не классического . Есть LAMP. И есть база с товарами. Надо извлекать товары как можно быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:46 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TAkinaпропущено... Планировщик - он один на инстанс сервера, и работает в одном потоке. При большом потоке запросов он запросто может стать узким местом. Можно конкретики: где именно он однопоточный? О каком сервере речь? Я честно сознаюсь что в эту тему никогда не вникал, но не вижу проблем сделать его многопоточным. Тут нет ничего требующего однопоточности. План строится на статистиках, а они не очень меняются, да даже если и меняются и план будет построен на предыдущей статистике, то это просто проблема одного конкретного запроса. Здесь я - пас. Я не знаю какие планировщики в LAMP. Если вы смоделируете узкое место в optimizer - буду рад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:49 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
AkinaDima Tв ТЗ было по другомуНу тогда берём любую СУБД с олапкой - самая для него задача. Хм... ну попробуйте найти такую любую. Насколько мне известно OLAP бывает разных под-типов. И тот который (R)OLAP (реляционный OLAP) по сути является программной надстройкой над обычной DBMS и я сильно сомневаюсь что эта надстройка будет эффективнее чем наш поиск по EAV. А коробочные решения OLAP - обычно дороги и требуют большой сноровки в изначальной конфигурации. Может кто-либо из вас похвастаться что он конфигурил OLAP-системы под ключ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:54 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
SashaMercuryПрошу прощения за оффтоп. Дмитрий, не первый раз встречаю что атрибуты отношений имеют префикс относящийся к имени отношения, но никогда не понимал зачем это. Когда я спрашивал, мне говорили о том, что ребятам элементарно join ить удобно, однако разве кто-то используется JOIN без псевдонимов. В том случае, если один из атрибутов отношения является foreign key то я согласен с тем, что желательно добавить префикс указывающий на имя таблицы, в противном случае, мне до сих пор не понятно, зачем это нужно, видимо в силу малого опыта в области баз данных. Объясни пожалуйста для большинство все так делают, ибо это вопрос уже несколько лет лежит у меня в голове фоном))) Надеюсь что это холивар, если так, то удаляйте сразу мое сообщение, а то основная тема загнется Это действительно холивар и оффтоп. И лучше эту тему поднять отдельным топиком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 18:58 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
maytonХм... из личного опыта. Запросы с group by ... having всегда работали тяжело и не в OLTP-стиле. Не уверен что так происходит, но тут после выборок подзапросов серверу можно снимать блокировки с рабочей таблицы, сливать результат union во временную таблицу и group by делать по ней. Про тяжесть уже писал, group by по 50к записей это не много. maytonПо поводу параллелизма. Для обыкновенных DBMS он остаётся мифом. Практически очень мало запросов могут в explain plan выдать признаки параллелизма. В данном случае имеем как раз то что параллелится, несколько подзапросов объединенных через union, каждый можно выполнять независимо от других. Это редкий случай когда есть что параллелить. Можно написать так чтобы не параллелилось Код: sql 1. 2. 3. group by тут не надо, в промежуточных таблицах много данных не возникнет, но это не параллелится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:01 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
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, и думаю что если их обработать и загрузить то будет вполне себе нормальный набор для тестов. Выделение характеристик и привязку к ним кто будет делать? Жопа в этом, написания в прайсах не нормализованы, я про ИИ потому и писал что сложная это работа выделять характеристики и привязывать к ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:14 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TНе уверен что так происходит, но тут после выборок подзапросов серверу можно снимать блокировки с рабочей таблицы, сливать результат union во временную таблицу и group by делать по ней. Про тяжесть уже писал, group by по 50к записей это не много. Ну... я еще раз акцентирую внимание на том что пользователь нашего API это праздный клиент. Который может рассеянно кликать-кликать на один и тот-же checkbox просто "по приколу". Таков он есть. А мы на каждый его клик будем создавать временную таблицу? По поводу 50k записей я погорячился. Может их будет даже меньше. Но в любом случае желательно убрать из стека такие операции как write temporary table при формировании курсора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:15 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TВсе просто: таблица Attribute это привязка товара к галочке. Т.е. чтобы товар "ТВ Gnusmas 40" FullHD" найти галочками, то надо этот товар привязать к двум Value, т.е. 39"-43" и FullHD. Это две записи в таблицу Attribute. Ты написал что товаров 10000, Akina 20009771 предположил что привязок не более 50 на товар, вот я и прикинул 50*10000. А ну ОК. Выделение характеристик и привязку к ним кто будет делать? Жопа в этом, написания в прайсах не нормализованы, я про ИИ потому и писал что сложная это работа выделять характеристики и привязывать к ним. Да это сложная работа. И я думаю она пойдет отдельным топиком. Подключу энтузиастов к парсингу. А кто распарсит быстрее всех - пополню телефончик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:18 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
maytonDimitry SibiryakovЭто очень упрощает задачу. Главная таблица связи товаров с их характеристиками упрощается, поскольку значение характеристики представлено одним полем-ссылкой на справочник групп. Критерии в поисковом запросе сводятся к "Тип_характеристики=? and Группа_значения=?", что покрывается индексом. Отсутствие having в запросе позволяет нечёткий поиск по релевантности. Хм... мне не очень нравится постановка нечеткого поиска. Я как клиент интернет магазинов желаю точный поиск. К примеру я указал что я ищу зеркальный фотик где производитель никон и матрица в 24 мегапиксела и я хочу получить список именно из этих позиций товара без всяких посторонних похожих. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Сибиряков прав: если сначала выдать то что совпадает по всем трем характеристикам (count(*) = 3), затем по двум, то никому хуже не будет. Покупатель в начале увидит то что просил, но дальше вполне может оказаться близкое, но то что не просил. Возможно оно больше его устроит по каким-то пятым свойствам не упомянутым в фильтре. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:23 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Dima TСибиряков прав: если сначала выдать то что совпадает по всем трем характеристикам (count(*) = 3), затем по двум, то никому хуже не будет. Покупатель в начале увидит то что просил, но дальше вполне может оказаться близкое, но то что не просил. Возможно оно больше его устроит по каким-то пятым свойствам не упомянутым в фильтре. Я приму это как доп-фичу. Но основной business-req. должен звучать именно как точный поиск по атрибутам товара. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:31 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
maytonDima TНе уверен что так происходит, но тут после выборок подзапросов серверу можно снимать блокировки с рабочей таблицы, сливать результат union во временную таблицу и group by делать по ней. Про тяжесть уже писал, group by по 50к записей это не много. Ну... я еще раз акцентирую внимание на том что пользователь нашего API это праздный клиент. Который может рассеянно кликать-кликать на один и тот-же checkbox просто "по приколу". Таков он есть. А мы на каждый его клик будем создавать временную таблицу? Я не про временную в терминологии БД, давай назовем ее промежуточной. Вобщем я о том что сервер сначала сделает Код: sql 1. 2. 3. сохранит результат куда-то во временную/промежуточную таблицу T, затем выполнит Код: sql 1. 2. 3. Результат вернет клиенту, а T удалит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:34 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
Вот модель, которую я накрапал в четверг. Она отражена в скриншоте с 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:35 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
maytonИндекс из более чем 3х полей - важен и нужен. Это я вам говорю как регулярный клиент магазинов электроники. И поскольку мы не можем на данном этапе определить маркетинговые свойсвта (или преимущеста) одного атрибута над другим то я все-таки предлагаю индексировать все.Это может быть важно со стороны клиента или там маркетолога. Который где-то в чём-то другом, конечно, умный, но вот в SQL он ноль без палочки. На предлагаемой системе индекс даже из трёх атрибутов будет крайней редкостью, в большинстве своём будут индексы из 2 атрибутов, и то далеко не все атрибуты охвачены. Диски имеют конечный объём, а количество индексов растёт факториально. Зачем создавать индекс, который будет использован 1 раз в месяц с вероятностью в 65%? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:38 |
|
||
|
Тяпничный поиск товаров по набору атрибутов
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2016, 19:51 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39369331&tid=1340536]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
57ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 361ms |

| 0 / 0 |
