Modelo relacional: información, relaciones y claves
Fundamentos del modelo relacional: tablas, filas, atributos, claves, dependencias y relaciones para representar información con integridad.
Última actualización
Actualizada
Nivel
Fundamentos
El modelo relacional no empieza con tablas ni con CREATE TABLE. Empieza con afirmaciones sobre el dominio: qué hechos existen, cómo se identifican y qué combinaciones de datos deben ser válidas.
El modelo relacional representa información mediante relaciones formadas por atributos y tuplas. En PostgreSQL, una tabla es la implementación práctica de una relación, pero pensar únicamente en “filas y columnas” oculta lo más importante: el significado de cada fila, las claves que la identifican y las reglas que separan estados válidos de estados inválidos.
Una tabla no debería responder solo “qué columnas tiene”, sino también:
Texto
¿Qué afirma cada fila?
→ ¿Cómo se identifica esa afirmación?
→ ¿Qué otras filas necesita para ser válida?
→ ¿Qué duplicados o combinaciones deben ser imposibles?
Conjunto de tuplas que comparten la misma estructura y representan el mismo tipo de hecho.
En teoría relacional, una relación no tiene duplicados ni orden. SQL, sin embargo, opera frecuentemente con multisets y puede producir filas repetidas en consultas.
Cantidad de tuplas. No debe confundirse con la cardinalidad conceptual de una relación entre entidades —uno a uno, uno a muchos— ni con estimaciones del planner.
Cada negocio administra productos. Un SKU identifica un producto únicamente dentro de su negocio.
Modelo:
SQL
CREATETABLE products (
id bigint GENERATED ALWAYS ASIDENTITYPRIMARYKEY,
business_id bigintNOTNULLREFERENCES businesses(id),
sku textNOTNULL,
name textNOTNULL,UNIQUE(business_id, sku));
El flujo de diseño es:
products representa productos, no inventario ni precio histórico de venta.
business_id expresa ownership.
id proporciona identidad técnica estable.
(business_id, sku) protege la identidad natural del dominio.
La foreign key impide asociar productos a negocios inexistentes.
La surrogate key no reemplaza la regla natural. Sin el UNIQUE, podrían existir dos productos con el mismo SKU en un negocio aunque cada fila tenga un id distinto.
Eso no significa que deba existir una tabla con JSON o columnas repetidas que imiten el objeto. La aplicación necesita una forma de lectura; la base necesita representar hechos e integridad.
La misma relación puede proyectarse en distintos objetos:
Resumen para una card.
Factura detallada.
Reporte por producto.
Evento de integración.
El modelo no debería acoplarse a una sola representación de UI.
Una columna nullable debe significar ausencia válida, no “todavía no diseñamos el concepto”. cancelled_at puede ser NULL porque no todas las órdenes están canceladas.
Una tabla gigante con decenas de columnas nullable puede indicar que se mezclaron entidades diferentes. Evalúa tablas por subtipo, composición o JSONB puntual.
Una relación como (tenant_id, id) necesita asegurar que foreign keys y unique constraints conservan el tenant. Una FK solo por id puede permitir referencias cruzadas si los IDs no son globales.