Explica cómo equilibrar normalización, duplicación, invariantes y consistencia para conservar integridad sin ignorar patrones de acceso y límites operativos.
Última actualización
Actualizada
Nivel
Aplicación
Normalizar busca que cada hecho tenga un lugar claro. Desnormalizar busca responder una necesidad concreta duplicando información de forma controlada. Ambas decisiones deben partir de integridad, consultas y operación.
La normalización organiza datos para reducir redundancia y anomalías. La consistencia define qué relaciones y reglas deben mantenerse verdaderas, incluso ante fallos o concurrencia.
Una tabla única de ventas podría repetir nombre del cliente, dirección, producto y precio en cada fila. Cambiar un dato exigiría modificar muchas filas y podría dejar versiones contradictorias.
Las anomalías clásicas son:
Inserción: no puedes registrar un concepto sin inventar otro dato.
Actualización: un mismo hecho debe cambiarse en varios lugares.
Eliminación: borrar una fila elimina información que debía sobrevivir.
Cada fila es identificable y cada atributo contiene un valor del dominio esperado. Guardar "A1,B2,C3" en una columna impide validar relaciones y consultar con claridad.
En una tabla con clave compuesta, los atributos dependen de toda la clave. En OrderLine(orderId, lineNumber, productName), el nombre actual del producto no depende de toda la clave si representa catálogo; quizá pertenece a Product. Si representa snapshot histórico, su significado cambia y debe documentarse.
Los atributos no clave no dependen transitivamente de otros atributos no clave. Guardar branchCity junto a branchId en cada pedido duplica información si la ciudad es propiedad actual de la sucursal.
Las formas normales son herramientas de razonamiento, no una meta mecánica.
Cuando existen varias fuentes, no siempre puede garantizarse atomicidad global. Se necesitan contratos, idempotencia, reconciliación y estados intermedios.
La clave impide duplicados por sucursal y producto. Los checks protegen reglas locales. Aun así, una reserva concurrente necesita una operación atómica; el esquema por sí solo no define todo el flujo.
UPDATE inventory_item
SET reserved = reserved + :quantity,
version = version +1WHERE branch_id = :branchId
AND product_id = :productId
AND on_hand - reserved >= :quantity;
Si se actualiza cero filas, no existe capacidad suficiente o el registro cambió. La comprobación y modificación ocurren juntas, evitando una ventana entre lectura y escritura.
Cuando el problema no está medido, el volumen es bajo o el coste de sincronización supera el beneficio. Un join bien indexado suele ser más seguro que una copia manual.