Ho imparato a conoscere NoSQL Databases per una settimana.
Capisco davvero i vantaggi dei database NoSQL e i molti casi d'uso per cui sono ideali.
Ma spesso le persone scrivono i loro articoli come se NoSQL potesse sostituire Database relazionali. E c'è il punto che non riesco a capire:
NoSQL Databases are (often) key-value stores.
Ovviamente è possibile archiviare tutto in un archivio di valori-chiave (codificando i dati in JSON, XML, qualunque cosa), ma il problema che vedo è che è necessario ottenere una quantità di dati che corrisponde a un criterio specifico, in molti casi d'uso. In un database NoSQL hai un solo criterio che puoi cercare in modo efficace: la chiave. I database relazionali sono ottimizzati per cercare in modo efficace qualsiasi valore nella riga di dati.
Quindi i database NoSQL non sono realmente una scelta per i dati persistenti che devono essere ricercati dal loro contenuto. O ho frainteso qualcosa?
Un esempio:
Devi memorizzare i dati utente per un webshop.
In un database relazionale, ogni utente viene archiviato come una riga nella tabella users
, con un ID, il nome, il suo paese, ecc.
In un database NoSQL dovresti memorizzare ogni utente con il suo ID come chiave e tutti i suoi dati (codificati in JSON, ecc.) come valore.
Quindi se hai bisogno di ottenere tutti gli utenti da un paese specifico (per qualche motivo i ragazzi del marketing devono sapere qualcosa su di loro), è facile farlo nel Database relazionale, ma non è molto efficace nel Database NoSQL, perché devi ottenere ogni utente, analizzare tutti i dati e filtrare.
Non dico che sia impossibile , ma diventa molto più complicato e non credo che sia efficace se vuoi cercare nei dati delle voci NoSQL.
Potresti creare una chiave per ogni paese che memorizza le chiavi di ogni utente che vive in questo paese e ottenere gli utenti di un determinato paese ottenendo tutte le chiavi depositate nella chiave per questo paese. Tuttavia, ritengo che questa tecnica renda un set di dati complesso ancora più complesso: è più difficile da implementare e non efficace quanto l'interrogazione di un database SQL. Quindi penso che non sia un modo che useresti in produzione. O è?
Non sono sicuro di aver frainteso qualcosa o di aver trascurato alcuni concetti o best practice per gestire tali casi d'uso. Forse potresti correggere le mie affermazioni e rispondere alle mie domande.