NoSQL har været et af de mest omtalte emner i løbet af de sidste par måneder. Denne tutorial vil introducere dig til CouchDB, en NoSQL-implementering og lære dig, hvordan du kommer i gang med platformen.
Hvad er NoSQL?
NoSQL er skemafri -- du behøver ikke bestemme strukturen på forhånd.
NoSQL [ikke kun SQL ] er en bevægelse mod dokumentlagre, der ikke gør brug af den relationelle model. Det grundlæggende paradigmeskift er den måde, de opbevarer data på. For eksempel, når du skal gemme data om en faktura, skal du i RDBMS destillere disse oplysninger til tabeller og derefter bruge et sprog på serversiden til at transformere disse data tilbage til virkelige objekter. Til gengæld gemmer du i NoSQL blot fakturaen. NoSQL er skemafrit, hvilket betyder, at du ikke behøver at designe dine tabeller og struktur på forhånd - du kan simpelthen begynde at gemme nye værdier.
Hvis vi fortsætter med fakturaeksemplet, kan nogle fakturaer indeholde et momsnummer, nogle ikke. I et RDBMS skal du fortælle dit bord først at acceptere et momsnummer og derefter, at det muligvis kan være nul. I NoSQL kan du dog bare gemme fakturaer med eller uden et momsnummer -- der er intet skema. Husk på, at NoSQL ikke er en sølvkugle. Hvis dine data virkelig er relationelle, ville det være det rigtige valg at holde fast i dit RDBMS.
Forespørgsel efter NoSQL-databaser
MapReducing har fordele i forhold til SQL-forespørgsler, fordi kort-/reducer-opgaven kan fordeles mellem flere noder, noget der ikke er muligt i RDBMS.
NoSQL-databaser bruger map/reducer til at forespørge og indeksere databasen. I RDBMS kører du en forespørgsel, der forbinder flere tabeller for først at oprette en pulje af data, og derefter kører forespørgslen og skaber et resultatsæt, en undergruppe af de overordnede data. I NoSQL bruger du kort/reducer til at skabe en 'visning' (svarende til et resultatsæt). Denne visning er en delmængde af de overordnede data.
Kort er i bund og grund at udtrække data og reducere dataaggregering. Jo mere fortrolig du er med RDBMS, jo sværere vil det være at forstå kort/reducere. MapReducing fordele i forhold til SQL-forespørgsler, fordi kort-/reducer-opgaven kan fordeles mellem flere noder, noget der ikke er muligt i RDBMS. Tilføjelse af en ny post til databasen betyder ikke altid, at kort-/reducer-opgaven køres fuldstændigt igen.
Vi præsenterer CouchDB
Et par fakta om CouchDB, som du bør vide:
- CouchDB er en JSON dokumentorienteret database skrevet i Erlang.
- Det er en meget samtidig database designet til at være let at replikere, vandret, på tværs af adskillige enheder og være fejltolerant.
- Det er en del af NoSQL-generationen af databaser.
- Det er et open source Apache Foundation-projekt.
- Det giver applikationer mulighed for at gemme JSON-dokumenter via dens RESTful-grænseflade.
- Den gør brug af kort/reducer til at indeksere og forespørge databasen.
Større fordele ved CouchDB
- JSON-dokumenter - Alt gemt i CouchDB koger ned til et JSON-dokument.
- RESTful Interface - Fra oprettelse til replikering til dataindsættelse kan enhver administrations- og dataopgave i CouchDB udføres via HTTP.
- N-Master-replikering - Du kan gøre brug af et ubegrænset antal 'mastere', hvilket giver nogle meget interessante replikeringstopologier.
- Bygget til offline - CouchDB kan replikere til enheder (som Android-telefoner), der kan gå offline og håndtere datasynkronisering for dig, når enheden er online igen.
- Replikeringsfiltre - Du kan filtrere præcist de data, du ønsker at replikere til forskellige noder.
Slå det hele sammen
CouchDB er en database designet til at køre på dagens internet.
CouchDB giver dig mulighed for at skrive en applikation på klientsiden, der taler direkte til sofaen uden behov for et mellemlag på serversiden, hvilket væsentligt reducerer udviklingstiden. Med CouchDB kan du nemt håndtere efterspørgslen ved at tilføje flere replikeringsnoder med lethed. CouchDB giver dig mulighed for at replikere databasen til din klient, og med filtre kan du endda replikere den specifikke brugers data.
At have databasen gemt lokalt betyder, at din klientsideapplikation kan køre med næsten ingen forsinkelse. CouchDB vil håndtere replikeringen til skyen for dig. Dine brugere kunne få adgang til deres fakturaer på deres mobiltelefon og foretage ændringer uden mærkbar forsinkelse, alt imens de var offline. Når en forbindelse er til stede og brugbar, vil CouchDB automatisk replikere disse ændringer til din sky CouchDB.
CouchDB er en database designet til at køre på dagens internet til nutidens desktop-lignende applikationer og de tilsluttede enheder, hvorigennem vi får adgang til internettet.
Trin 1 - Installation af CouchDB
Den nemmeste måde at få CouchDB op at køre på dit system er at gå til CouchOne og downloade en CouchDB-distribution til dit OS -- OSX i mit tilfælde. Download zip'en, udpak den og slip CouchDBX i min applikationsmappe (instruktioner til andre OS'er på CouchOne).
Åbn endelig CouchDBX.
Trin 2 - Velkommen til Futon
Efter at CouchDB er startet, bør du se Futon-kontrolpanelet i CouchDBX-applikationen. Hvis du ikke kan, kan du få adgang til Futon via din browser. Når vi ser på loggen, fortæller CouchDBX os, at CouchDB blev startet på http://127.0.0.1:5984/
(kan være anderledes på dit system). Åbn en browser og gå til http://127.0.0.1:5984/_utils/
og du burde se Futon.
Gennem resten af denne tutorial vil jeg bruge Futon i Firefox. Jeg vil også have Firebug og konsolvisningen åben for at se alle de HTTP-anmodninger, Futon sender bag kulisserne. Dette er nyttigt, da din applikation kan alt hvad Futon gør. Lad os gå videre og oprette en database kaldet mycouchshop
.
CouchDB jQuery Plugin
Futon bruger faktisk et jQuery-plugin til at interagere med CouchDB. Du kan se dette plugin på http://127.0.0.1:5984/_utils/script/jquery.couch.js
(husk på, at din port kan være anderledes). Dette giver dig et godt eksempel på at interagere med CouchDB.
Trin 3 - Brugere i CouchDB
CouchDB er som standard helt åben, hvilket giver hver bruger administratorrettigheder til instansen og alle dens databaser. Dette er fantastisk til udvikling, men selvfølgelig dårligt for produktionen. Lad os gå videre og konfigurere en administrator. Nederst til højre vil du se "Velkommen til Admin Party! Alle er admin! Løs dette".
Gå videre og klik på Løs dette og giv dig selv et brugernavn og en adgangskode. Dette opretter en administratorkonto og giver anonyme brugere adgang til læse- og skrivehandlinger på alle databaserne, men ingen konfigurationsrettigheder.
Mere om brugere
I CouchDB ville det være uklogt at oprette en enkelt superbruger og få denne bruger til at læse/skrive.
Brugere i CouchDB kan være lidt forvirrende at forstå i starten, især hvis du er vant til at oprette en enkelt bruger til hele din applikation og derefter selv administrere brugere i en brugertabel (ikke MySQL-brugertabellen). I CouchDB ville det være uklogt at oprette en enkelt superbruger og få denne bruger til at læse/skrive, for hvis din app er klient-side, vil denne superbrugers legitimationsoplysninger være synligt i din JavaScript-kildekode.
CouchDB har brugeroprettelse og -godkendelse indbygget. Du kan oprette brugere med jQuery-plugin'et ved hjælp af $.couch.signup()
. Disse bliver i det væsentlige brugerne af dit system. Brugere er bare JSON-dokumenter som alt andet, så du kan gemme eventuelle yderligere attributter, du ønsker, som f.eks. e-mail. Du kan derefter bruge grupper i CouchDB til at kontrollere, hvilke dokumenter hver bruger har skriveadgang til. For eksempel kan du oprette en database for den bruger, som de kan skrive til, og derefter tilføje dem til en gruppe med læseadgang til de andre databaser efter behov.
Trin 4 - Oprettelse af et produktdokument
Lad os nu oprette vores første dokument ved hjælp af Futon gennem følgende trin:
- Åbn
mycouchshop
database. - Klik på "Nyt dokument".
- Klik på "Tilføj felt" for at begynde at tilføje data til JSON-dokumentet. Læg mærke til, hvordan et ID er udfyldt på forhånd for dig, jeg vil stærkt anbefale ikke at ændre dette. Tilføj nøgle "navn" med værdien "Nettuts CouchDB Tutorial One".
- Sørg for, at du klikker på fluebenet ud for hver egenskab for at gemme den.
- Klik på "Gem dokument".
Gå et niveau op, tilbage til databasen, og du bør se et dokument med det forrige ID som nøgle og en værdi, der begynder med{rev:
. Dette er det JSON-dokument, du lige har oprettet.
Trin 5 - Opdatering af et dokument
CouchDB er en kun tilføjelsesdatabase -- nye opdateringer føjes til databasen og overskriver ikke den gamle version. Hver ny opdatering af et JSON-dokument med et allerede eksisterende ID tilføjer en ny revision. Dette er, hvad den automatisk indsatte revisionsnøgle betyder. Følg nedenstående trin for at se dette i aktion:
- Visning af indholdet af
mycouchshop
database, skal du klikke på den eneste synlige post. - Tilføj endnu en attribut med nøglen "type" og værdien "produkt".
- Tryk på "Gem dokument".
Når du har trykket på Gem, skulle en ny revisionsnøgle være synlig begyndende med tallet 2. Går et niveau tilbage til mycouchshop
databasevisning, vil du stadig kun se ét dokument, dette er den seneste revision af vores produktdokument.
Revisioner
Mens CouchDB bruger revisioner internt, så prøv ikke at læne dig for meget på det. Revisionerne kan nemt rengøres gennem Futon, og det er ikke designet til at blive brugt som et revisionskontrolsystem. CouchDB bruger revisionerne som en del af sin replikeringsfunktionalitet.
Trin 6 - Oprettelse af et dokument ved hjælp af cURL
Jeg har allerede nævnt, at CouchDB bruger en RESTful-grænseflade, og den ørneøjede læser ville have bemærket, at Futon bruger dette via konsollen i Firebug. Hvis du ikke gjorde det, så lad os bevise dette ved at indsætte et dokument ved hjælp af cURL via terminalen.
Først , lad os oprette et JSON-dokument med nedenstående indhold og gemme det på skrivebordet ved at kalde filen person.json
.
{ "forename": "Gavin", "surname": "Cooper", "type": "person" }
Næste , åbn terminalen og kør cd ~/Desktop/
placere dig i den korrekte mappe og derefter udføre indsættelsen med curl -X POST http://127.0.0.1:5984/mycouchshop/ -d @person.json -H "Content-Type:application/json" . CouchDB skulle have returneret et JSON-dokument, der ligner det nedenfor.
{"ok":true,"id":"c6e2f3d7f8d0c91ce7938e9c0800131c","rev":"1-abadd48a09c270047658dbc38dc8a892"}
Dette er ID og revisionsnummer for det indsatte dokument. CouchDB følger RESTful-konventionen og dermed:
- POST - opretter en ny post
- FÅ - læser optegnelser
- PUT - opdaterer en post
- SLET - sletter en post
Trin 7 - Visning af alle dokumenter
Vi kan yderligere bekræfte vores indlæg ved at se alle dokumenterne i vores mycouchshop
database ved at udføre curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs
.
Trin 8 - Oprettelse af en simpel kortfunktion
Det er ret ubrugeligt at se alle dokumenter rent praktisk. Hvad der ville være mere ideelt er at se alle produktdokumenter. Følg nedenstående trin for at opnå dette:
- I Futon skal du klikke på rullemenuen for visning og vælge "Midlertidig visning".
- Dette er kortreduktionseditoren i Futon. Kopier koden nedenfor til kortfunktionen.
function (doc) { if (doc.type === "product" && doc.name) { emit(doc.name, doc); } }
- Klik på Kør, og du skulle se det enkelte produkt, vi tilføjede tidligere.
- Gå videre og gør denne visning permanent ved at gemme den.
Efter at have oprettet denne enkle kortfunktion, kan vi nu anmode om denne visning og se dens indhold over HTTP ved hjælp af følgende kommando curl -X GET http://127.0.0.1:5984/mycouchshop/_design/products/_view/products .
En lille ting at bemærke er, hvordan vi får dokumentets ID og revision som standard.
Trin 9 - Udførelse af en reduktion
For at udføre en nyttig reduktion, lad os tilføje et andet produkt til vores database og tilføje en prisattribut med værdien 1,75 til vores første produkt.
{ "name": "My Product", "price": 2.99, "type": "product" }
Til vores nye visning vil vi inkludere en reduktion samt et kort. Først skal vi kort definere som nedenfor.
function (doc) { if (doc.type === "product" && doc.price) { emit(doc.id, doc.price); } }
Ovenstående kortfunktion kontrollerer blot, om det indtastede dokument er et produkt, og at det har en pris. Hvis disse betingelser er opfyldt, udsendes produktprisen. Reduceringsfunktionen er nedenfor.
function (keys, prices) { return sum(prices); }
Ovenstående funktion tager priserne og returnerer summen ved hjælp af en af CouchDB's indbyggede reducere-funktioner. Sørg for at markere reduktionsindstillingen øverst til højre i resultattabellen, da du ellers ikke kan se resultaterne af reduktionen. Du skal muligvis lave en hård opdatering på siden for at se muligheden for at reducere