← Back to Cooldecode
Deep dive · Databases

DBMS: everything between your app and the disk

A Database Management System is the software that stores, protects and serves your data. This is the full map: what it does, how it works inside, the families of databases, the main products, and how to choose.

1. What a DBMS is (and what it is not)

A database is an organized collection of data. A DBMS (Database Management System, SGBD in Portuguese) is the program that manages it: it writes and reads data on disk, enforces rules, handles many users at once, recovers from crashes and answers queries. PostgreSQL is a DBMS; the data inside one PostgreSQL instance is the database.

Your application never touches data files directly. It talks to the DBMS through a language (usually SQL) over a connection, and the DBMS decides how to execute the request.

2. Why not just use files?

A JSON or CSV file works until it doesn't. A DBMS solves problems you would otherwise rebuild badly:

3. What's inside: the architecture

A typical relational DBMS processes a query through layers:

  1. Connection layer: authentication, sessions, connection pooling.
  2. Parser: checks the SQL syntax and builds a tree.
  3. Planner / optimizer: picks the cheapest way to run it (which index, which join order), using statistics about the data.
  4. Executor: runs the chosen plan.
  5. Buffer cache: keeps hot pages in memory so most reads never touch the disk.
  6. Transaction and lock manager: keeps concurrent work consistent.
  7. Write-ahead log (WAL): every change is appended to a log before the data pages change, so a crash can be replayed or undone.
  8. Storage engine: lays data out on disk in pages.
The WAL idea is the heart of durability. Appending to a log is fast and sequential. Data pages can be written lazily later; after a crash the DBMS replays the log to rebuild a consistent state.

4. Transactions and ACID

A transaction groups several operations into one all-or-nothing unit. The classic example is a transfer: subtract from A, add to B. ACID is the set of guarantees:

LetterMeaningIn practice
AtomicityAll steps happen or none doA failure halfway rolls everything back
ConsistencyData moves from one valid state to anotherConstraints are never left violated
IsolationConcurrent transactions don't see each other's half-done workControlled by isolation levels
DurabilityOnce committed, it survives a crashThanks to the WAL and fsync
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;   -- or ROLLBACK; to undo both

5. Concurrency, isolation and locking

Many users read and write at once. The DBMS has two main strategies:

The SQL standard defines isolation levels, trading safety for speed: Read Uncommitted, Read Committed, Repeatable Read, Serializable. Each level prevents more anomalies (dirty reads, non-repeatable reads, phantom reads) at a performance cost. Most DBMSs default to Read Committed (PostgreSQL) or Repeatable Read (MySQL InnoDB).

6. Indexes and the query optimizer

Without an index, finding a row means scanning the whole table (a sequential scan). An index is a separate sorted structure that lets the DBMS jump straight to matching rows, like a book's index.

Indexes cost: every write must also update them, and they take disk space. Index what you filter, join and sort on, not everything.

CREATE INDEX idx_orders_customer ON orders (customer_id);
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 42;

EXPLAIN shows the plan the optimizer chose. It's the single most useful performance tool you have.

7. Storage engines: B-tree vs LSM-tree

B-tree enginesLSM-tree engines
How writes workUpdate pages in placeAppend to memory, flush sorted files, merge in the background (compaction)
StrengthFast, predictable readsVery high write throughput
CostRandom I/O on writesRead and write amplification from compaction
ExamplesPostgreSQL, MySQL InnoDB, SQLiteRocksDB, Cassandra, ScyllaDB, LevelDB

Also: row-oriented storage keeps whole rows together (good for transactions, OLTP); column-oriented storage keeps each column together (good for analytics scans, OLAP).

8. The families of DBMS

Relational (RDBMS)

Tables, rows, columns, SQL, joins, strict schemas. Best default for most applications. PostgreSQL, MySQL/MariaDB, SQLite, SQL Server, Oracle.

Document

Store JSON-like documents; flexible schema; related data nested together. MongoDB, Couchbase, Firestore. Good when records are self-contained and shape varies; weaker at many-to-many relations.

Key-value

A giant dictionary: get/set by key. Extremely fast. Redis, Valkey, DynamoDB, Memcached. Used for caches, sessions, queues, counters.

Wide-column

Rows grouped by partition key with flexible columns, built for huge write volume across many nodes. Cassandra, ScyllaDB, HBase, Bigtable.

Graph

