Статьи

Начало работы с CouchDB

За последние пару месяцев NoSQL был одной из самых обсуждаемых тем. Это руководство познакомит вас с CouchDB, реализацией NoSQL, и научит вас, как начать работу с платформой.


NoSQL не содержит схем — вам не нужно заранее определять структуру.

NoSQL [ не только SQL ] — это движение к хранилищам документов, которые не используют реляционную модель. Основная смена парадигмы заключается в способе хранения данных. Например, когда вам нужно будет хранить данные о счете, в СУБД вам нужно будет передать эту информацию в таблицы, а затем использовать язык на стороне сервера, чтобы преобразовать эти данные обратно в реальные объекты. С другой стороны, в NoSQL вы просто храните счет. NoSQL не содержит схем, а это означает, что вам не нужно проектировать таблицы и структурировать их заранее — вы можете просто начать хранить новые значения.

Продолжая пример счета-фактуры, некоторые счета могут включать номер НДС, а некоторые нет. В СУБД вы должны указать своей таблице сначала принять номер НДС, а затем, что он может быть нулевым. В NoSQL, однако, вы можете просто хранить счета с номером НДС или без него — схемы нет. Имейте в виду, что NoSQL не является серебряной пулей. Если ваши данные действительно реляционные, правильное решение — придерживаться вашей СУБД.


MapReducing имеет преимущества по сравнению с запросами SQL, поскольку задача сопоставления / уменьшения может быть распределена между несколькими узлами, что невозможно в RDBMS.

Базы данных NoSQL используют карту / редуктор для запроса и индексации базы данных. В RDBMS вы запускаете запрос, объединяющий несколько таблиц, чтобы сначала создать пул данных, а затем запрос выполняет создание результирующего набора, подмножества общих данных. В NoSQL для создания «представления» (аналогично результирующему набору) вы используете map / lower, которое является подмножеством общих данных.

Карта по сути извлекает данные и сокращает агрегирование данных. Чем больше вы знакомы с RDBMS, тем сложнее будет понять / уменьшить карту. MapReducing имеет преимущество перед запросами SQL, потому что задача map / lower может быть распределена по нескольким узлам, что невозможно в RDBMS. Добавление новой записи в базу данных не всегда является задачей повторного выполнения карты / сокращения.


Несколько фактов о CouchDB, которые вы должны знать:

  • CouchDB — это документ-ориентированная база данных JSON, написанная на Erlang .
  • Это высококонкурентная база данных, разработанная для легкого копирования по горизонтали между многочисленными устройствами и отказоустойчивости.
  • Это часть поколения баз данных NoSQL.
  • Это открытый проект Apache.
  • Это позволяет приложениям хранить документы JSON через интерфейс RESTful.
  • Он использует карту / уменьшить для индексации и запроса к базе данных.

  • Документы JSON — Все, что хранится в CouchDB, сводится к документу JSON.
  • Интерфейс RESTful — от создания до репликации и вставки данных, каждая задача управления и обработки данных в CouchDB может быть выполнена через HTTP.
  • Репликация N-Master — вы можете использовать неограниченное количество «мастеров», создавая некоторые очень интересные топологии репликации.
  • Создано для работы в автономном режиме — CouchDB может реплицироваться на устройства (например, телефоны Android), которые могут выходить в автономный режим и обрабатывать синхронизацию данных, когда устройство снова подключается к сети.
  • Фильтры репликации — вы можете точно фильтровать данные, которые вы хотите реплицировать на разные узлы.

CouchDB — это база данных, предназначенная для работы в Интернете сегодня.

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

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

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


Самый простой способ запустить CouchDB в вашей системе — это зайти в CouchOne и загрузить дистрибутив CouchDB для вашей OS — OSX в моем случае. Скачайте zip, распакуйте его и поместите CouchDBX в папку с моими приложениями (инструкции для других ОС на CouchOne).

Наконец, откройте CouchDBX.


После запуска CouchDB вы должны увидеть панель управления Futon в приложении CouchDBX. В случае, если вы не можете, вы можете получить доступ к Futon через браузер. Глядя на журнал, CouchDBX сообщает нам, что CouchDB был запущен по адресу http://127.0.0.1:5984/ (может отличаться в вашей системе). Откройте браузер и перейдите по http://127.0.0.1:5984/_utils/ и вы должны увидеть Futon.

В оставшейся части этого урока я буду использовать Futon в Firefox. У меня также будет открыт Firebug и вид консоли, чтобы увидеть все HTTP-запросы, которые Футон отправляет за кулисы. Это полезно, поскольку ваше приложение может делать все, что делает Futon. Давайте продолжим и создадим базу данных под названием mycouchshop .

Футон фактически использует плагин jQuery для взаимодействия с CouchDB. Вы можете просмотреть этот плагин по адресу http://127.0.0.1:5984/_utils/script/jquery.couch.js (имейте в виду, что ваш порт может отличаться). Это дает вам отличный пример взаимодействия с CouchDB.


CouchDB по умолчанию полностью открыт, предоставляя каждому пользователю права администратора для экземпляра и всех его баз данных. Это здорово для развития, но явно плохо для производства. Давайте продолжим и настроим администратора. В правом нижнем углу вы увидите «Добро пожаловать на вечеринку администратора! Каждый админ! Исправьте это».

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

В CouchDB было бы неразумно создавать одного суперпользователя и заставлять этого пользователя выполнять все операции чтения / записи.

Пользователи в CouchDB могут сначала немного запутаться, особенно если вы привыкли создавать одного пользователя для всего приложения, а затем сами управлять пользователями в таблице пользователей (а не в таблице пользователей MySQL). В CouchDB было бы неразумно создавать одного суперпользователя и заставлять этого пользователя выполнять все операции чтения / записи, потому что если ваше приложение на стороне клиента, то учетные данные этого суперпользователя будут видны в исходном коде JavaScript.

