Nov 28, 2011

Основы CouchDB

../../../_images/couchdb.jpg

CouchDB - документо-ориентированная СУБД, в которой удобно хранить разную информацию с изменяющимся количеством параметров. Например сущность товары могут иметь бесконечное количество параметров. Создавать в РСУБД миллионы таблиц или одну огромную не вариант. В couchdb хранятся документы, т.е. простые записи. В записи может быть сколько угодно разных параметров. А для унификации записей обычно создают параметр type который заменяет имя таблицы в РСУБД.


Установка

Debian

$ sudo apt-get install couchdb

From source

$ wget http://erlang.org/download/otp_src_R12B-5.tar.gz
$ tar -xvzf otp_src_R12B-5.tar.gz
$ cd otp_src_R12B-5
$ ./configure
$ sudo make && make install

$ wget http://download.filehat.com/apache/incubator/couchdb/0.8.1-incubating/apache-couchdb-0.8.1-incubating.tar.gz
$ tar -xvzf apache-couchdb-0.8.1-incubating.tar.gz
$ cd apache-couchdb-0.8.1-incubating
$ ./configure
$ sudo make && make install

MacOS, Android, iOS

http://www.couchbase.com/downloads

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

Futon

Futon это веб интерфейс для управления CouchDB, что то типа phpmyadmin. После запуска CouchDB появится доступ к Futon по http://127.0.0.1:5984/. Для того что бы увидеть инструменты Futon нужно перейти на http://127.0.0.1:5984/_utils/

../../../_images/couchdb1.png

Couchdb Futon

Все манипуляции с базой происходят через http при помощи REST интерфейса. Поэтому можно пользоваться как браузером, так и curl или например модулем urllib в python. Futon использует для запросов плагин на jQuery. Посмотреть его можно здесь: http://127.0.0.1:5984/_utils/script/jquery.couch.js

Пользователи

По умолчанию к CouchDB открыт доступ всем, но его можно ограничить нажав на “Welcome to Admin Party! Everyone is admin. Fix this” в нижнем правом углу.

Создание документа

Вначале создадим базу (тоже кстати документ), нажимаем “Create Database...” и вводим название, дальше нажимаем “New document” и заводим значения:

../../../_images/couchdb2.png

CouchDB создание документа

Для сохранения нажимаем “Save document”. Как видно можно вводить русские названия параметров. Поле _id формируется автоматически при создании. Поле _rev формируется автоматически при каждом изменении, первая цифра означает количество изменений. _rev используется для внутренних служб системы при репликации.

Создание документа с помощью cURL

Данные в CouchDB обрабатываются в формате JSON. Создадим документ giant.json:

giant.json
{
    "manufacture": "Giant",
    "model":  "REVEL 2",
    "цвет": "синий",
    "цена": 16000,
    "type": "bike"
}

Для вставки этого документа введем в консоле:

$ curl -X POST http://127.0.0.1:5984/test/ -d @giant.json -H "Content-Type: application/json"

В базе появится документ типа:

{"ok":true,"id":"08601f0b9d3574a116ee390bf0000f44","rev":"1-67d8f0ad3100d85952dbb17ba68b08eb"}

Принятые правила в REST:

POST – создать новую запись
GET – получить значения
PUT – обновить записи
DELETE – удалить

Выбрать все записи

В CouchDB есть view которые по определенным условиям фильтруют данные. Выбор всех данных это стандартная view _all_docs.

$ curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs

Получим:

{"total_rows":2,"offset":0,"rows":[
{"id":"08601f0b9d3574a116ee390bf0000f44","key":"08601f0b9d3574a116ee390bf0000f44","value":{"rev":"1-67d8f0ad3100d85952dbb17ba68b08eb"}},
{"id":"2f6904cbb5d279fbdbb9e9eef40015ec","key":"2f6904cbb5d279fbdbb9e9eef40015ec","value":{"rev":"3-6d0577a0a515178f0cd939b5caa19572"}}
]}

Создание представлений

Представления работают по принципу map/reduce:

map - это выбор и фильтрация документов
reduce - это последующая обработка данных

Простая map функция:

function (doc) {
        if (doc.type === "bike" && doc.manufacture) {
            emit(doc.manufacture, doc);
        }
    }

Функции создаются в правом верхнем углу в Temporary View:

../../../_images/couchdb3.png

Сохраним view по нажатию “Save As...”

../../../_images/couchdb4.png

Вызовем из консоли:

$ curl -X GET http://127.0.0.1:5984/test/_design/product/_view/bike

Результат:

{"total_rows":1,"offset":0,"rows":[
{"id":"08601f0b9d3574a116ee390bf0000f44","key":"Giant","value":{"_id":"08601f0b9d3574a116ee390bf0000f44","_rev":"1-67d8f0ad3100d85952dbb17ba68b08eb","manufacture":"Giant","model":"REVEL 2","\u0446\u0432\u0435\u0442":"\u0441\u0438\u043d\u0438\u0439","\u0446\u0435\u043d\u0430":"16000","type":"bike"}}
]}

Reduce функции

Map функция:

function (doc) {
        if (doc.type === "bike" && doc.цена) {
            emit(doc._id, doc.цена);
        }
    }

Получим:

{"total_rows":2,"offset":0,"rows":[
{"id":"08601f0b9d3574a116ee390bf0000f44","key":"08601f0b9d3574a116ee390bf0000f44","value":12000},
{"id":"08601f0b9d3574a116ee390bf0001130","key":"08601f0b9d3574a116ee390bf0001130","value":16000}
]}

Reduce функция:

function(keys, prices) {
    return sum(prices);
}

Получаем сумму:

{"rows":[
{"key":null,"value":28000}
]}

В заключение можно сказать что NoSQL в виде CouchDB мне показался очень простым и удобным механизмом.

Для дополнительного чтения: http://net.tutsplus.com/tutorials/getting-started-with-couchdb/


Comments

comments powered by Disqus