Я занимаюсь разработкой цифрового рынка, где продавцы (компании) могут продавать товары. Каждая компания может иметь до 100 тыс. Продуктов, и каждый продукт принадлежит только одной компании. Предположим, у каждого продукта есть описание (размером до 10 КБ) и цена.
Теперь каждая компания может назначить скидку для определенной группы клиентов (или на основе некоторых других бизнес-правил), чтобы окончательная цена для клиента была рассчитана как: discount * price
. Я пытаюсь придумать модель сопоставления и запрос, который будет эффективно выполнять поиск по миллионам продуктов, сортировать их по конечной цене и возвращать постраничный список.
AFAIK, мои варианты:
- Скопируйте информацию о скидке (которая может быть довольно сложной!) На уровень продукта. Это самое простое решение, но оно потребует переиндексации всех продуктов компании при изменении каких-либо данных о скидках, а также не очень хорошим вариантом по другим причинам
- Используйте поле Join (где компания является родительской). Это было бы хорошим вариантом, потому что скалярная «цена со скидкой *» должна рассчитываться для каждого отдельного документа во время запроса и в любом случае не будет пользоваться избыточностью данных.
- Используйте вложенное поле . Это худший вариант, потому что доступное количество продуктов будет меняться каждые пару часов, поэтому мне придется каждый раз переиндексировать все продукты в компании что-нибудь меняется
Дополнительная проблема состоит в том, что запросы has_parent являются более сложными, и я до сих пор не уверен, возможно ли написать запрос, который будет вычислять такую оценку.
По моему мнению, вариант 3 будет огромным перерасходом производительности, а вариант 2 будет очень проблематичным при написании сложных запросов, поэтому мне придется придерживаться варианта 1 только потому, что у меня просто нет другого возможного выбора: (
Пожалуйста, помогите мне выбрать правильный путь - любые нетривиальные мнения приветствуются.