Для данной задачи я бы использовал связку баз данных. Для товаров я бы использовал Reindexer. Составить таблицу со списком городов где есть хоть 1 склад. Составить таблицу складов, связать с таблицей городо по city_id - > id. Катологи товаров составить 3 таблицы. Группа.Категория.Подкатегории. И отдельная таблица под товары. Причем товары связаны со всем путём id. один и тот же товар может повторяться, но отличаться местом хранения, в связи с чем будет отличаться и цена и количество. Такая структура увеличивает затраты по памяти, но ускоряет поиск в данной базе данных. То есть жертвуем ресурсы сервера по объму хранимой памяти,но система работает быстрее. Дополнительные поля задаются через массив строк. пример для еды. ["ккал - 440" , "годен до 15.02.2024"]. Данная структура подходит, так как нет необходимости в отдельных индексах, для поиска. + на текущий момент, полнотекстовый поиск в Reindexer сейчас обладает наилучшими показателями скорости и точности. Redis для корзины. В кук-файлах пользователя хранить токен корзины. в редисе по этому ключу хранить стек из товаров. ( Конечно мы можем сохранять json в кук, и его редактировать, чтобы перекинуть часть на клиентский модуль. Но для поддерживания консистентности, надо будет сверять на наличие изменений о наличии и стоимости товаров) Для хранения информации о пользователях и о самих заказах я бы доверил Tarantool. Изображения бы товаров хранил бы в S3 системе, а в Бд указывал бы лишь ссылки на них.
Плюсы:
- Данной системы это явное преимущество в скорости работы
- Распределение информации для удобной работы.
- Независимые узлы, не теряющие функциональность от выхода одного из строя.
- Использование более подходящих инструментов для каждой задачи.
Минусы:
- Повышенный расход оперативной памяти, частично компенсируемый сжатием.
- Избыток процессов,больше элементов требующих обеспечение безопасности.
- Трудная модернизация в поисковом модуле.
Вывод: Считаю, что в текущий момент это один из наиболее продвинутых вариантов решения задачи, имеющий "жесткие требования ко времени отклика запроса к каталогу"