NoSQL è stato uno degli argomenti più discussi negli ultimi due mesi. Questo tutorial ti introdurrà a CouchDB, un'implementazione NoSQL e ti insegnerà come iniziare con la piattaforma.
Cos'è NoSQL?
NoSQL è privo di schemi:non è necessario decidere la struttura in anticipo.
NoSQL [non solo SQL ] è un movimento verso archivi di documenti che non utilizzano il modello relazionale. Il fondamentale cambiamento di paradigma è nel modo in cui archiviano i dati. Ad esempio, quando è necessario archiviare i dati su una fattura, in RDBMS è necessario distillare queste informazioni in tabelle e quindi utilizzare un linguaggio lato server per trasformare questi dati in oggetti reali. D'altra parte, in NoSQL, memorizzi semplicemente la fattura. NoSQL è privo di schemi, il che significa che non è necessario progettare le tabelle e la struttura in anticipo:puoi semplicemente iniziare a memorizzare nuovi valori.
Continuando l'esempio di fattura, alcune fatture potrebbero includere un numero di partita IVA, altre no. In un RDBMS, dovresti dire alla tua tabella di accettare prima un numero di partita IVA e poi che potrebbe essere nullo. In NoSQL, tuttavia, puoi semplicemente archiviare fatture con o senza partita IVA:non esiste uno schema. Tieni presente che NoSQL non è un proiettile d'argento. Se i tuoi dati sono veramente relazionali, attenersi al tuo RDBMS sarebbe la scelta giusta.
Interrogazione di database NoSQL
MapReducing presenta vantaggi rispetto alle query SQL perché l'attività di mappatura/riduzione può essere distribuita tra più nodi, cosa non possibile in RDBMS.
I database NoSQL utilizzano map/reduce per interrogare e indicizzare il database. In RDBMS, si esegue una query che unisce più tabelle per creare prima un pool di dati, quindi la query viene eseguita creando un set di risultati, un sottoinsieme dei dati complessivi. In NoSQL, usi map/reduce per creare una "vista" (simile a un set di risultati) questa vista è un sottoinsieme dei dati complessivi.
La mappa essenzialmente estrae i dati e riduce l'aggregazione dei dati. Più familiarità avrai con RDBMS, più difficile sarà afferrare la mappa/ridurre. MapReducing offre vantaggi rispetto alle query SQL perché l'attività di mappatura/riduzione può essere distribuita tra più nodi, cosa non possibile in RDBMS. L'aggiunta di un nuovo record al database non costituisce sempre l'esecuzione completa dell'attività di mappatura/riduzione.
Presentazione di CouchDB
Alcuni fatti su CouchDB che dovresti sapere:
- CouchDB è un database JSON orientato ai documenti scritto in Erlang.
- Si tratta di un database altamente simultaneo progettato per essere facilmente replicabile, orizzontalmente, su numerosi dispositivi ed essere tollerante ai guasti.
- Fa parte della generazione di database NoSQL.
- Si tratta di un progetto di fondazione Apache open source.
- Consente alle applicazioni di archiviare documenti JSON tramite la sua interfaccia RESTful.
- Utilizza map/reduce per indicizzare e interrogare il database.
Principali vantaggi di CouchDB
- Documenti JSON - Tutto ciò che è archiviato in CouchDB si riduce a un documento JSON.
- Interfaccia RESTful - Dalla creazione alla replica all'inserimento dei dati, ogni attività di gestione e dati in CouchDB può essere eseguita tramite HTTP.
- Replica N-Master - Puoi utilizzare un numero illimitato di "master", creando alcune topologie di replica molto interessanti.
- Creato per offline - CouchDB può replicarsi su dispositivi (come telefoni Android) che possono andare offline e gestire la sincronizzazione dei dati per te quando il dispositivo è di nuovo online.
- Filtri di replica - Puoi filtrare con precisione i dati che desideri replicare su nodi diversi.
Mettere tutto insieme
CouchDB è un database progettato per essere eseguito su Internet di oggi.
CouchDB consente di scrivere un'applicazione lato client che comunica direttamente con Couch senza la necessità di un livello intermedio lato server, riducendo notevolmente i tempi di sviluppo. Con CouchDB, puoi gestire facilmente la domanda aggiungendo facilmente più nodi di replica. CouchDB ti consente di replicare il database sul tuo client e con i filtri potresti persino replicare i dati di quell'utente specifico.
Avere il database archiviato localmente significa che l'applicazione lato client può essere eseguita quasi senza latenza. CouchDB gestirà la replica nel cloud per te. I tuoi utenti possono accedere alle loro fatture sul proprio telefono cellulare e apportare modifiche senza una latenza evidente, il tutto mentre sono offline. Quando una connessione è presente e utilizzabile, CouchDB replicherà automaticamente tali modifiche sul tuo cloud CouchDB.
CouchDB è un database progettato per funzionare su Internet di oggi per le applicazioni desktop di oggi e i dispositivi connessi attraverso i quali accediamo a Internet.
Passaggio 1:installazione di CouchDB
Il modo più semplice per far funzionare CouchDB sul tuo sistema è andare su CouchOne e scaricare una distribuzione CouchDB per il tuo sistema operativo, nel mio caso OSX. Scarica lo zip, estrailo e rilascia CouchDBX nella cartella delle mie applicazioni (istruzioni per altri sistemi operativi su CouchOne).
Infine, apri CouchDBX.
Passaggio 2:benvenuto in Futon
Dopo l'avvio di CouchDB, dovresti vedere il pannello di controllo Futon nell'applicazione CouchDBX. Se non puoi, puoi accedere a Futon tramite il tuo browser. Guardando il registro, CouchDBX ci dice che CouchDB è stato avviato su http://127.0.0.1:5984/
(potrebbe essere diverso sul tuo sistema). Apri un browser e vai su http://127.0.0.1:5984/_utils/
e dovresti vedere Futon.
Per tutto il resto di questo tutorial userò Futon in Firefox. Avrò anche Firebug e la vista della console aperti per vedere tutte le richieste HTTP che Futon sta inviando dietro le quinte. Questo è utile in quanto la tua applicazione può fare tutto ciò che sta facendo Futon. Andiamo avanti e creiamo un database chiamato mycouchshop
.
Plugin jQuery di CouchDB
Futon sta effettivamente utilizzando un plugin jQuery per interagire con CouchDB. Puoi visualizzare quel plugin su http://127.0.0.1:5984/_utils/script/jquery.couch.js
(tieni presente che la tua porta potrebbe essere diversa). Questo ti offre un ottimo esempio di interazione con CouchDB.
Passaggio 3:utenti in CouchDB
CouchDB, per impostazione predefinita, è completamente aperto, fornendo a ogni utente i diritti di amministratore sull'istanza e su tutti i suoi database. Questo è ottimo per lo sviluppo ma ovviamente negativo per la produzione. Andiamo avanti e configuriamo un amministratore. In basso a destra, vedrai "Benvenuto in Admin Party! Tutti sono amministratori! Risolvi questo problema".
Vai avanti e fai clic su correggilo e fornisci un nome utente e una password. Questo crea un account amministratore e fornisce agli utenti anonimi l'accesso per leggere e scrivere operazioni su tutti i database, ma nessun privilegio di configurazione.
Ulteriori informazioni sugli utenti
In CouchDB non sarebbe saggio creare un singolo super utente e fare in modo che quell'utente esegua tutte le operazioni di lettura/scrittura.
Gli utenti in CouchDB possono creare un po' di confusione da comprendere inizialmente, specialmente se sei abituato a creare un singolo utente per l'intera applicazione e quindi a gestire gli utenti tu stesso all'interno di una tabella degli utenti (non la tabella degli utenti di MySQL). In CouchDB, non sarebbe saggio creare un singolo super utente e fare in modo che quell'utente esegua tutte le operazioni di lettura/scrittura, perché se la tua app è lato client, le credenziali di questo super utente saranno in bella vista nel tuo codice sorgente JavaScript.
CouchDB include la creazione e l'autenticazione degli utenti. Puoi creare utenti con il plugin jQuery usando $.couch.signup()
. Questi diventano essenzialmente gli utenti del tuo sistema. Gli utenti sono solo documenti JSON come tutto il resto, quindi puoi archiviare tutti gli attributi aggiuntivi che desideri, ad esempio l'e-mail. È quindi possibile utilizzare i gruppi all'interno di CouchDB per controllare a quali documenti ogni utente ha accesso in scrittura. Ad esempio, puoi creare un database per quell'utente in cui può scrivere e quindi aggiungerlo a un gruppo con accesso in lettura agli altri database come richiesto.
Passaggio 4:creazione di un documento di prodotto
Ora creiamo il nostro primo documento utilizzando Futon attraverso i seguenti passaggi:
- Apri il
mycouchshop
banca dati. - Fai clic su "Nuovo documento".
- Fai clic su "Aggiungi campo" per iniziare ad aggiungere dati al documento JSON. Nota come un ID è precompilato per te, ti consiglio vivamente di non cambiarlo. Aggiungi la chiave "nome" con il valore di "Nettuts CouchDB Tutorial One".
- Assicurati di fare clic sul segno di spunta accanto a ciascun attributo per salvarlo.
- Fai clic su "Salva documento".
Sali di un livello, torna al database e dovresti vedere un documento elencato con l'ID precedente come chiave e un valore che inizia con {rev:
. Questo è il documento JSON che hai appena creato.
Passaggio 5:aggiornamento di un documento
CouchDB è un database di sola aggiunta:i nuovi aggiornamenti vengono aggiunti al database e non sovrascrivono la vecchia versione. Ogni nuovo aggiornamento a un documento JSON con un ID preesistente aggiungerà una nuova revisione. Questo è il significato della chiave di revisione inserita automaticamente. Segui i passaggi seguenti per vederlo in azione:
- Visualizzare i contenuti di
mycouchshop
database, fai clic sull'unico record visibile. - Aggiungi un altro attributo con la chiave "tipo" e il valore "prodotto".
- Premi "Salva documento".
Dopo aver premuto Salva, dovrebbe essere visibile una nuova chiave di revisione che inizia con il numero 2. Tornando di un livello al mycouchshop
vista database, vedrai ancora un solo documento, questa è l'ultima revisione del nostro documento di prodotto.
Revisioni
Sebbene CouchDB utilizzi le revisioni internamente, cerca di non appoggiarti troppo. Le revisioni possono essere pulite tramite Futon abbastanza facilmente e non è progettato per essere utilizzato come sistema di controllo delle revisioni. CouchDB utilizza le revisioni come parte della sua funzionalità di replica.
Passaggio 6:creazione di un documento utilizzando cURL
Ho già menzionato che CouchDB utilizza un'interfaccia RESTful e il lettore con gli occhi d'aquila avrebbe notato Futon che lo utilizzava tramite la console in Firebug. In caso contrario, dimostriamolo inserendo un documento utilizzando cURL tramite il Terminale.
Prima , creiamo un documento JSON con i seguenti contenuti e salviamolo sul desktop chiamando il file person.json
.
{ "forename": "Gavin", "surname": "Cooper", "type": "person" }
Avanti , apri il terminale ed esegui cd ~/Desktop/
inserendoti nella directory corretta e quindi esegui l'inserimento con curl -X POST http://127.0.0.1:5984/mycouchshop/ -d @person.json -H "Content-Type: application/json"
. CouchDB avrebbe dovuto restituire un documento JSON simile a quello riportato di seguito.
{"ok":true,"id":"c6e2f3d7f8d0c91ce7938e9c0800131c","rev":"1-abadd48a09c270047658dbc38dc8a892"}
Questo è l'ID e il numero di revisione del documento inserito. CouchDB segue la convenzione RESTful e quindi:
- POST - crea un nuovo record
- OTTIENI - legge i record
- METTI - aggiorna un record
- ELIMINA - cancella un record
Passaggio 7:visualizzazione di tutti i documenti
Possiamo verificare ulteriormente il nostro inserto visionando tutti i documenti nel nostro mycouchshop
database eseguendo curl -X GET http://127.0.0.1:5984/mycouchshop/_all_docs
.
Passaggio 8:creazione di una semplice funzione mappa
Visualizzare tutti i documenti è abbastanza inutile in termini pratici. L'ideale sarebbe visualizzare tutti i documenti del prodotto. Segui i passaggi seguenti per raggiungere questo obiettivo:
- All'interno di Futon, fai clic sul menu a discesa della vista e seleziona "Vista temporanea".
- Questo è l'editor di riduzione della mappa all'interno di Futon. Copia il codice qui sotto nella funzione map.
function (doc) { if (doc.type === "product" && doc.name) { emit(doc.name, doc); } }
- Fai clic su Esegui e dovresti vedere il singolo prodotto che abbiamo aggiunto in precedenza.
- Vai avanti e rendi permanente questa visualizzazione salvandola.
Dopo aver creato questa semplice funzione mappa, ora possiamo richiedere questa vista e vederne il contenuto su HTTP usando il seguente comando curl -X GET http://127.0.0.1:5984/mycouchshop/_design/products/_view/products
.
Una piccola cosa da notare è come otteniamo l'ID e la revisione del documento per impostazione predefinita.
Passaggio 9:esecuzione di una riduzione
Per eseguire una riduzione utile, aggiungiamo un altro prodotto al nostro database e aggiungiamo un attributo prezzo con il valore di 1,75 al nostro primo prodotto.
{ "name": "My Product", "price": 2.99, "type": "product" }
Per la nostra nuova vista, includeremo una riduzione e una mappa. Per prima cosa, dobbiamo mappare definita come di seguito.
function (doc) { if (doc.type === "product" && doc.price) { emit(doc.id, doc.price); } }
La funzione della mappa sopra controlla semplicemente per vedere se il documento inserito è un prodotto e che ha un prezzo. Se queste condizioni sono soddisfatte, viene emesso il prezzo dei prodotti. La funzione di riduzione è sotto.
function (keys, prices) { return sum(prices); }
La funzione precedente prende i prezzi e restituisce la somma utilizzando una delle funzioni di riduzione integrate di CouchDB. Assicurati di selezionare l'opzione di riduzione in alto a destra nella tabella dei risultati, altrimenti potresti non essere in grado di vedere i risultati della riduzione. Potrebbe essere necessario eseguire un aggiornamento completo della pagina per visualizzare l'opzione di riduzione