Общий случай : Всегда возможно использовать вид карты в уменьшенном виде в стиле CouchDB, но это не обязательно практично .
В конце концов, это в основном аргумент, основанный на подсчете: если вам нужно задать вопрос для любого подмножества ваших 500 000 продуктов, то ваша база данных должна быть в состоянии дать отдельный ответ на каждый из 2 500 000 различных возможных вопросов, в которых используется запредельный объем памяти, если вам необходимо выдавать лист B-дерева для каждого из них (и вам нужно выдавать данные, если ответ на большинство этих запросов не равен нулю, ложь, пустой набор или аналогичное нулевое значение).
CouchDB обеспечивает первую небольшую оптимизацию благодаря наличию запросов диапазона (это означает, что в идеальном случае для ответа на N 2 вопросов может использоваться всего лишь N листьев B-дерева).Однако в вашем примере это только уменьшит количество листьев до 2 250 000 (и это теоретическая нижняя граница).
CouchDB обеспечивает второй маленькийоптимизация с помощью запросов с префиксом ключа, что означает, что вы можете сжимать запросы [A], [A, B] и [A, B, C] в один ключ [A, B, C].Таким образом, вместо ваших 2 250 000 возможностей вы получаете «простые» 2 249,999 ...
Итак, пока вы можете придумать излучающийстратегия для ответа на вопрос для любого подмножества, это займет больше места для хранения, чем на самом деле доступно на нашей планете.В общем случае, чтобы ответить на N разных вопросов, вам нужно выпустить не менее sqrt(N/2)
листьев B-дерева, поэтому посчитайте ваши вопросы и определите, является ли эта нижняя граница числа листьев приемлемой.
Только для категорий и подкатегорий : если вы отказываетесь от произвольных списков продуктов и задаете вопросы только в форме «дайте мне существенные атрибуты в категории A, отфильтрованные по атрибутам B и C», то ваше число испускаемых сокращается до:
AvgCategories * AvgAttr * 2 ^ (AvgAttr - 1) * 500,000
В основном для каждого продукта вы используете ключи [Category,Attr,Attr,...]
для всех категорий продукта и всех комбинаций атрибутов продукта, что позволяет выполнять запросы по категориям + атрибутам.Если у вас есть в среднем 1 категория и 3 атрибута на продукт, получается около 6 миллионов записей, что вполне приемлемо.