Non si può mai parlare del cosiddetto database "NoSQL" senza portare il teorema CAP (Coerenza, Disponibilità, Partizione: sceglierne due). Se devi scegliere, diciamo, tra MongoDB (Partizione, Coerenza) e CouchDB (Disponibilità, Partizione), il primo che devi pensare è "Ho bisogno di dati corretti o ho bisogno di accedere tutto il tempo?".
Questi nuovi database sono stati creati per essere partizionati. Ma cosa succede se non lo faccio ? Cosa succede se penso che sia abbastanza bello avere una chiave / valore, colonna, documento, qualunque database invece di uno relazionale, e creare solo un'istanza del server e non condividerla mai? In tal caso, non avrei disponibilità e coerenza? MongoDB non avrebbe bisogno di replicare nulla, quindi sarebbe disponibile. E CouchDB avrebbe solo una fonte di dati, quindi sarebbe abbastanza coerente.
Quindi ciò significherebbe che, in tal caso, MongoDB e CouchDB avrebbero poca differenza nel caso di utilizzo? Bene, tranne ovviamente le prestazioni, API e altri, ma sarebbe più come scegliere tra PostgreSQL e MySQL che avere due serie di requisiti fondamentalmente diversi.
Sono qui? Posso cambiare un database AP o CP in uno AC non creando più di un'istanza? O c'è qualcosa che mi manca?
Facciamo la domanda al contrario. Cosa succede se prendo un database relazionale, diciamo MySQL e lo metto in una configurazione master / slave. Non utilizzo transazioni ACID Se richiedo che qualsiasi scrittura sia sincronizzata immediatamente con lo slave, non lo trasformerei in un database CP? E se lo sincronizzassi ad intervalli predefiniti, e non importa se un client legge dati non aggiornati da uno slave. Non lo renderebbe un database AP? Ciò non significherebbe che se rinuncio alla conformità ACID posso ancora utilizzare il modello relazionale per un database con partizionamento?
In sostanza: la scalabilità di ciò a cui sei pronto a rinunciare nel teorema CAP, più del modello di dati sottostante? Avere colonna, documento, valore chiave, qualunque cosa dia una spinta alla scalabilità rispetto a un modello relazionale? Potremmo progettare un database relazionale progettato da zero per la tolleranza della partizione? (Forse esiste già). Potremmo rendere ACID conforme al database NoSQL?
Siamo spiacenti, è un sacco di domande, ma ho letto molto sul database NoSQL di recente e mi sembra che il più grande vantaggio di usarli è che si adattano meglio alla "forma" dei tuoi dati, piuttosto che alla semplice partizione, CAP e rinunciare alla conformità ACID. Dopotutto, non tutti hanno così tanti dati che devono essere partizionati. C'è un vantaggio in termini di prestazioni / scalabilità nel non utilizzare il modello relazionale prima ancora di pensare al partizionamento dei miei dati?