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

Оцените плиз схему для учебного проекта интернет-магазина. Меня интересует насколько

эта схема будет эффективна для реализации фильтрации товаров по множеству параметров ?

У каждой Категории есть набор специфичных Атрибутов. У каждого Атрибута есть набор Опций.
Каждый Продукт имеет Параметры с конкретными Опциями.

76 ответов

136 просмотров

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

Feanorx
Почему?

что именно "почему"?

Alexey Ermakov
что именно "почему"?

Почему для таких вещей не подходит и почему не самое эффективное решение

Feanorx
Почему для таких вещей не подходит и почему не сам...

не "не подходит", а "есть варианты удобнее" любая nosql (монга какая-нибудь, например) будет в 100500 раз удобнее, а разницу в производительности подъедят пачки джоинов в слоне

Alexey Ermakov
не "не подходит", а "есть варианты удобнее" любая...

Да фиг его знает. Джоины весьма быстрые в современных базах.

Серёжа- Автор вопроса
Alexey Ermakov
не "не подходит", а "есть варианты удобнее" любая...

А два джойна это много ? Товары + параметры + опции И через where будет сопоставляться.

Feanorx
Да фиг его знает. Джоины весьма быстрые в современ...

Быстрые-то оно да, но до момента, когда пара тройка ооочень жирных таблиц джоинится

Alexey Ermakov
Быстрые-то оно да, но до момента, когда пара тройк...

Вообще по барабану насколько они жирные пока все индексы стоят.

Alex Konstantinov
А монга чем удобнее?

Любой товар в любом виде описываешь в документе с нужными параметрами

Feanorx
Вообще по барабану насколько они жирные пока все и...

Ага. Видел. Понавешают индексов - "а чо инсерты такие медленные"

Серёжа- Автор вопроса

Проблема в том, что мне не удалось нагуглить как вообще такое реализуется в известных магазинах. Не знаю почему это такая тайна. Приходится придумывать самому, но потом оказалось, что это уже кто-то придумал и назвал EAV model ) но и это решение неоднозначное и готовых полноценных примеров всё равно почти нет )

отсутствием строгой структуры данных

Alexey Ermakov
отсутствием строгой структуры данных

А в чем плюс отсутствия структуры данных? Я просто думал, что это плюс.

Насколько часто у вас меняются опции?

Alexey Ermakov
Ага. Видел. Понавешают индексов - "а чо инсерты та...

Смешно. На ключах индексы всегда должны быть, а что там навешивают не знаю.

Серёжа
Проблема в том, что мне не удалось нагуглить как в...

в больших (я.маркет, вайлдберрис, озон, ...) часто за товарами не ходят прямо в базу - там флотилия индексирующего софта с поиском (sphinx, например или похожее)

Серёжа- Автор вопроса
Alex Konstantinov
Насколько часто у вас меняются опции?

А что их менять ? Как их вбили так они и остались. Ну вот предположим в категория "Телефоны" есть атрибут "оперативная память", который имеет опции от 2гб до 12гб. Конкретному продукту присвоена одна конкретная опция.

Feanorx
Смешно. На ключах индексы всегда должны быть, а чт...

Ну и сколько это джоинов должно быть, если на каждую опцию - новую таблицу с ключом? Или alter-ить до бесконечности для каждого параметра?

Серёжа
А что их менять ? Как их вбили так они и остались...

Выйдет телефон с каким-нибудь 5-d лидаром и сканером отпечатка жопы. Как и куда добавить фильтр/поиск?

Серёжа- Автор вопроса
Alexey Ermakov
Выйдет телефон с каким-нибудь 5-d лидаром и сканер...

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

Feanorx
JSONB?

зачем брать пг для того, чтобы всё в jsonb пихать?

Серёжа
На клиенте будет админ панель, можно будет добавит...

я имею в виду с точки зрения базы данных тебе нужно будет создать 2 новых колонки для лидара и сканера жопы и так для каждой опции =)

Серёжа
На клиенте будет админ панель, можно будет добавит...

Есть ощущение, что у вас две лишние таблички, prop_property и property, вам в табличке products добавить ссылку на ид таблички attr_optiona. В целом даже можно убрать поле category_id, но без этого производительность запроса отображения товаров по категориям упадет.