CouchDB имеет встроенное создание и аутентификацию пользователей. Вы можете создавать пользователей с помощью плагина jQuery, используя $.couch.signup() . По сути, они становятся пользователями вашей системы. Пользователи — это просто документы JSON, как и все остальное, поэтому вы можете хранить любые дополнительные атрибуты, например, электронную почту. Затем вы можете использовать группы в CouchDB, чтобы контролировать, к каким документам у каждого пользователя есть права на запись. Например, вы можете создать базу данных для этого пользователя, в которую они могут писать, а затем добавить их в группу с доступом для чтения к другим базам данных при необходимости.


Теперь давайте создадим наш первый документ, используя Futon, выполнив следующие шаги:

  1. Откройте mycouchshop данных mycouchshop .
  2. Нажмите «Новый документ».
  3. Нажмите «Добавить поле», чтобы начать добавление данных в документ JSON. Обратите внимание, что для вас предварительно заполнено удостоверение личности, я настоятельно рекомендую не менять его. Добавьте ключ «name» со значением «Nettuts CouchDB Tutorial One».
  4. Убедитесь, что вы нажали галочку рядом с каждым атрибутом, чтобы сохранить его.
  5. Нажмите «Сохранить документ».

Поднимитесь на уровень, вернитесь в базу данных, и вы увидите один документ с предыдущим идентификатором в качестве ключа и значением, начинающимся с {rev: Это документ JSON, который вы только что создали.


CouchDB — это база данных только для добавления — новые обновления добавляются в базу данных и не перезаписывают старую версию. Каждое новое обновление документа JSON с уже существующим идентификатором будет добавлять новую редакцию. Это то, что означает автоматически вставленный ключ редакции. Следуйте инструкциям ниже, чтобы увидеть это в действии:

  • Просматривая содержимое mycouchshop данных mycouchshop , нажмите на единственную видимую запись.
  • Добавьте еще один атрибут с ключом «type» и значением «product».
  • Нажмите «Сохранить документ».

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

Хотя CouchDB использует внутренние ревизии, постарайтесь не слишком на нее опираться. Исправления могут быть легко очищены с помощью Futon, и он не предназначен для использования в качестве системы контроля версий. CouchDB использует ревизии как часть своих функций репликации.


Я уже упоминал, что CouchDB использует интерфейс RESTful, и читатель с орлиными глазами заметил бы, что Futon использует это через консоль в Firebug. Если вы этого не сделали, давайте докажем это, вставив документ с помощью cURL через Терминал.

Сначала давайте создадим документ JSON с приведенным ниже содержимым и сохраним его на рабочем столе, вызвав файл person.json .

1
2
3
4
5
{
    «forename»: «Gavin»,
    «surname»: «Cooper»,
    «type»: «person»
}

Затем откройте терминал и выполните cd ~/Desktop/ поместив вас в правильный каталог, а затем выполните вставку с curl -X POST http://127.0.0.1:5984/mycouchshop/ -d @person.json -H "Content-Type: application/json" . CouchDB должен был вернуть документ JSON, аналогичный приведенному ниже.

1
{«ok»:true,»id»:»c6e2f3d7f8d0c91ce7938e9c0800131c»,»rev»:»1-abadd48a09c270047658dbc38dc8a892″}

Это идентификатор и номер редакции вставленного документа. CouchDB следует соглашению RESTful и таким образом:

  • POST — создает новую запись
  • GET — читает записи
  • PUT — обновляет запись
  • УДАЛИТЬ — удаляет запись

Далее мы можем проверить нашу вставку, просмотрев все документы в нашей mycouchshop данных mycouchshop , выполнив curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs .


Просмотр всех документов практически бесполезен в практическом плане. Что было бы лучше, так это просмотреть все документы по продукту. Выполните следующие шаги, чтобы достичь этого:

  • В Futon щелкните раскрывающийся список и выберите «Временное представление».
  • Это редактор сокращения карт в Futon. Скопируйте код ниже в функцию карты.
    1
    2
    3
    4
    5
    function (doc) {
        if (doc.type === «product» && doc.name) {
            emit(doc.name, doc);
        }
    }
  • Нажмите Run, и вы увидите один продукт, который мы добавили ранее.
  • Сделайте это представление постоянным, сохранив его.

После создания этой простой функции карты теперь мы можем запросить это представление и просмотреть его содержимое по HTTP, используя следующую команду curl -X GET http://127.0.0.1:5984/mycouchshop/_design/products/_view/products .

Заметим, что по умолчанию мы получаем идентификатор и ревизию документа.


Чтобы выполнить полезное сокращение, давайте добавим еще один продукт в нашу базу данных и добавим атрибут цены со значением 1,75 к нашему первому продукту.

1
2
3
4
5
{
    «name»: «My Product»,
    «price»: 2.99,
    «type»: «product»
}

Для нашего нового представления мы добавим как уменьшение, так и карту. Во-первых, нам нужно отобразить карту, как показано ниже.

1
2
3
4
5
function (doc) {
    if (doc.type === «product» && doc.price) {
        emit(doc.id, doc.price);
    }
}

Приведенная выше функция карты просто проверяет, является ли введенный документ продуктом и имеет ли он цену. Если эти условия были выполнены, цена товара выбрасывается. Функция уменьшения ниже.

1
2
3
function (keys, prices) {
    return sum(prices);
}

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


В этом уроке мы кратко, но сфокусировали взгляд на CouchDB. Мы увидели потенциальную мощь CouchDB и то, как легко начать работу. Я уверен, что у вас есть много вопросов на данный момент, поэтому не стесняйтесь звонить ниже. Большое спасибо за чтение!