Baze de date: SQL, NoSQL, si alegerea intre schema si schemaless

SQL si NoSQL nu sunt adversare, ci unelte pentru probleme diferite. Bazele relationale ofera consistenta si integritate, cele non-relationale ofera scalabilitate si flexibilitate. Alegerea corecta tine de natura datelor, nu de moda.

Ce e o bază de date?

O bază de date e un sistem organizat de stocare si gestionare a datelor. Sistemele de gestionare a bazelor de date (DBMS) oferă operatii sigure (ACID), căutare eficientă, si acces concurent.

Baze de date relaționale (SQL)

Principiul de bază

Datele sunt organizate în tabele (relații) cu rânduri (tupluri) si coloane (atribute). Relațiile între tabele se fac prin chei externe (foreign keys).

ACID — garanțiile unei baze relaționale

| Proprietate | Ce înseamnă | |---|---| | Atomicitate | O tranzacție se execută complet sau deloc | | Consistență | Datele respectă toate regulile și constrângerile | | Izolare | Tranzacțiile concurente nu se afectează între ele | | Durabilitate | Odată comisă, o tranzacție persistă chiar și la căderea sistemului |

Normalizarea

Procesul de organizare a datelor pentru a elimina redundanța:

1NF: Fiecare coloană conține o singură valoare atomică 2NF: 1NF + fiecare coloană ne-cheie depinde de întreaga cheie primară 3NF: 2NF + fiecare coloană ne-cheie depinde doar de cheia primară

De ce normalizăm: Evităm anomalii la inserare, ștergere, actualizare.

Când alegi SQL

  • Datele au relații clare (clienți → comenzi → produse)
  • Ai nevoie de integritate și consistență strictă
  • Tranzacțiile implică mai multe tabele
  • Ai nevoie de interogări complexe cu JOIN-uri
  • Exemple: banking, ERP, sisteme de rezervări

Baze de date NoSQL

NoSQL = "Not Only SQL". Cuprinde mai multe paradigme diferite.

Tipuri de baze NoSQL

| Tip | Exemple | Cel mai bun pentru | |---|---|---| | Document | MongoDB, CouchDB | Date JSON flexibile, cataloguri | | Key-Value | Redis, DynamoDB, Riak | Cache, sesiuni, configurări | | Column-family | Cassandra, HBase | Date la scară mare, timp real | | Graf | Neo4j, ArangoDB | Relații complexe, recomandări |

Teorema CAP în practică

Bazele NoSQL fac alegeri explicite între consistență și disponibilitate:

| Sistem | Alege | Înseamnă | |---|---|---| | MongoDB | CP | Consistență puternică, dar poate refuza scrieri | | Cassandra | AP | Disponibilitate maximă, consistență eventuală | | Redis | CP | În mod implicit, dar poate fi configurat |

BASE — în loc de ACID

Bazele NoSQL folosesc BASE (Basically Available, Soft state, Eventual consistency):

  • Basically Available: Sistemul răspunde mereu, chiar cu date vechi
  • Soft state: Starea sistemului se poate schimba fără input extern
  • Eventual consistency: În timp, toate nodurile vor ajunge la aceeași stare

Schema vs Schemaless

Schema (SQL)

Avantaje:

  • Validarea datelor la nivelul bazei — nu poți insera date invalide
  • Performanță mai bună — baza știe exact tipul fiecărei coloane
  • Documentație implicită — structura e clară din definiția tabelei
  • Tooling mai bun — ORM-uri, generare cod, migrări automate

Dezavantaje:

  • Migrările sunt costisitoare (ALTER TABLE poate bloca tabelul)
  • Date semi-structurate sunt greu de mapat
  • Modificările de structură necesită downtime sau migrări complexe

Schemaless (NoSQL)

Avantaje:

  • Flexibilitate maximă — fiecare document poate avea câmpuri diferite
  • Dezvoltare rapidă — adaugi câmpuri fără migrări
  • Potrivește bine cu date JSON din API-uri externe
  • Scaling orizontal mai ușor (sharding, replicare)

Dezavantaje:

  • Validarea trebuie făcută în aplicație — risc de date corupte
  • Fără garanții de integritate — poți avea referințe invalide
  • Interogări complexe sunt limitate (fără JOIN-uri native)
  • Tooling mai slab, debugging mai dificil

Abordarea hibridă

Cele mai bune sisteme moderne combină ambele abordări:

  • PostgreSQL + JSONB: Coloane JSON cu indexare GIN — ai validare SQL + flexibilitate JSON
  • MongoDB + Schema Validation: Validare opțională la nivel de document
  • SQL + GraphQL: Expui date prin GraphQL, care abstractizează complexitatea interogărilor

Cum alegi

| Ai nevoie de | Alege | |---|---| | Tranzacții bancare, date strict structurate | SQL (PostgreSQL, MySQL) | | Cache, sesiuni, date temporare | Redis (Key-Value) | | Catalog de produse cu câmpuri variabile | MongoDB (Document) | | Social graph, recomandări | Neo4j (Graf) | | Date la scară petabyte, timp real | Cassandra (Column-family) | | Full-text search + analytics | Elasticsearch | | Hibrid: relații + flexibilitate | PostgreSQL + JSONB |

Nu alege tehnologia după hype. Alege după natura datelor tale.