Ho imparato a conoscere i database NoSQL da una settimana.
Comprendo davvero i vantaggi dei database NoSQL e dei molti casi d'uso per cui sono perfetti.
Ma spesso le persone scrivono i loro articoli come se NoSQL potesse sostituire i database relazionali. E c'è il punto in cui non riesco a capire:
I database NoSQL sono (spesso) archivi di valori-chiave.
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 corrisponda a un criterio specifico, in molti casi d'uso. In un database NoSQL hai solo un criterio che puoi cercare in modo efficace: la chiave. I database relazionali sono ottimizzati per cercare efficacemente qualsiasi valore nella riga di dati.
Quindi i database NoSQL non sono davvero una scelta per i dati persistenti che devono essere cercati dal loro contenuto. O ho frainteso qualcosa?
Un esempio:
È necessario archiviare i dati utente per un negozio online.
In un database relazionale memorizzi ogni utente come una riga nella users
tabella, con un ID, il nome, il suo paese, ecc.
In un database NoSQL è necessario 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 è impossibile , ma diventa molto più complicato e credo che non sia efficace se si desidera cercare nei dati delle voci NoSQL.
È possibile creare una chiave per ogni Paese che memorizza le chiavi di ogni utente che vive in questo Paese e ottenere gli utenti di un Paese specifico ottenendo tutte le chiavi che sono depositate nella chiave di questo Paese. Ma penso che questa tecnica renda un set di dati complesso ancora più complesso: è più difficile da implementare e non efficace come interrogare un database SQL. Quindi penso che non sia un modo che useresti in produzione. O è?
Non sono davvero 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 dichiarazioni e rispondere alle mie domande.