170 похожих чатов

Привет. Пишу магазин. Вопрос ) Может кто знает... Товар может принадлежать

нескольким категориям. Ну соответственно есть три таблицы: товары, категории, товары_категории (связь). Все бы хорошо, но у категорий есть иерархия. Например: Одежда > Верхняя одежда > Куртки
Если нам например товару надо присвоить категорию "Куртки". В связующей таблице создается запись id товара - id категории "куртки". Но...
Ясно что в категориях которые выше по иерархии товар отображаться не будет, если не будет соответствующей записи. Вроде можно напихать тыщу связей в эту таблицу и успокоиться, но смотрю что большинство cms известных так не делают. Вместо этого присваивается только одна связь, а те категории которые выше автоматом отображают товар тоже. Как? Ну я так понимаю рекурсивное построение дерева от категории, на которой находится пользователь. Т.е. если пользователь в категории одежда, то от одежды строится дерево, берутся все айдишки и по ним из связующей таблицы делается выборка товаров. Вроде тоже гуд, но блин это ж ресурс хавает значительно, тем более при каждой загрузке любой категории. Можно иерархию каждой категории конечно закэшить, но это тоже костыли какие то. Короче, кто посоветует, как тут лучше сделать? )) Ох я и письмо написал... 😁

8 ответов

21 просмотр

я обычно что-то типа такого делаю — https://pastebin.com/GBdj0J59 там все выборки по ПК идут, т.е. очень быстро. а с nested sets только лишние ненужные проблемы потом вылазят

Maxx
я обычно что-то типа такого делаю — https://pasteb...

А было дело с тем, что нужно было отображать кол-во товаров возле каждого фильтра до его применения? Как такое реализовать адекватно без кучи запросов в бд?

Syryan777-Сырьянов Автор вопроса
Vlad
А было дело с тем, что нужно было отображать кол-в...

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

Syryan777 Сырьянов
Я такое делал, но одним запросом и потом перебором...

Такое не подойдет, потому что кол-во должно зависит от фильтров, которые уже были выбраны в соседних блоках

У тебя база приляжет от такой логики - базовые фильтра строятся одним запросом с помощью агрегаций. Но использовать базу не лучшей вариант для расчета фильтров.

Syryan777-Сырьянов Автор вопроса
Roman
У тебя база приляжет от такой логики - базовые фил...

причем тут "база ляжет"? посмотри что я выше написал. один запрос и дальше перебор массива.

было конечно. EAV и фасетный поиск. делал в два запроса с одним фильтром: один с аггрегацией для счётчиков по оставшимся свойствам, другой — уже для вывода каталога. ты в GET запросе передаёшь что-то типа ?property[8]=32 — свойство 8, значение 32; пробегаешься по property и на каждое вызываешь скоуп у запроса по продуктам $query->joinFilterOption(8, 32), где добавляешь CROSS JOIN LATERAL () с фильтром по свойству (он должен вернуть 0 или 1 ряд(!!) в зависимости от наличия свойства у продукта. поля не важны). с несколькими "активированными" свойствами запрос получается экранов на 5, но т.к. все выборки идут по целочисленным ПК, выходит очень быстро. миллисекунд за 20-30 отрабатывает на сотнях продуктов и десятках свойств. на 100К+ продуктов скорее всего будет тормозить. ну да там уже в основном только денормализация и кэш спасают в большинстве случаев.

Maxx
было конечно. EAV и фасетный поиск. делал в два за...

А есть какие-то источники про это почитать? Ато я не могу нагуглить что-то нормальное

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Всем привет! Имеется функция: function IsValidChar(ch: UTF8Char): Boolean; var i: Integer; ValidChars: AnsiString; begin ValidChars := 'abcdefghijklmnopqrstuvwxyzABCDE...
Евгений
44
Карта сайта