Nodes and edges as first-class citizens; fast multi-hop relationship queries (recommendations, fraud, social graphs). Neo4j, Amazon Neptune.

Time-series

Optimized for timestamped data streams (metrics, IoT). TimescaleDB, InfluxDB, Prometheus' storage.

Search engines

Inverted indexes for full-text relevance. Elasticsearch, OpenSearch, Meilisearch, Typesense. Usually a secondary store fed from the main database.

Vector

Store embeddings and find nearest neighbors, the backbone of RAG for LLM apps. pgvector (inside PostgreSQL), Pinecone, Qdrant, Weaviate, Milvus.

Analytical (OLAP) warehouses

Column-oriented systems for big aggregations over historical data. BigQuery, Snowflake, ClickHouse, DuckDB, Redshift.

NewSQL / distributed SQL

SQL and ACID, but horizontally scalable across nodes. CockroachDB, YugabyteDB, Google Spanner, TiDB.

9. The main products compared

DBMSTypeBest atWatch out for
PostgreSQLRelationalGeneral purpose, rich SQL, JSONB, extensions (pgvector, PostGIS)Needs tuning and vacuuming at large scale
MySQL / MariaDBRelationalWeb apps, huge ecosystem, simple replicationHistorically fewer advanced SQL features
SQLiteEmbedded relationalLocal apps, tests, small sites; zero config, single fileOne writer at a time; not for heavy concurrent writes
SQL ServerRelationalMicrosoft shops, BI toolingLicensing cost
OracleRelationalLarge enterprises, mature featuresCost and complexity
MongoDBDocumentFlexible schemas, nested dataJoins and cross-document consistency need care
Redis / ValkeyKey-value (in-memory)Caching, sessions, rate limits, queuesMemory-bound; not a primary store by default
DynamoDBKey-value / wideServerless scale, predictable latencyYou must design around access patterns up front
CassandraWide-columnMassive writes, multi-regionLimited queries; operational complexity
ClickHouse / DuckDBAnalytical columnarFast aggregations over huge datasetsNot for row-by-row transactional updates

10. Scaling: replication, sharding, CAP

The CAP theorem: when the network partitions, a distributed system must choose between consistency (every read sees the latest write) and availability (every request gets an answer). Many NoSQL systems choose eventual consistency; distributed SQL systems usually choose consistency. The related BASE idea (basically available, soft state, eventually consistent) describes the looser model.

11. Operations: backup, security, migrations

12. How to choose

Default answer: start with PostgreSQL. It handles relational data, JSON, full-text search and vectors, so it covers most apps for a long time. Add specialized stores only when a measured need appears.
If you need…Reach for…
Business data with relationships and transactionsPostgreSQL or MySQL
A tiny app, prototype, local or edge storageSQLite
Caching, sessions, rate limitingRedis / Valkey
Flexible, document-shaped dataMongoDB (or PostgreSQL JSONB)
Analytics over millions or billions of rowsClickHouse, BigQuery, DuckDB
Semantic search for an AI apppgvector first; a dedicated vector DB at large scale
Full-text search with rankingPostgreSQL FTS first; Meilisearch/Elasticsearch if it grows
Global scale with SQL guaranteesCockroachDB, Spanner, YugabyteDB

Questions to ask: What are the access patterns? How strict must consistency be? How big will it get? Who operates it? What does the team already know? The last one matters more than most benchmarks.

13. Common mistakes

Imersão · Bancos de dados

SGBDs: tudo o que fica entre seu app e o disco

Um Sistema de Gerenciamento de Banco de Dados é o software que armazena, protege e serve seus dados. Este é o mapa completo: o que ele faz, como funciona por dentro, as famílias de bancos, os principais produtos e como escolher.

1. O que é um SGBD (e o que não é)

Um banco de dados é uma coleção organizada de dados. Um SGBD (Sistema de Gerenciamento de Banco de Dados, DBMS em inglês) é o programa que o gerencia: grava e lê dados no disco, aplica regras, atende muitos usuários ao mesmo tempo, se recupera de falhas e responde queries. O PostgreSQL é um SGBD; os dados dentro de uma instância dele são o banco de dados.

Sua aplicação nunca mexe nos arquivos de dados diretamente. Ela conversa com o SGBD por uma linguagem (normalmente SQL) através de uma conexão, e o SGBD decide como executar o pedido.

2. Por que não usar só arquivos?

