Да, CouchDB отлично подходит для этого - благодаря простому протоколу он отлично подходит для веб-приложений [даже в автономном режиме, см. pouchdb ] и мобильных / настольных приложений [снова даже в автономном режиме, см. Couchbase Mobile .
К сожалению, я не знаю большого публично доступного примера уровня кода, но основная идея состоит в том, чтобы использовать комбинацию отфильтрованной репликации и проверки документов:
Основная идея заключается в том, что для вашей серверной копии пользовательской базы данных у вас установлены функции проверки, чтобы обеспечить соблюдение требуемых схем документов и контроля доступа. Конечный пользователь получает реплику этой базы данных, которую можно использовать для доступа с низкой задержкой и автономного доступа - теоретически они могут подорвать свою копию, но при репликации обратно функция проверки предотвратит повреждение базы данных на стороне сервера.
Вы даже можете настроить основную базу данных, которая не является общедоступной, а затем использовать отфильтрованная репликация для синхронизации данных каждого пользователя с серверными базами данных на стороне пользователя - полезно для централизованного обмена сообщениями, агрегированной статистики, требуется только резервное копирование одной базы данных и т. д.
В этой статье «Новые функции в репликации» есть еще несколько примеров высокого уровня, особенно разделы примеров использования «DesktopCouch» и «Обмен данными на основе необходимости». .
ОБНОВЛЕНИЕ (2015/03/10) : я больше не рекомендую использовать фильтрованную репликацию CouchDB, как описано выше. Существует несколько проблем с производительностью и масштабируемостью (если не с проблемами надежности), возникающих при попытке реплицировать более нескольких отфильтрованных каналов из центральной базы данных. Вы можете попробовать Couchbase и его Sync Gateway , если вам нужны разрешения на чтение на уровне документа, или создать собственные изменения для каждого пользователя представления (защищенные пользовательским промежуточным ПО) с использованием _local_seq
.