NoSQL is de afgelopen maanden een van de meest besproken onderwerpen geweest. Deze tutorial laat je kennismaken met CouchDB, een NoSQL-implementatie, en leert je hoe je aan de slag kunt met het platform.
Wat is NoSQL?
NoSQL is schemavrij -- u hoeft de structuur niet vooraf te bepalen.
NoSQL [niet alleen SQL ] is een beweging naar document stores die geen gebruik maken van het relationele model. De fundamentele paradigmaverschuiving zit in de manier waarop ze gegevens opslaan. Als u bijvoorbeeld gegevens over een factuur moet opslaan, moet u in RDBMS deze informatie in tabellen destilleren en vervolgens een servertaal gebruiken om deze gegevens weer om te zetten in echte objecten. Aan de andere kant sla je in NoSQL gewoon de factuur op. NoSQL is schemavrij, wat betekent dat u uw tabellen niet van tevoren hoeft te ontwerpen en te structureren -- u kunt gewoon beginnen met het opslaan van nieuwe waarden.
Om verder te gaan met het factuurvoorbeeld, kunnen sommige facturen een btw-nummer bevatten, andere niet. In een RDBMS moet u uw tafel vertellen dat hij eerst een btw-nummer moet accepteren en dat het dan mogelijk nul is. In NoSQL kun je echter gewoon facturen opslaan met of zonder btw-nummer -- er is geen schema. Houd er rekening mee dat NoSQL geen wondermiddel is. Als uw gegevens echt relationeel zijn, is het de juiste keuze om bij uw RDBMS te blijven.
NoSQL-databases opvragen
MapReducing heeft voordelen ten opzichte van SQL-query's omdat de map/reduce-taak kan worden gedistribueerd over meerdere knooppunten, iets wat niet mogelijk is in RDBMS.
NoSQL-databases gebruiken map/reduce om de database te doorzoeken en te indexeren. In RDBMS voert u een query uit die meerdere tabellen samenvoegt om eerst een gegevenspool te maken en vervolgens wordt de query uitgevoerd om een resultatenset te maken, een subset van de algemene gegevens. In NoSQL gebruik je map/reduce om een 'weergave' te maken (vergelijkbaar met een resultatenset). Deze weergave is een subset van de algemene gegevens.
Kaart is in wezen het extraheren van gegevens en het verminderen van gegevensaggregatie. Hoe meer u bekend bent met RDBMS, hoe moeilijker het is om de kaart te begrijpen/verkleinen. MapReducing-voordelen ten opzichte van SQL-query's omdat de taak voor het toewijzen/verkleinen kan worden verdeeld over meerdere knooppunten, iets wat niet mogelijk is in RDBMS. Het toevoegen van een nieuw record aan de database betekent niet altijd dat de kaart/verkleiningstaak volledig opnieuw wordt uitgevoerd.
Introductie van CouchDB
Een paar feiten over CouchDB die u moet weten:
- CouchDB is een JSON document-georiënteerde database geschreven in Erlang.
- Het is een zeer gelijktijdige database die is ontworpen om gemakkelijk horizontaal, over meerdere apparaten te kunnen worden gerepliceerd en fouttolerant te zijn.
- Het maakt deel uit van de NoSQL-generatie van databases.
- Het is een open source Apache Foundation-project.
- Het stelt applicaties in staat om JSON-documenten op te slaan via de RESTful-interface.
- Het maakt gebruik van map/reduce om de database te indexeren en te doorzoeken.
Belangrijke voordelen van CouchDB
- JSON-documenten - Alles opgeslagen in CouchDB komt neer op een JSON-document.
- RESTful-interface - Van creatie tot replicatie tot gegevensinvoer, elke beheer- en gegevenstaak in CouchDB kan via HTTP worden gedaan.
- N-Master-replicatie - U kunt gebruik maken van een onbeperkt aantal 'masters', wat zorgt voor een aantal zeer interessante replicatietopologieën.
- Gebouwd voor offline - CouchDB kan repliceren naar apparaten (zoals Android-telefoons) die offline kunnen gaan en gegevenssynchronisatie voor je kunnen regelen wanneer het apparaat weer online is.
- Replicatiefilters - U kunt precies de gegevens filteren die u naar verschillende knooppunten wilt repliceren.
Alles samenvoegen
CouchDB is een database die is ontworpen om op het internet van vandaag te draaien.
CouchDB stelt je in staat om een client-side applicatie te schrijven die rechtstreeks met de Couch praat zonder dat je een server-side middenlaag nodig hebt, waardoor de ontwikkeltijd aanzienlijk wordt verkort. Met CouchDB kunt u eenvoudig de vraag aan door eenvoudig meer replicatieknooppunten toe te voegen. Met CouchDB kunt u de database naar uw klant repliceren en met filters kunt u zelfs de gegevens van die specifieke gebruiker repliceren.
Als de database lokaal is opgeslagen, kan uw applicatie aan de clientzijde bijna zonder vertraging worden uitgevoerd. CouchDB regelt de replicatie naar de cloud voor u. Uw gebruikers hebben toegang tot hun facturen op hun mobiele telefoon en kunnen wijzigingen aanbrengen zonder merkbare latentie, terwijl ze offline zijn. Wanneer er een verbinding aanwezig en bruikbaar is, repliceert CouchDB die wijzigingen automatisch naar uw cloud CouchDB.
CouchDB is een database die is ontworpen om op het internet van vandaag te draaien voor de hedendaagse desktop-achtige applicaties en de aangesloten apparaten waarmee we toegang hebben tot internet.
Stap 1 - CouchDB installeren
De gemakkelijkste manier om CouchDB op uw systeem te laten werken, is door naar CouchOne te gaan en een CouchDB-distributie voor uw besturingssysteem te downloaden - OSX in mijn geval. Download de zip, pak deze uit en zet CouchDBX in mijn applicatiemap (instructies voor andere besturingssystemen op CouchOne).
Open ten slotte CouchDBX.
Stap 2 - Welkom bij Futon
Nadat CouchDB is gestart, zou u het Futon-configuratiescherm in de CouchDBX-toepassing moeten zien. Als je dat niet kunt, heb je toegang tot Futon via je browser. Als we naar het logboek kijken, vertelt CouchDBX ons dat CouchDB is gestart op http://127.0.0.1:5984/
(kan op uw systeem anders zijn). Open een browser en ga naar http://127.0.0.1:5984/_utils/
en je zou Futon eens moeten zien.
Gedurende de rest van deze tutorial zal ik Futon in Firefox gebruiken. Ik heb ook Firebug en de consoleweergave open om alle HTTP-verzoeken te zien die Futon achter de schermen verzendt. Dit is handig omdat uw toepassing alles kan wat Futon doet. Laten we doorgaan en een database maken met de naam mycouchshop
.
CouchDB jQuery-plug-in
Futon gebruikt eigenlijk een jQuery-plug-in om te communiceren met CouchDB. Je kunt die plug-in bekijken op http://127.0.0.1:5984/_utils/script/jquery.couch.js
(houd er rekening mee dat uw poort anders kan zijn). Dit geeft je een goed voorbeeld van interactie met CouchDB.
Stap 3 - Gebruikers in CouchDB
CouchDB is standaard volledig open en geeft elke gebruiker beheerdersrechten voor de instantie en al zijn databases. Dit is geweldig voor de ontwikkeling, maar uiteraard slecht voor de productie. Laten we doorgaan en een beheerder instellen. Rechtsonder ziet u "Welkom bij Admin Party! Iedereen is beheerder! Los dit op".
Ga je gang en klik op dit oplossen en geef jezelf een gebruikersnaam en wachtwoord. Dit maakt een beheerdersaccount aan en geeft anonieme gebruikers toegang tot lees- en schrijfbewerkingen op alle databases, maar geen configuratierechten.
Meer over gebruikers
In CouchDB zou het onverstandig zijn om één supergebruiker aan te maken en die gebruiker al het lezen/schrijven te laten doen.
Gebruikers in CouchDB kunnen in het begin een beetje verwarrend zijn om te begrijpen, vooral als je gewend bent om een enkele gebruiker voor je hele applicatie aan te maken en vervolgens zelf gebruikers te beheren binnen een gebruikerstabel (niet de MySQL-gebruikerstabel). In CouchDB zou het onverstandig zijn om een enkele supergebruiker aan te maken en die gebruiker al het lezen/schrijven te laten doen, want als uw app aan de clientzijde is, zullen de inloggegevens van deze supergebruiker duidelijk zichtbaar zijn in uw JavaScript-broncode.
CouchDB heeft het maken van gebruikers en authenticatie ingebakken. U kunt gebruikers maken met de jQuery-plug-in met behulp van $.couch.signup()
. Deze worden in wezen de gebruikers van uw systeem. Gebruikers zijn gewoon JSON-documenten zoals al het andere, dus u kunt eventuele aanvullende kenmerken opslaan, zoals bijvoorbeeld e-mail. U kunt vervolgens groepen binnen CouchDB gebruiken om te bepalen tot welke documenten elke gebruiker schrijftoegang heeft. U kunt bijvoorbeeld een database voor die gebruiker maken waarnaar ze kunnen schrijven en deze vervolgens toevoegen aan een groep met leestoegang tot de andere databases zoals vereist.
Stap 4 - Een productdocument maken
Laten we nu ons eerste document maken met Futon door de volgende stappen te volgen:
- Open de
mycouchshop
database. - Klik op "Nieuw document".
- Klik op "Veld toevoegen" om te beginnen met het toevoegen van gegevens aan het JSON-document. Merk op hoe een ID vooraf voor u is ingevuld, ik zou u ten zeerste aanraden dit niet te wijzigen. Voeg sleutel "naam" toe met de waarde van "Nettuts CouchDB Tutorial One".
- Zorg ervoor dat u op het vinkje naast elk kenmerk klikt om het op te slaan.
- Klik op "Document opslaan".
Ga een niveau omhoog, terug naar de database en je zou één document moeten zien met de vorige ID als sleutel en een waarde die begint met{rev:
. Dit is het JSON-document dat u zojuist hebt gemaakt.
Stap 5 - Een document bijwerken
CouchDB is een database die alleen kan worden toegevoegd:nieuwe updates worden aan de database toegevoegd en overschrijven de oude versie niet. Elke nieuwe update van een JSON-document met een reeds bestaande ID voegt een nieuwe revisie toe. Dit is wat de automatisch ingevoegde revisiesleutel betekent. Volg de onderstaande stappen om dit in actie te zien:
- De inhoud van de
mycouchshop
bekijken database, klik op het enige zichtbare record. - Voeg nog een kenmerk toe met de sleutel "type" en de waarde "product".
- Klik op "Document opslaan".
Nadat je op Opslaan hebt gedrukt, zou een nieuwe revisiesleutel zichtbaar moeten zijn, beginnend met het cijfer 2. Een niveau teruggaan naar de mycouchshop
databaseweergave, ziet u nog steeds slechts één document, dit is de laatste revisie van ons productdocument.
Revisies
Terwijl CouchDB intern revisies gebruikt, probeer er niet te veel op te leunen. De revisies kunnen vrij eenvoudig via Futon worden schoongemaakt en het is niet ontworpen om te worden gebruikt als revisiecontrolesysteem. CouchDB gebruikt de revisies als onderdeel van de replicatiefunctionaliteit.
Stap 6 - Een document maken met cURL
Ik heb al vermeld dat CouchDB een REST-interface gebruikt en de lezer met arendsogen zou hebben gemerkt dat Futon dit gebruikt via de console in Firebug. Als je dat niet hebt gedaan, laten we dit dan bewijzen door een document in te voegen met cURL via de Terminal.
Eerste , laten we een JSON-document maken met de onderstaande inhoud en dit opslaan op de desktop door het bestand person.json
aan te roepen .
{ "forename": "Gavin", "surname": "Cooper", "type": "person" }
Volgende , open de terminal en voer cd ~/Desktop/
. uit u in de juiste map plaatsen en vervolgens de invoeging uitvoeren met curl -X POST http://127.0.0.1:5984/mycouchshop/ -d @person.json -H "Content-Type: application/json"
. CouchDB zou een JSON-document moeten hebben geretourneerd dat lijkt op het onderstaande.
{"ok":true,"id":"c6e2f3d7f8d0c91ce7938e9c0800131c","rev":"1-abadd48a09c270047658dbc38dc8a892"}
Dit is het ID en revisienummer van het ingevoegde document. CouchDB volgt de RESTful-conventie en dus:
- POST - maakt een nieuw record
- KRIJGEN - leest records
- PUT - werkt een record bij
- VERWIJDEREN - verwijdert een record
Stap 7 - Alle documenten bekijken
We kunnen onze bijlage verder verifiëren door alle documenten in onze mycouchshop
te bekijken database door curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs
uit te voeren .
Stap 8 - Een eenvoudige kaartfunctie maken
Het bekijken van alle documenten is in de praktijk vrij nutteloos. Ideaal zou zijn om alle productdocumenten te bekijken. Volg de onderstaande stappen om dit te bereiken:
- Klik in Futon op de vervolgkeuzelijst voor weergave en selecteer "Tijdelijke weergave".
- Dit is de editor voor het verkleinen van kaarten in Futon. Kopieer de onderstaande code in de kaartfunctie.
function (doc) { if (doc.type === "product" && doc.name) { emit(doc.name, doc); } }
- Klik op uitvoeren en u zou het enkele product moeten zien dat we eerder hebben toegevoegd.
- Ga je gang en maak deze weergave permanent door hem op te slaan.
Nadat we deze eenvoudige kaartfunctie hebben gemaakt, kunnen we deze weergave nu opvragen en de inhoud ervan bekijken via HTTP met het volgende commando curl -X GET http://127.0.0.1:5984/mycouchshop/_design/products/_view/products
.
Een klein ding om op te merken is hoe we standaard de ID en revisie van het document krijgen.
Stap 9 - Een verkleining uitvoeren
Laten we, om een nuttige reductie uit te voeren, nog een product aan onze database toevoegen en een prijskenmerk met de waarde 1,75 toevoegen aan ons eerste product.
{ "name": "My Product", "price": 2.99, "type": "product" }
Voor onze nieuwe weergave zullen we zowel een verkleining als een kaart opnemen. Eerst moeten we de kaart definiëren zoals hieronder.
function (doc) { if (doc.type === "product" && doc.price) { emit(doc.id, doc.price); } }
De bovenstaande kaartfunctie controleert eenvoudig of het ingevoerde document een product is en of het een prijs heeft. Als aan deze voorwaarden is voldaan, wordt de productprijs uitgegeven. De reduceerfunctie staat hieronder.
function (keys, prices) { return sum(prices); }
De bovenstaande functie neemt de prijzen en retourneert de som met behulp van een van de ingebouwde reductiefuncties van CouchDB. Zorg ervoor dat u de verkleinoptie in de rechterbovenhoek van de resultatentabel aanvinkt, omdat u anders de resultaten van de verkleining misschien niet kunt zien. Mogelijk moet u een harde verversing van de pagina uitvoeren om de verkleiningsoptie te zien