Um arquivo JSON ou CSV funciona até não funcionar mais. Um SGBD resolve problemas que você acabaria reconstruindo mal:

3. O que tem por dentro: a arquitetura

Um SGBD relacional típico processa uma query em camadas:

  1. Camada de conexão: autenticação, sessões, pool de conexões.
  2. Parser: valida a sintaxe SQL e monta uma árvore.
  3. Planner / otimizador: escolhe o jeito mais barato de executar (qual índice, qual ordem de join), usando estatísticas dos dados.
  4. Executor: roda o plano escolhido.
  5. Buffer cache: mantém páginas quentes em memória para que a maioria das leituras nem toque o disco.
  6. Gerenciador de transações e locks: mantém o trabalho concorrente consistente.
  7. Write-ahead log (WAL): toda mudança é anexada a um log antes de alterar as páginas de dados, então uma queda pode ser refeita ou desfeita.
  8. Storage engine: organiza os dados em páginas no disco.
A ideia do WAL é o coração da durabilidade. Anexar a um log é rápido e sequencial. As páginas de dados podem ser gravadas depois, sem pressa; após uma queda o SGBD reaplica o log para reconstruir um estado consistente.

4. Transações e ACID

Uma transação agrupa várias operações numa unidade tudo-ou-nada. O exemplo clássico é uma transferência: tira de A, soma em B. ACID é o conjunto de garantias:

LetraSignificadoNa prática
AtomicidadeTodos os passos acontecem ou nenhumUma falha no meio desfaz tudo
ConsistênciaOs dados passam de um estado válido a outroRestrições nunca ficam violadas
IsolamentoTransações concorrentes não enxergam o trabalho incompleto umas das outrasControlado por níveis de isolamento
DurabilidadeDepois do commit, sobrevive a uma quedaGraças ao WAL e ao fsync
BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;   -- ou ROLLBACK; para desfazer as duas

5. Concorrência, isolamento e locks

Muitos usuários leem e escrevem ao mesmo tempo. O SGBD tem duas estratégias principais:

O padrão SQL define níveis de isolamento, trocando segurança por velocidade: Read Uncommitted, Read Committed, Repeatable Read, Serializable. Cada nível previne mais anomalias (dirty read, non-repeatable read, phantom read) com custo de desempenho. A maioria dos SGBDs usa Read Committed (PostgreSQL) ou Repeatable Read (InnoDB do MySQL) como padrão.

6. Índices e o otimizador de queries

Sem índice, achar uma linha significa varrer a tabela inteira (sequential scan). Um índice é uma estrutura ordenada separada que deixa o SGBD ir direto às linhas certas, como o índice de um livro.

Índices têm custo: toda escrita também precisa atualizá-los, e ocupam disco. Indexe o que você filtra, junta e ordena, não tudo.

CREATE INDEX idx_orders_customer ON orders (customer_id);
EXPLAIN ANALYZE SELECT * FROM orders WHERE customer_id = 42;

O EXPLAIN mostra o plano escolhido pelo otimizador. É a ferramenta de performance mais útil que você tem.

7. Engines de armazenamento: B-tree vs LSM-tree

Engines B-treeEngines LSM-tree
Como escrevemAtualizam páginas no lugarAnexam em memória, descarregam arquivos ordenados, juntam em segundo plano (compaction)
Ponto forteLeituras rápidas e previsíveisThroughput de escrita muito alto
CustoI/O aleatório nas escritasAmplificação de leitura e escrita pela compaction
ExemplosPostgreSQL, MySQL InnoDB, SQLiteRocksDB, Cassandra, ScyllaDB, LevelDB

Também: o armazenamento orientado a linhas guarda a linha inteira junta (bom para transações, OLTP); o orientado a colunas guarda cada coluna junta (bom para varreduras analíticas, OLAP).

8. As famílias de SGBD

Relacional (SGBDR)

Tabelas, linhas, colunas, SQL, joins, schema rígido. Melhor padrão para a maioria das aplicações. PostgreSQL, MySQL/MariaDB, SQLite, SQL Server, Oracle.

Documento

Guarda documentos tipo JSON; schema flexível; dados relacionados aninhados. MongoDB, Couchbase, Firestore. Bom quando os registros são autocontidos e o formato varia; mais fraco em relações muitos-para-muitos.

Chave-valor

Um dicionário gigante: get/set por chave. Extremamente rápido. Redis, Valkey, DynamoDB, Memcached. Usado em cache, sessões, filas, contadores.

