Даже перед тем, как перейти к вашему вопросу, у вашего моделирования данных, как вы его представили, есть проблема: вы говорите, что хотите сохранить «список продуктов, которые есть у пользователя». Но это не та таблица, которую вы представили - у вашей таблицы есть один продукт для каждого идентификатора пользователя. «Идентификатор пользователя» - это ключ вашей таблицы, и каждая запись в таблице, т. Е. Каждый уникальный идентификатор пользователя, имеет одну комбинацию других полей.
Если вы действительно хотите, чтобы у каждого пользователя был список продуктов, первичный ключ должен быть (userid, productid)
. Это означает, что каждая запись индексируется с помощью и ИД пользователя и продукта, или, другими словами, - ИД пользователя имеет список записей, каждая из которых имеет свой собственный продукт. Cassandra позволяет эффективно извлекать все производимые записи для одного идентификатора пользователя, поскольку она реализует первую часть ключа как «ключ раздела», а вторая часть - «ключ кластеризации».
Что касается вашего фактического вопроса, у вас действительно есть два варианта: либо выполнить несколько запросов к исходным таблицам, либо выполнить так называемую денормализацию , т. Е. Создать вторую таблицу с тем, что вы хотите, чтобы поиск выполнялся немедленно. Для второго варианта вы можете сделать это вручную (обновлять обе таблицы каждый раз, когда у вас появляются новые данные), или позволить Cassandra автоматически обновить вторую таблицу для вас, используя функцию под названием Материализованные представления .
Какой из двух вариантов - несколько запросов или несколько обновлений - использовать действительно зависит от вашей рабочей нагрузки. Если в нем много обновлений и редких запросов, лучше оставлять обновления быстрыми и делать запросы медленнее. Если, с другой стороны, у него мало обновлений, но много запросов, лучше делать обновления медленнее (когда каждое обновление должно обновлять обе таблицы), но выполнять запросы быстрее. Другая важная проблема заключается в том, насколько важна задержка запросов - опция нескольких запросов не только увеличивает нагрузку на кластер (которую можно решить, добавляя больше оборудования для решения проблемы), но также увеличивает задержку - проблема, которая не решается. больше аппаратного обеспечения, и в некоторых случаях использование может стать проблемой.
Вы также можете достичь аналогичной цели в Cassandra, используя функцию Secondary Index , которая имеет свои собственные характеристики производительности (в некоторых отношениях она аналогична решению «несколько запросов»).