Как выборочно реплицировать частные и общие части базы данных CouchDB? - PullRequest
3 голосов
/ 09 марта 2012

Мы собираемся использовать CouchDB / CouchCocoa для репликации данных в наше мобильное приложение.

Наша система имеет большое количество пользователей. Часть базы данных является частной для каждого пользователя - например, его задачи. Я смог скопировать их без проблем, используя фильтрованная репликация .

Вот подвох ... База данных также включает в себя общую информацию, только часть которой относится к данному пользователю. Как мне выборочно копировать эту информацию? Например, задача пользователя может ссылаться на определенные общие документы. Есть ли способ убедиться, что эти документы включены в репликацию, не включая все общие документы?

Из документации видно, что добавление doc_ids к репликации (или добавление другой репликации с этими идентификаторами документов) может быть одним из решений. Кто-нибудь пробовал это? Есть ли другие решения?

РЕДАКТИРОВАТЬ: Учитывая количество пользователей, кажется нецелесообразным пометить каждый общий документ всеми пользователями, разделяющими его, но, возможно, это единственный способ сделать это?

1 Ответ

2 голосов
/ 23 марта 2012

Окончательное решение в основном зависит от структуры ваших документов, но в настоящее время я вижу два варианта использования:

  1. Поскольку вы храните все в одной базе данных, возможно, у вас есть несколько полей, которые нужно распознать,этот документ является общедоступным или документ является частным, верно?Пример:

    владелец: "Майк"

    участники: [] // если никто не упоминается, документ выглядит как закрытый (?)

    Так что вам просто нужно немногоФильтр, который будет обрабатывать только личные документы и только общие: по тегам, количеству участников, ссылкам и т. д.

    Кроме того, если вам нужно реплицировать некоторые документы только для конкретного пользователя (например, только для Майка), чемвам нужно специальное представление для обработки всех этих документов и, да, использовать репликацию по идентификаторам документов, но это не было бы атомарным запросом: вам нужен некоторый служебный скрипт для обработки этих шагов.Если общие документы определяются ссылками на них, то единственное решение остается тем же: какой-то служебный скрипт, просматривает созданное дерево ссылок на документы и репликацию по doc._id.

  2. Просмотрите вашу архитектуру,Наличие базы данных на пользователя является нормальным вариантом использования для CouchDB и следует пути разделения и изоляции данных.Таким образом, вы можете создать для каждого пользователя базу данных, которая будет закрыта только для этого пользователя.Для общих документов вы можете создать дополнительные базы данных, играя с участниками базы данных параметров безопасности.Каждая «общая» база данных будет обрабатывать только определенное количество участников по именам или по группам, поэтому утечки данных не может быть, если только это не была ошибка CouchDB (:

    Этот подход выглядит на первый взгляд слишком странным, но все, что вам нужно, это создать сценарий управления, который будет обрабатывать создание и публикацию базы данных, репликации будут максимально простыми, а данные пользователей в безопасности.

PS I 'Мы предположили, что операция «общий доступ» делает документ видимым не для каждого, а для некоторого набора пользователей. Если я ошибся, а состояние «общий доступ» означает «публичное» состояние, чем p2. будет проще: N пользовательских баз данных + 1 публичныйодин.

...