Доминирующим фактором (как говорит Йохан Ларсон в своем ответе), скорее всего, является количество в оба конца.Ваше первое решение будет иметь две двусторонние от приложения до кластера , а второе будет иметь только одну.Однако есть некоторые потенциальные нюансы.
Важно отметить, что поиск по ключу / значению всегда будет самым быстрым.Эти запросы будут направлены непосредственно на узлы, на которых работает служба данных.С помощью Couchbase клиенты получают доступ к узлу, содержащему данные напрямую, а не через систему master-slave.Другими словами, вы можете выполнить ak / v-запрос за одну поездку туда и обратно только с узлом данных, который имеет фактический документ.
Используя ваш первый подход, вы можете полностью избежать N1QL.Просто сделайте прямой k / v get
с идентификатором status :: usertype, вытащите идентификатор пользователя, а затем используйте его для создания get
второго документа.Вы даже можете использовать API поддокумента только для того, чтобы вернуть идентификатор пользователя.
Второй подход будет включать в себя индекс и запрос N1QL, так что вы потенциально можете использовать до трех разных машин в кластере.Будет ли это быстрее, зависит от топологии.Если ваше приложение работает рядом с вашим кластером (то есть пропускная способность / задержка сети аналогична времени внутри кластера), я думаю, что подход k / v может быть быстрее.Если задержка в сети от приложения к кластеру больше, второй подход, скорее всего, быстрее.
Есть дальнейшее рассмотрение.Если весь результат «покрывается» индексом, который вы создаете для запроса (то есть вы сохраняете все части документа, которые вам нужны, в своем индексе), тогда ответ может быть полностью предоставлен службой индекса.Это сократит подход N1QL до попадания в службу запросов и службу индексирования, что будет быстрее.
Если говорить более подробно, ваш вопрос включает в себя данные, индексацию и запрос.Couchbase разделяет эти функции на отдельные сервисы, что означает, что вы можете масштабировать каждую емкость независимо.Вот почему вы также можете использовать три разных компьютера с помощью запроса N1QL.
Это также будет зависеть от характера загрузки данных.Например, если он тяжелый для чтения или тяжелый для записи.Полнота записи с индексом будет означать обновления индекса, тогда как интенсивность чтения - нет.Точно так же XDCR будет зависеть от чтения против записи.