Colunas largas

Linhas agrupadas por chave de partição com colunas flexíveis, feitas para volume enorme de escrita em muitos nós. Cassandra, ScyllaDB, HBase, Bigtable.

Grafo

Nós e arestas como cidadãos de primeira classe; consultas rápidas de relacionamentos em vários saltos (recomendação, fraude, redes sociais). Neo4j, Amazon Neptune.

Séries temporais

Otimizados para fluxos de dados com timestamp (métricas, IoT). TimescaleDB, InfluxDB, armazenamento do Prometheus.

Motores de busca

Índices invertidos para relevância em texto. Elasticsearch, OpenSearch, Meilisearch, Typesense. Normalmente um armazenamento secundário alimentado pelo banco principal.

Vetoriais

Guardam embeddings e acham os vizinhos mais próximos, base do RAG em apps com LLM. pgvector (dentro do PostgreSQL), Pinecone, Qdrant, Weaviate, Milvus.

Data warehouses analíticos (OLAP)

Sistemas colunares para grandes agregações sobre dados históricos. BigQuery, Snowflake, ClickHouse, DuckDB, Redshift.

NewSQL / SQL distribuído

SQL e ACID, mas escalando horizontalmente entre nós. CockroachDB, YugabyteDB, Google Spanner, TiDB.

9. Os principais produtos comparados

SGBDTipoMelhor emAtenção
PostgreSQLRelacionalUso geral, SQL rico, JSONB, extensões (pgvector, PostGIS)Pede ajuste e vacuum em grande escala
MySQL / MariaDBRelacionalApps web, ecossistema enorme, replicação simplesHistoricamente menos recursos SQL avançados
SQLiteRelacional embarcadoApps locais, testes, sites pequenos; zero configuração, um arquivoUm escritor por vez; não serve para muita escrita concorrente
SQL ServerRelacionalAmbientes Microsoft, ferramentas de BICusto de licença
OracleRelacionalGrandes empresas, recursos madurosCusto e complexidade
MongoDBDocumentoSchemas flexíveis, dados aninhadosJoins e consistência entre documentos exigem cuidado
Redis / ValkeyChave-valor (em memória)Cache, sessões, rate limit, filasLimitado pela memória; não é banco principal por padrão
DynamoDBChave-valor / colunas largasEscala serverless, latência previsívelÉ preciso modelar pelos padrões de acesso desde o início
CassandraColunas largasEscrita massiva, multi-regiãoConsultas limitadas; complexidade operacional
ClickHouse / DuckDBColunar analíticoAgregações rápidas sobre datasets enormesNão serve para updates transacionais linha a linha

10. Escala: replicação, sharding, CAP

O teorema CAP: quando a rede particiona, um sistema distribuído precisa escolher entre consistência (toda leitura vê a última escrita) e disponibilidade (toda requisição recebe resposta). Muitos NoSQL escolhem consistência eventual; sistemas SQL distribuídos geralmente escolhem consistência. A ideia relacionada de BASE (basically available, soft state, eventually consistent) descreve o modelo mais frouxo.

11. Operação: backup, segurança, migrations

12. Como escolher

Resposta padrão: comece com PostgreSQL. Ele cobre dados relacionais, JSON, busca textual e vetores, o que atende a maioria dos apps por bastante tempo. Adicione armazenamentos especializados só quando surgir uma necessidade medida.
Se você precisa de…Use…
Dados de negócio com relações e transaçõesPostgreSQL ou MySQL
App minúsculo, protótipo, armazenamento local ou na bordaSQLite
Cache, sessões, rate limitingRedis / Valkey
Dados flexíveis em formato de documentoMongoDB (ou JSONB do PostgreSQL)
Analytics sobre milhões ou bilhões de linhasClickHouse, BigQuery, DuckDB
Busca semântica para um app de IApgvector primeiro; banco vetorial dedicado em grande escala
Busca textual com rankingFTS do PostgreSQL primeiro; Meilisearch/Elasticsearch se crescer
Escala global com garantias SQLCockroachDB, Spanner, YugabyteDB

Perguntas a fazer: quais são os padrões de acesso? Quão estrita precisa ser a consistência? Quão grande vai ficar? Quem vai operar? O que o time já conhece? A última pesa mais que a maioria dos benchmarks.

13. Erros comuns