Серёжа- Автор вопроса
Alexey Ermakov
я имею в виду с точки зрения базы данных тебе нужн...

Нет. Будет просто новая запись в таблице attributes value = "сканер жопы" И в таблице options для его будет две записи value="есть" и value="нет" 🤷‍♂🤣

Alex Konstantinov
А в чем плюс отсутствия структуры данных? Я просто...

Ну, это ведь от данных зависит. Никто же не будет вместо datalake брать sql. Так же и для nosql есть места, где они удобнее. Как и клик для аналитики лучше, чем influx =))

С 2015 года еще ниразу не видел полезного использования монги. Кроме кейса, надо запилить мвп за месяц, потом пофигу что будет, но даже там лучше просто в json файлы складывать))))

И для каждой категории своя таблица с атрибутами или одна таблица для овощей и автомобилей?)

Alexey Ermakov
И для каждой категории своя таблица с атрибутами и...

Такое чувство, что работу в монги представляют как "просто пихаем куда угодно какие угодно объекты". Как потом с этим приложение будет работать, понимая, где и какие значения могут быть? В случае товаров, например, нам надо не только свойства товара вывести, но ещё и знать в этой категории товаров какие могут быть свойства для фильтрации. Всё равно модель будет описана так или иначе. Аналогично на SQL это не обязательно будет в виде кучи join-ов, можно отдельно вытасикать нормальзованные данные

Grigorii K. Shartsev
Такое чувство, что работу в монги представляют как...

Для учебного проекта интернет-магазина хватит "базы" в xml документе. nosql (пусть будет scylla, чтобы от монги отстали) в виде "пихаем что угодно" и просто ищем что нужно - enough

Grigorii K. Shartsev
Не понял, как это отвечает на вопрос

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

Alexey Ermakov
Как потом с этим приложение будет работать, понима...

На уровне приложения приходится поддерживать структуру?

Alexey Ermakov
я имею в виду с точки зрения базы данных тебе нужн...

Что тебя так эта тема со сканером то зацепила?

Для каких сайтов он годный? Я думаю, что для соц сетей, мессенджеров. Если данные слабоструктурированы. А тут создать реляционную бд и норм будет) p.s. @thephoenixofthevoid, хорошо шаришь в jsonb?)

꧁༺ ♕︎ V ♕︎ ༻꧂
Для каких сайтов он годный? Я думаю, что для соц с...

Пользуюсь, проблем не испытываю. Что значит "шарить хорошо" не знаю, потому что в каждом релизе слоника его поддержку улучшают.

Серёжа- Автор вопроса
Alexey Ermakov
Как потом с этим приложение будет работать, понима...

Ну я вот представляю это что юзер выбирает категорию, ему с сервера подтягиваются атрибуты связанные с этой категорией и их возможные опции, тыкая по которым, юзер формирует query string, которая будет уходить на сервер, брать из базы массив продуктов с выбраными опциями. 🤷‍♂

Серёжа
Ну я вот представляю это что юзер выбирает категор...

Это вариант со схемой (о чем выше Григорий спрашивал). Есть schemaless подходы (обычно в контексте сериализации), когда вместе с данными ещё и метаданные есть. Схемалесс обычно медленней, но проще и более гибкое решение в плане экспериментов.

Серёжа
Ну я вот представляю это что юзер выбирает категор...

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

Серёжа- Автор вопроса

Нет цель сделать полноценный fullstack проект, чтобы хвастаться на собеседовании на фронтенд ибо todo list никого не удивит ахах )

Серёжа
Нет цель сделать полноценный fullstack проект, что...

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

Серёжа
Нет цель сделать полноценный fullstack проект, что...

Для фронтеднера товары хранить нужно в localStorage =)

Серёжа
Нет цель сделать полноценный fullstack проект, что...

Это так не сработает если ты на фронта метишь, то разработка бека тебе никак не поможет Даже повредит, так как вместо того что бы проблематику фронта изучать ты время на никому не нужный бек потратишь если сильно бек нужен, то просто сделай моковый слой АПИ у тебя все равно ДЕМО проект будет простую логику содержать

