ACID
Las cuatro propiedades que debe cumplir una transacción: Atomicidad, Consistencia, Aislamiento y Durabilidad.
BEGIN;
UPDATE cuentas SET saldo = saldo - 100
WHERE id = 1;
UPDATE cuentas SET saldo = saldo + 100
WHERE id = 2;
COMMIT;
MVCC
Control de concurrencia multiversión: cada transacción ve una "fotografía" consistente de los datos sin bloquear lecturas.
-- Postgres usa xmin/xmax
-- para versionar cada fila
SELECT * FROM pedidos
WHERE xmin::text::int > 1000;
Aislamiento
READ COMMITTED, REPEATABLE READ y SERIALIZABLE definen qué anomalías (dirty read, phantom read) se permiten.
SET TRANSACTION ISOLATION LEVEL
SERIALIZABLE;
Locking
Bloqueos a nivel de fila o tabla (row-level, table-level) para evitar condiciones de carrera en escrituras.
SELECT * FROM inventario
WHERE id = 5
FOR UPDATE;
Estructuras de índice
B-Tree para rangos y orden, Hash para igualdad exacta, GIN/GiST para full-text y datos geoespaciales.
CREATE INDEX idx_pedidos_fecha
ON pedidos USING BTREE (fecha);
Query Planner
EXPLAIN ANALYZE revela si el optimizador eligió un index scan, seq scan o un join anidado, hash o merge.
EXPLAIN ANALYZE
SELECT * FROM pedidos
WHERE cliente_id = 42;
Normalización
1FN a 3FN reducen redundancia; la desnormalización deliberada (agregados, columnas calculadas) acelera lecturas críticas.
-- desnormalizado a propósito
ALTER TABLE pedidos
ADD COLUMN total_cache NUMERIC;
Particionamiento
Range, list o hash partitioning dividen tablas gigantes para que cada consulta toque solo el fragmento necesario.
CREATE TABLE ventas_2026
PARTITION OF ventas
FOR VALUES FROM ('2026-01-01')
TO ('2027-01-01');
El teorema CAP dice que un sistema distribuido solo puede garantizar dos de estas tres propiedades a la vez cuando ocurre una partición de red.
Consistencia
Toda lectura recibe la escritura más reciente, sin importar el nodo consultado.
Disponibilidad
Cada solicitud recibe respuesta, aunque algún nodo esté caído.
Tolerancia a particiones
El sistema sigue operando aunque se pierdan mensajes entre nodos.
Replicación
Maestro-esclavo para lecturas escaladas, o multi-maestro con resolución de conflictos para escrituras distribuidas.
-- Postgres streaming replication
primary_conninfo = 'host=primary
port=5432 user=replicator'
Sharding
Divide una tabla lógica en fragmentos físicos por clave (hash, rango) repartidos entre varios servidores.
-- clave de sharding
shard_id = hash(cliente_id) % N;
SQL vs NoSQL
Documentales (Mongo), clave-valor (Redis), columnares (Cassandra) y de grafos (Neo4j) relajan esquema o consistencia a cambio de escala.
db.pedidos.find({
cliente_id: 42
});