За последние пару месяцев NoSQL был одной из самых обсуждаемых тем. Это руководство познакомит вас с CouchDB, реализацией NoSQL, и научит вас, как начать работу с платформой.
Что такое NoSQL?
NoSQL не содержит схем — вам не нужно заранее определять структуру.
NoSQL [ не только SQL ] — это движение к хранилищам документов, которые не используют реляционную модель. Основная смена парадигмы заключается в способе хранения данных. Например, когда вам нужно будет хранить данные о счете, в СУБД вам нужно будет передать эту информацию в таблицы, а затем использовать язык на стороне сервера, чтобы преобразовать эти данные обратно в реальные объекты. С другой стороны, в NoSQL вы просто храните счет. NoSQL не содержит схем, а это означает, что вам не нужно проектировать таблицы и структурировать их заранее — вы можете просто начать хранить новые значения.
Продолжая пример счета-фактуры, некоторые счета могут включать номер НДС, а некоторые нет. В СУБД вы должны указать своей таблице сначала принять номер НДС, а затем, что он может быть нулевым. В NoSQL, однако, вы можете просто хранить счета с номером НДС или без него — схемы нет. Имейте в виду, что NoSQL не является серебряной пулей. Если ваши данные действительно реляционные, правильное решение — придерживаться вашей СУБД.
Запросы к базам данных NoSQL
MapReducing имеет преимущества по сравнению с запросами SQL, поскольку задача сопоставления / уменьшения может быть распределена между несколькими узлами, что невозможно в RDBMS.
Базы данных NoSQL используют карту / редуктор для запроса и индексации базы данных. В RDBMS вы запускаете запрос, объединяющий несколько таблиц, чтобы сначала создать пул данных, а затем запрос выполняет создание результирующего набора, подмножества общих данных. В NoSQL для создания «представления» (аналогично результирующему набору) вы используете map / lower, которое является подмножеством общих данных.
Карта по сути извлекает данные и сокращает агрегирование данных. Чем больше вы знакомы с RDBMS, тем сложнее будет понять / уменьшить карту. MapReducing имеет преимущество перед запросами SQL, потому что задача map / lower может быть распределена по нескольким узлам, что невозможно в RDBMS. Добавление новой записи в базу данных не всегда является задачей повторного выполнения карты / сокращения.
Представляем CouchDB
Несколько фактов о CouchDB, которые вы должны знать:
- CouchDB — это документ-ориентированная база данных JSON, написанная на Erlang .
- Это высококонкурентная база данных, разработанная для легкого копирования по горизонтали между многочисленными устройствами и отказоустойчивости.
- Это часть поколения баз данных NoSQL.
- Это открытый проект Apache.
- Это позволяет приложениям хранить документы JSON через интерфейс RESTful.
- Он использует карту / уменьшить для индексации и запроса к базе данных.
Основные преимущества CouchDB
- Документы JSON — Все, что хранится в CouchDB, сводится к документу JSON.
- Интерфейс RESTful — от создания до репликации и вставки данных, каждая задача управления и обработки данных в CouchDB может быть выполнена через HTTP.
- Репликация N-Master — вы можете использовать неограниченное количество «мастеров», создавая некоторые очень интересные топологии репликации.
- Создано для работы в автономном режиме — CouchDB может реплицироваться на устройства (например, телефоны Android), которые могут выходить в автономный режим и обрабатывать синхронизацию данных, когда устройство снова подключается к сети.
- Фильтры репликации — вы можете точно фильтровать данные, которые вы хотите реплицировать на разные узлы.
Собираем все вместе
CouchDB — это база данных, предназначенная для работы в Интернете сегодня.
CouchDB позволяет вам писать приложение на стороне клиента, которое взаимодействует напрямую с Couch без необходимости в промежуточном уровне на стороне сервера, что значительно сокращает время разработки. С CouchDB вы можете легко справляться со спросом, легко добавляя больше узлов репликации. CouchDB позволяет вам копировать базу данных на ваш клиент, а с помощью фильтров вы можете даже копировать данные этого конкретного пользователя.
Хранение базы данных локально означает, что ваше клиентское приложение может работать практически без задержки. CouchDB будет обрабатывать репликацию в облако для вас. Ваши пользователи могут получать доступ к своим счетам на своем мобильном телефоне и вносить изменения без заметных задержек, оставаясь в автономном режиме. Когда соединение присутствует и используется, CouchDB автоматически скопирует эти изменения в ваш облачный CouchDB.
CouchDB — это база данных, предназначенная для работы в современном Интернете для современных приложений, подобных настольным компьютерам, и подключенных устройств, через которые мы получаем доступ к Интернету.
Шаг 1 — Установка CouchDB
Самый простой способ запустить CouchDB в вашей системе — это зайти в CouchOne и загрузить дистрибутив CouchDB для вашей OS — OSX в моем случае. Скачайте zip, распакуйте его и поместите CouchDBX в папку с моими приложениями (инструкции для других ОС на CouchOne).
Наконец, откройте CouchDBX.
Шаг 2 — Добро пожаловать в Футон
После запуска 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
.
Плагин CouchDB jQuery
Футон фактически использует плагин jQuery для взаимодействия с CouchDB. Вы можете просмотреть этот плагин по адресу http://127.0.0.1:5984/_utils/script/jquery.couch.js
(имейте в виду, что ваш порт может отличаться). Это дает вам отличный пример взаимодействия с CouchDB.
Шаг 3 — Пользователи в CouchDB
CouchDB по умолчанию полностью открыт, предоставляя каждому пользователю права администратора для экземпляра и всех его баз данных. Это здорово для развития, но явно плохо для производства. Давайте продолжим и настроим администратора. В правом нижнем углу вы увидите «Добро пожаловать на вечеринку администратора! Каждый админ! Исправьте это».
Идем дальше и нажимаем исправить это и дайте себе имя пользователя и пароль. Это создает учетную запись администратора и дает анонимным пользователям доступ к операциям чтения и записи во всех базах данных, но без прав конфигурации.
Подробнее о пользователях
В CouchDB было бы неразумно создавать одного суперпользователя и заставлять этого пользователя выполнять все операции чтения / записи.
Пользователи в CouchDB могут сначала немного запутаться, особенно если вы привыкли создавать одного пользователя для всего приложения, а затем сами управлять пользователями в таблице пользователей (а не в таблице пользователей MySQL). В CouchDB было бы неразумно создавать одного суперпользователя и заставлять этого пользователя выполнять все операции чтения / записи, потому что если ваше приложение на стороне клиента, то учетные данные этого суперпользователя будут видны в исходном коде JavaScript.
CouchDB имеет встроенное создание и аутентификацию пользователей. Вы можете создавать пользователей с помощью плагина jQuery, используя $.couch.signup()
. По сути, они становятся пользователями вашей системы. Пользователи — это просто документы JSON, как и все остальное, поэтому вы можете хранить любые дополнительные атрибуты, например, электронную почту. Затем вы можете использовать группы в CouchDB, чтобы контролировать, к каким документам у каждого пользователя есть права на запись. Например, вы можете создать базу данных для этого пользователя, в которую они могут писать, а затем добавить их в группу с доступом для чтения к другим базам данных при необходимости.
Шаг 4 — Создание документа продукта
Теперь давайте создадим наш первый документ, используя Futon, выполнив следующие шаги:
- Откройте
mycouchshop
данныхmycouchshop
. - Нажмите «Новый документ».
- Нажмите «Добавить поле», чтобы начать добавление данных в документ JSON. Обратите внимание, что для вас предварительно заполнено удостоверение личности, я настоятельно рекомендую не менять его. Добавьте ключ «name» со значением «Nettuts CouchDB Tutorial One».
- Убедитесь, что вы нажали галочку рядом с каждым атрибутом, чтобы сохранить его.
- Нажмите «Сохранить документ».
Поднимитесь на уровень, вернитесь в базу данных, и вы увидите один документ с предыдущим идентификатором в качестве ключа и значением, начинающимся с {rev:
Это документ JSON, который вы только что создали.
Шаг 5 — Обновление документа
CouchDB — это база данных только для добавления — новые обновления добавляются в базу данных и не перезаписывают старую версию. Каждое новое обновление документа JSON с уже существующим идентификатором будет добавлять новую редакцию. Это то, что означает автоматически вставленный ключ редакции. Следуйте инструкциям ниже, чтобы увидеть это в действии:
- Просматривая содержимое
mycouchshop
данныхmycouchshop
, нажмите на единственную видимую запись. - Добавьте еще один атрибут с ключом «type» и значением «product».
- Нажмите «Сохранить документ».
После нажатия кнопки сохранения должен появиться новый ключ редакции, начиная с номера 2. Возвращаясь к уровню в mycouchshop
базы данных mycouchshop
, вы все равно увидите только один документ, это последняя редакция нашего документа о продукте.
Ревизии
Хотя CouchDB использует внутренние ревизии, постарайтесь не слишком на нее опираться. Исправления могут быть легко очищены с помощью Futon, и он не предназначен для использования в качестве системы контроля версий. CouchDB использует ревизии как часть своих функций репликации.
Шаг 6 — Создание документа с использованием cURL
Я уже упоминал, что 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 — обновляет запись
- УДАЛИТЬ — удаляет запись
Шаг 7 — Просмотр всех документов
Далее мы можем проверить нашу вставку, просмотрев все документы в нашей mycouchshop
данных mycouchshop
, выполнив curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs
.
Шаг 8 — Создание функции простой карты
Просмотр всех документов практически бесполезен в практическом плане. Что было бы лучше, так это просмотреть все документы по продукту. Выполните следующие шаги, чтобы достичь этого:
- В Futon щелкните раскрывающийся список и выберите «Временное представление».
- Это редактор сокращения карт в Futon. Скопируйте код ниже в функцию карты.
12345function (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
.
Заметим, что по умолчанию мы получаем идентификатор и ревизию документа.
Шаг 9 — Выполнение сокращения
Чтобы выполнить полезное сокращение, давайте добавим еще один продукт в нашу базу данных и добавим атрибут цены со значением 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 и то, как легко начать работу. Я уверен, что у вас есть много вопросов на данный момент, поэтому не стесняйтесь звонить ниже. Большое спасибо за чтение!