Model NoSQL

Model NoSQL

El principal problema d'un model relacional és la distribució d'una BBDD en diferents servidors per raó de mida i rendiment (clústers), i que pugui ser accedida com una sola.

El funcionament en clústers utilitza dues idees:

  • La replicació: repliquem les dades en master-slave o peer-to-peer.
  • El sharding: situem diferents parts de les dades en diferents servidors.

Les BBDD relacionals no estan dissenyades per a funcionar eficientment en clústers, aquesta és la raó principal per a migrar a NoSQL. La segona és que es veu com una una forma de millorar la productivitat en el desenvolupament d'aplicacions, ja que la interacció amb les dades és més còmoda.

Un model agregat és una col·lecció de dades amb les quals interactuem com a una unitat. Els models agregats permeten treballar més fàcilment amb clústers, agafant l'agregació com a unitat de replicació i sharding. A més, l'agregació també facilita la feina dels desenvolupadors, perquè la manipulació de dades es produeix molt sovint a nivell de agregat.

Els tipus principals de BBDD NoSQL són els models agregats (key-value, document i column) i els de graf.

Key-Value

És la forma d'agregació. Contenen col·leccions de parelles clau-valor, com els diccionaris o les taules hash. La clau és l'identificador i les dades poden ser un objecte JSON, un blob binari o un altre tipus.

KeyValue
"user:1"{ "name": "Alice", "age": 25 }
"user:2"{ "name": "Bob", "age": 30 }

S'utilitzen per a fer caching, gestió de sessions o mètriques senzilles. Són molt fàcils d'implementar, eficients i escalables. Però no permeten fer queries gaire complexes.

Exemples populars: Redis, Amazon DynamoDB (mode key-value).

Document

Les dades s'organitzen el documents de format JSON, BSON o XML. Tenen una estructura jeràrquica, que els atorga flexibilitat. Un document és una unitat atòmica que pot ser consultada, modificada o esborrada. És una entitat que freqüentment té les dades relacionades al mateix document.

Per exemple, aquest seria un usuari amb les ordres associades. No cal predefinir les seves columnes, ni fer queries per trobar les ordres de l'usuari:

{ "_id": "user:1", "name": "Alice", "age": 25, "orders": [ { "orderId": "A100", "amount": 50.5 }, { "orderId": "A101", "amount": 25.0 } ] }

Les queries permeten fer filtratge, agregació o indexació. Per exemple:

  • Trobar usuaris més grans de 20: { "age": { "$gt": 20 } }
  • Obtenir una certa ordre: { "orders.orderId": "A100" }

Aquest tipus de model permet esquemes flexibles, dades jeràrquiques i també camps indexables per a fer queries més ràpides. Són molt flexibles per no tenir esquema, però l'organització pot portar duplicacions o la impossibilitat de fer relacions (les foreign keys relacionals).

Es poden utilitzar a gestors de continguts, llocs d'e-commerce o per fer event logging.

Exemples populars: MongoDB, Couchbase, Amazon DocumentDB.

Column

Aquest model organitza les dades en columnes i files, però al contrari que el model relacional, les columnes s'agrupen en famílies. Cada familia conté columnes, el que permet optimitzar els patrons d'accés. I cada fila té una clau única.

Exemple:

Row KeyPersonalInfoOrderInfo
1{name: "Alice", age: 25}{order1: 50.5}
2{name: "Bob", age: 30}{order1: 75.0, order2: 25.0}

S'utilitzen per a emmagatzemar esdeveniments amb timestamps o datasets molt grans amb dades disperses. Permeten operacions d'escriptura intensives, però el modelatge i les queries són difícils d'implementar.

Exemples populars: Apache Cassandra, HBase.

Comparativa

FuncionalitatModel Key-ValueModel DocumentModel Column-Family
EstructuraParelles Key-ValueDocuments JSON/BSON/XMLFiles agrupades en families
ConsultesNomés per clauPer camp, consultes niadesPer clau de fila, rang de columna
Casos d'úsCaching, cerques ràpidesEsquemes flexibles, dades jeràrquiquesAnàlisi de dades, series temporals
Flexibilitat d'esquemaSenzillaAltaModerada

Referències