В настоящее время у меня возникают проблемы с моим бэкэндом с несколькими миллионами продуктов, несколькими тысячами магазинов и данными о доступности.
мой вариант использования: мне нужно синхронизировать данные о магазине, товаре и наличии в моей базе данных, а затем запросить их в зависимости от фильтров, orderBys, местоположения пользователя и переданного поискового текста.Мне нужно хранить, какой продукт доступен в каком магазине и обновлять эти данные каждые несколько минут.мне нужно создать подходящий полнотекстовый поиск, позволяющий мне также сортировать товары по релевантности (возможно, hibernate-search?)
пример запроса: получить все продукты по тексту поиска, фильтры, orderBys, местоположение пользователя и область, которая определяет, какие магазины включены.в этом случае не только получить все продукты, но и магазины, чтобы отобразить их на карте или рассчитать расстояние.
идеи / возможности:
- многовзаимосвязь между магазином и продуктом и проблема с отдельной таблицей доступности: приводит к огромной базе данных «многие ко многим», которую невозможно объединить за разумное время (> 10 секунд)
- «многие ко многим»Связь между магазином и продуктом с доступностью, хранящейся в таблице nxm
- Проблема: приводит к огромной базе данных «многие ко многим», которую невозможно объединить за разумное время (> 10 секунд)
- проблема: хранение занимает много времени + обновление доступности - огромная проблема
- shop-string с ";;"в продукте
- проблема: невозможно отсортировать по местоположению магазина методами postGIS - проблема: потенциально очень медленная
- проблема: нет доступности, сопоставленной без объединения
- магазины json в продукте ([{"id":, цена: 1, количество: 12, местоположение: POINT (x, y)}, {…}] - проблема: невозможно отсортировать по местоположению магазина
- хранить идентификаторы товаров в json в магазине - проблема: нужно извлекать товары в зависимости от запроса, а не в зависимости от магазина
стек:
- java 8
- весенняя загрузка
- jpa, hibernate
- postgreSQL / postGIS
Может кто-нибудь дать мне подсказку или поделиться опытом о том, какрешить это?