Серёжа- Автор вопроса
Rain
Это так не сработает если ты на фронта метишь, то ...

Увы с моками я не смогу фильтровать товары по множеству параметров, делать jwt авторизацию и тд

Серёжа
Увы с моками я не смогу фильтровать товары по множ...

ты с моками можешь сделать абсолютно все, кроме мультипользовательского режима

Серёжа- Автор вопроса
Rain
ты с моками можешь сделать абсолютно все, кроме му...

Ну вот допустим у меня замокан массив из 20 телефонов, каждый из которых имеет 50 свойств как мне из них на клиенте найти те у которых 256гб хранилище, ips экран, usb-c, Snapdragon цп и камера на 48мгп и тд ? ))

Серёжа
Ну вот допустим у меня замокан массив из 20 телефо...

элементарно используй метод filter у массива

Серёжа- Автор вопроса
Rain
элементарно используй метод filter у массива

Но количество условий всегда разное

Vitalii Sam
урыыыл

ну реально отфильтровать массив из 20 элементов по условию вернуть из мок апи слоя промис это же не высшая математика, делов то...

Серёжа- Автор вопроса
Rain
ну реально отфильтровать массив из 20 элементов по...

Не по условиЮ, а по условиЯМ. Кондишены же динамические. Может быть 3 , а может быть 33 параметра.

Серёжа
Не по условиЮ, а по условиЯМ. Кондишены же динамич...

Ты бы использовал эти кондишены для запроса в апи, используй их для фильтрации данных и все🤔

Серёжа
Не по условиЮ, а по условиЯМ. Кондишены же динамич...

ну и что? у тебя есть функция АПИ, которая на самом деле данные берет не из реального АПИ, а из localStorage при вызове тащит массив из localStorage, далее фильтрует его по параметрам которые ты в нее передал и возвращает что то типа Promise.resolve("результат фильтрации данных")

Серёжа
Не по условиЮ, а по условиЯМ. Кондишены же динамич...

можешь еще для эмуляции задержки добавить такую функцию export const delay = (delay: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, delay)); ... await delay(500) будет задержка ответа апи на 500 мс

Серёжа- Автор вопроса
Rain
можешь еще для эмуляции задержки добавить такую фу...

Ну это понятно. Но одно дело прислать самому себе массив, а другое когда юзер натыкал рамдомные свойства и по ним надо отфильтровать объекты в массиве.

Серёжа
Ну это понятно. Но одно дело прислать самому себе ...

ты не можешь отфильтровать массив по заданным критериям?

Серёжа- Автор вопроса
Rain
ты не можешь отфильтровать массив по заданным крит...

Могу когда они повторяются или имеют фиксированное количество.

Серёжа
Могу когда они повторяются или имеют фиксированное...

а в чем проблема отфильтровать если их кол-во не фиксированное?

Серёжа- Автор вопроса
Rain
а в чем проблема отфильтровать если их кол-во не ф...

Я не могу динамически подставлять в if разные условия. Оно либо есть, либо нет

Серёжа
Ну это понятно. Но одно дело прислать самому себе ...

Так принцип фильтрации не меняется, разница лишь в том что не нужно будет с реальной БД маяться

Серёжа- Автор вопроса
Max
Так принцип фильтрации не меняется, разница лишь в...

Зато БД за меня будет все искать и фильтровать.

Серёжа
Я не могу динамически подставлять в if разные усло...

ну у тебя просто недостаточный уровень алгоритмической подготовки на самом деле это делается просто

Серёжа
Зато БД за меня будет все искать и фильтровать.

ну попробуй на самом деле тебе проще алгоритмику JS подтянуть, так как при работе фронтом она тебе таки понадобиться а бэк, если ты его хочешь изучить чисто для трудоустройства, а потом на него забить, будет лишь потраченным в пустую временем

Rain
ну попробуй на самом деле тебе проще алгоритмику ...

даже фронту стоит понимать как работает бекенд особенно больше чем джун

саша2007
даже фронту стоит понимать как работает бекенд осо...

В его случае это бесполезная трата времени

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

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

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
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
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта