Сегодня я расскажу вам, что такое документо-ориентированная база данных, что такое CouchDB, его особенности, зачем он нужен и как с ним работать, используя клиент Simply Couch.

Документо-ориентированная база данных — это база данных для документо-ориентированных приложений. Она может быть реализована как слой над реляционной базой данных или как объектная база данных.

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

CouchDB — это бесплатная документо-ориентированная база данных с открытым исходным кодом от Apache, написанная на языке программирования Erlang.

Особенности CouchDB:
• данные сохраняются не в строках и колонках, а в виде JSON-подобных документов, моделью которых является не таблицы, а деревья;
• типизация элементов данных, т.е. сопоставление отдельным полям документов типов INTEGER, DATE и пр., не поддерживается — вместо этого пользователь должен написать функцию-валидатор;
• целостность базы данных обеспечивается исключительно на уровне отдельных записей (но не на уровне связей между ними);
• связи между таблицами или записями принципиально не поддерживаются, соответственно операция объединения (JOIN) между таблицами не определена;
• для построения индексов и выполнения запросов используются функции представления (view);
• функции-валидаторы, функции-представления, функции-фильтры сохраняются в текстовом виде в самой базе данных;
• эти функции, как правило, написаны на языках JavaScript или Erlang, а для их выполнения запускается отдельный сервер запросов, взаимодействие с которым происходит посредством сокетов и текстового JSON-протокола;
• каждой базе данных в системе CouchDB соответствует единственное B-дерево (не путать с двоичным деревом);
• каждое B-дерево хранится в виде отдельного файла на диске;
• одновременно может быть запущено несколько потоков для чтения базы данных и только один — для записи;
• целостность базы данных обеспечивается только при записи данных на диск;
• представления хранятся в БД и их индексы обновляются непрерывно, однако при каждом обновлении функций представления или отображения обновляется всё B-дерево целиком;
• при обработке данных с помощью функций-представлений используется упрощённая модель технологии MapReduce, что позволяет производить параллельные вычисления, в том числе и на многоядерном процессоре;
• распределение вычислений на несколько узлов не поддерживается — вместо этого используется механизм репликации;
• обработка данных с помощью цепочки последовательных функций MapReduce не поддерживается;
• поддерживается вертикальная масштабируемость, что означает поддержку не только огромных кластеров, но и портативных устройств (нетбуки, смартфоны и пр.);
• внешний интерфейс (API) к данной СУБД построен на основе архитектуры REST, т.е. сама база данных, отдельные записи, отображения и запросы — суть ресурсы, которые имеют уникальный адрес (URL) и поддерживают операции GET, PUT, POST, DELETE;
• поэтому для взаимодействия с базой данных было написано столь много клиентских библиотек, в том числе на таких языках JavaScript, PHP, Ruby, Python и Erlang;
• взаимодействие между отдельными компонентами СУБД, т.е. с серверами представлений осуществляется опять-таки с помощью текстового протокол HTTP, а данные передаются в формате JSON; это позволило использовать различные языки программирования для написания этих компонентов — Java, Python, JavaScript и пр.

Зачем нужен CouchDB? Во-первых, эффективность разработки резко увеличивается — нет необходимости делать лишние телодвижения. Вспомните, сколько рутинной работы возникает, например, с Hibernate. Во-вторых, эта база данных может выдерживать очень большие нагрузки и содержать огромное количество данных.

Simply Couch — это очень простой и мощный клиент для CouchDB, написанный на Java. Я очень не хотел писать свой клиент, но кривизна подобных клиентов меня разочаровала — у одного клиента не работал поиск, а другой работал через «задницу».

Как работает Simply Couch?
Инициализация:
image
Например, я хочу сохранить объект «user» в базу данных:
image
…и объект уже в базе данных :)
Теперь я хочу вытащить его из базы данных:
image
…и объект уже тут :)
Не слишком ли это просто?!

Клиент состоит всего из 3 классов:
CouchDBDocument.java
image

CouchDBResult.java
image

SimplyCouch.java
image