NoSQL е една от най-обсъжданите теми през последните няколко месеца. Този урок ще ви запознае с CouchDB, реализация на NoSQL и ще ви научи как да започнете с платформата.
Какво е NoSQL?
NoSQL е без схема - не е нужно да решавате структурата предварително.
NoSQL [не само SQL ] е движение към магазини за документи, които не използват релационния модел. Основната промяна на парадигмата е в начина, по който те съхраняват данни. Например, когато трябва да съхранявате данни за фактура, в RDBMS ще трябва да дестилирате тази информация в таблици и след това да използвате език от страна на сървъра, за да трансформирате тези данни обратно в обекти от реалния живот. От друга страна, в NoSQL вие просто съхранявате фактурата. NoSQL е без схема, което означава, че не е необходимо да проектирате своите таблици и структура отпред – можете просто да започнете да съхранявате нови стойности.
Продължавайки примера с фактури, някои фактури може да включват ДДС номер, други може да не. В RDBMS трябва да кажете на вашата таблица първо да приеме ДДС номер и след това, че той може да е нулев. В NoSQL обаче можете просто да съхранявате фактури със или без ДДС номер - няма схема. Имайте предвид, че NoSQL не е сребърен куршум. Ако вашите данни са наистина релационни, придържането към вашата RDBMS би било правилният избор.
Запитване за NoSQL бази данни
MapReducing има предимства пред SQL заявките, тъй като задачата map/reduce може да бъде разпределена между множество възли, нещо, което не е възможно в RDBMS.
Базите данни NoSQL използват map/reduce за запитване и индексиране на базата данни. В RDBMS изпълнявате заявка, обединяваща множество таблици заедно, за да създадете първо пул от данни и след това заявката се изпълнява, създавайки набор от резултати, подмножество от общите данни. В NoSQL използвате map/reduce, за да създадете „изглед“ (подобен на набор от резултати). Този изглед е подмножество от общите данни.
Картата по същество извлича данни и намалява, агрегиране на данни. Колкото по-запознат сте с RDBMS, толкова по-трудно ще бъде схващането на картата/намаляването. MapReducing има предимства пред SQL заявките, тъй като задачата map/reduce може да бъде разпределена между множество възли, нещо, което не е възможно в RDBMS. Добавянето на нов запис към базата данни не винаги представлява задачата за картиране/намаляване, която се изпълнява напълно отново.
Представяме CouchDB
Няколко факта за CouchDB, които трябва да знаете:
- CouchDB е JSON документ-ориентирана база данни, написана на Erlang.
- Това е много конкурентна база данни, проектирана да може лесно да се репликира, хоризонтално, на множество устройства и да бъде толерантна към грешки.
- Тя е част от NoSQL генерирането на бази данни.
- Това е проект на фондация Apache с отворен код.
- Позволява на приложенията да съхраняват JSON документи чрез своя RESTful интерфейс.
- Използва map/reduce за индексиране и запитване към базата данни.
Основни предимства на 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 дистрибуция за вашата ОС - OSX в моя случай. Изтеглете архива, извлечете го и пуснете CouchDBX в папката ми с приложения (инструкции за други ОС на CouchOne).
Накрая отворете CouchDBX.
Стъпка 2 – Добре дошли във Futon
След като 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 изпраща зад кулисите. Това е полезно, тъй като вашето приложение може да прави всичко, което Futon прави. Нека да продължим и да създадем база данни, наречена mycouchshop
.
CouchDB jQuery Plugin
Futon всъщност използва jQuery плъгин за взаимодействие с CouchDB. Можете да видите този плъгин на адрес http://127.0.0.1:5984/_utils/script/jquery.couch.js
(имайте предвид, че портът ви може да е различен). Това ви дава чудесен пример за взаимодействие с CouchDB.
Стъпка 3 – Потребители в CouchDB
CouchDB по подразбиране е напълно отворен, като дава на всеки потребител администраторски права върху инстанцията и всички нейни бази данни. Това е чудесно за развитие, но очевидно лошо за производството. Нека да продължим и да настроим администратор. В долния десен ъгъл ще видите „Добре дошли в Admin Party! Всички са администратори! Поправете това“.
Продължете и щракнете върху поправете това и си дайте потребителско име и парола. Това създава администраторски акаунт и дава на анонимните потребители достъп до операции за четене и запис във всички бази данни, но без привилегии за конфигуриране.
Още за потребителите
В CouchDB би било неразумно да се създаде един супер потребител и този потребител да извършва цялото четене/записване.
Първоначално потребителите в CouchDB могат да бъдат малко объркващи за разбиране, особено ако сте свикнали да създавате един потребител за цялото си приложение и след това сами да управлявате потребителите в таблица с потребители (не в таблицата с потребители на MySQL). В CouchDB би било неразумно да създадете един супер потребител и този потребител да извърши цялото четене/записване, защото ако приложението ви е от страна на клиента, тогава идентификационните данни на този супер потребител ще бъдат видими във вашия изходен код на JavaScript.
CouchDB включва създаване на потребители и удостоверяване. Можете да създавате потребители с jQuery плъгина, като използвате $.couch.signup()
. Те по същество стават потребители на вашата система. Потребителите са просто JSON документи като всичко останало, така че можете да съхранявате всякакви допълнителни атрибути, които желаете, като например имейл. След това можете да използвате групи в CouchDB, за да контролирате до какви документи всеки потребител има достъп за запис. Например, можете да създадете база данни за този потребител, на която те могат да пишат и след това да ги добавите към група с достъп за четене до другите бази данни, както е необходимо.
Стъпка 4 – Създаване на продуктов документ
Сега нека създадем първия си документ с помощта на Futon чрез следните стъпки:
- Отворете
mycouchshop
база данни. - Щракнете върху „Нов документ“.
- Щракнете върху „Добавяне на поле“, за да започнете да добавяте данни към JSON документа. Забележете как предварително е попълнен идентификационен номер за вас, силно бих посъветвал да не променяте това. Добавете ключ "name" със стойността на "Nettuts CouchDB Tutorial One".
- Уверете се, че щракнете върху отметката до всеки атрибут, за да го запазите.
- Щракнете върху „Запазване на документа“.
Отидете на ниво нагоре, върнете се към базата данни и трябва да видите един документ, посочен с предишния идентификатор като ключ и стойност, започваща с{rev:
. Това е JSON документът, който току-що създадохте.
Стъпка 5 – Актуализиране на документ
CouchDB е база данни само за добавяне - новите актуализации се добавят към базата данни и не презаписват старата версия. Всяка нова актуализация на JSON документ със съществуващ идентификатор ще добавя нова ревизия. Това означава автоматично вмъкнатият ключ за ревизия. Следвайте стъпките по-долу, за да видите това в действие:
- Преглед на съдържанието на
mycouchshop
база данни, щракнете върху единствения видим запис. - Добавете друг атрибут с ключа „тип“ и стойността „продукт“.
- Натиснете „Запазване на документа“.
След натискане на запазване трябва да се вижда нов ключ за ревизия, започващ с числото 2. Връщане на ниво назад към mycouchshop
изглед на базата данни, все още ще виждате само един документ, това е най-новата ревизия на нашия продуктов документ.
Ревизии
Докато CouchDB използва ревизии вътрешно, опитайте се да не се облягате твърде много на него. Ревизиите могат да бъдат почистени чрез Futon доста лесно и не е проектиран да се използва като система за контрол на ревизии. CouchDB използва ревизиите като част от своята функционалност за репликация.
Стъпка 6 - Създаване на документ с помощта на cURL
Вече споменах, че CouchDB използва RESTful интерфейс и четецът с орлови очи би забелязал, че Futon използва това чрез конзолата във Firebug. В случай, че не сте го направили, нека докажем това, като вмъкнем документ с помощта на cURL през терминала.
Първо , нека създадем JSON документ със съдържанието по-долу и да го запишем на работния плот, като извикаме файла person.json
.
{ "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 документ, подобен на този по-долу.
{"ok":true,"id":"c6e2f3d7f8d0c91ce7938e9c0800131c","rev":"1-abadd48a09c270047658dbc38dc8a892"}
Това е идентификационният номер и номерът на ревизия на вмъкнатия документ. CouchDB следва конвенцията RESTful и по този начин:
- Публикуване - създава нов запис
- ВЗЕМЕТЕ - чете записи
- ПУСКАНЕ - актуализира запис
- ИЗТРИВАНЕ - изтрива запис
Стъпка 7 - Преглед на всички документи
Можем допълнително да проверим нашата вложка, като прегледаме всички документи в нашия mycouchshop
база данни чрез изпълнение на curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs
.
Стъпка 8 – Създаване на проста функция за карта
Прегледът на всички документи е доста безполезен от практическа гледна точка. Това, което би било по-идеално, е да видите всички продуктови документи. Следвайте стъпките по-долу, за да постигнете това:
- В рамките на Futon щракнете върху падащото меню за изглед и изберете „Времен изглед“.
- Това е редакторът за намаляване на картата във Futon. Копирайте кода по-долу във функцията map.
function (doc) { if (doc.type === "product" && doc.name) { emit(doc.name, doc); } }
- Щракнете върху стартиране и трябва да видите единичния продукт, който добавихме по-рано.
- Продължете и направете този изглед постоянен, като го запазите.
След като създадем тази проста функция за карта, вече можем да поискаме този изглед и да видим съдържанието му през HTTP, като използваме следната команда curl -X GET http://127.0.0.1:5984/mycouchshop/_design/products/_view/productsкод> .
Малко нещо, което трябва да забележите, е как получаваме идентификатора на документа и ревизията по подразбиране.
Стъпка 9 - Извършване на намаляване
За да извършим полезно намаление, нека добавим друг продукт към нашата база данни и добавим атрибут цена със стойност 1,75 към първия ни продукт.
{ "name": "My Product", "price": 2.99, "type": "product" }
За нашия нов изглед ще включим намаляване, както и карта. Първо, трябва да картографираме, както е посочено по-долу.
function (doc) { if (doc.type === "product" && doc.price) { emit(doc.id, doc.price); } }
Горната функция карта просто проверява дали въведеният документ е продукт и дали има цена. Ако тези условия са изпълнени, цената на продукта се излъчва. Функцията за намаляване е по-долу.
function (keys, prices) { return sum(prices); }
Горната функция взема цените и връща сумата, използвайки една от вградените функции за намаляване на CouchDB. Уверете се, че сте проверили опцията за намаляване в горния десен ъгъл на таблицата с резултати, тъй като в противен случай може да не можете да видите резултатите от намаляването. Може да се наложи да направите твърдо опресняване на страницата, за да видите опцията за намаляване