12 Reglas de Codd
1 / 14
Fundamentos de Bases de Datos Relacionales

12 Reglas de Codd

En 1985, el matemático e informático Edgar F. Codd publicó trece reglas —numeradas de 0 a 12— para responder a una pregunta simple: ¿qué hace que un sistema de bases de datos sea verdaderamente "relacional"? Esta presentación recorre cada regla, su fundamento y cómo se traduce en SQL.

Edgar F. Codd · IBM Research · publicadas en 1985

0
La regla fundacional

Regla Fundamental

Para que un sistema pueda llamarse "sistema de gestión de bases de datos relacional" (SGBDR), debe ser capaz de administrar sus bases de datos exclusivamente a través de sus capacidades relacionales, sin importar qué otras interfaces adicionales ofrezca.

Esta regla precede a las demás doce: es el criterio de admisión. Todo lo que la aplicación necesita debe poder lograrse a través del modelo relacional, no como un añadido opcional.

SQL
-- El motor relacional gestiona TODO: estructura, datos e integridad
CREATE TABLE clientes (
    id INTEGER PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL
);
-- Toda operación pasa por el modelo relacional, sin atajos externos
SELECT * FROM clientes;
Aplicación / Usuario Motor Relacional (SQL Engine) Datos Almacenados

El dato fluye siempre de la aplicación al motor y de ahí al almacenamiento — en bucle continuo, nunca al revés.

1
Regla 1

Regla de la Información

Toda la información de la base de datos —datos de usuario o metadatos— debe representarse explícitamente a nivel lógico de una única forma: como valores dentro de tablas (filas y columnas). No existen estructuras ocultas como punteros visibles al usuario.

SQL
-- Toda la información se representa como valores dentro de tablas
SELECT nombre, email
FROM clientes
WHERE id = 42;
id nombre email 1 Ana Martínez ana@ejemplo.com 2 Luis Pérez luis@ejemplo.com 3 Marta Ruiz marta@ejemplo.com

Un cursor recorre cada fila en bucle: toda la información vive dentro de la misma tabla, sin excepciones.

2
Regla 2

Regla de Acceso Garantizado

Cada dato atómico debe ser accesible de forma garantizada mediante la combinación de nombre de tabla + valor de clave primaria + nombre de columna. No se necesita ningún otro mecanismo de navegación para llegar a un valor específico.

SQL
-- Acceso garantizado: tabla + clave primaria + columna
SELECT salario
FROM empleados
WHERE id_empleado = 1024;
Tabla: empleados id_empleado nombre salario 1024 Sofía Chávez Q 9,200 Clave primaria Columna: salario Dato accedido de forma única

La clave primaria y la columna viajan en bucle hacia la misma celda: el punto exacto donde vive el dato.

3
Regla 3

Tratamiento Sistemático de Valores Nulos

El sistema debe soportar NULL como representación uniforme de información faltante o no aplicable, distinta de la cadena vacía y del número cero, e independiente del tipo de dato de la columna.

SQL
-- NULL es distinto de 0 y de una cadena vacía
CREATE TABLE pedidos (
    id INTEGER PRIMARY KEY,
    fecha_entrega DATE, -- NULL: fecha aún desconocida
    total DECIMAL(10,2) NOT NULL DEFAULT 0
);
? NULL desconocido / no aplica 0 Cero valor numérico real " " Cadena vacía texto de longitud cero

Un foco recorre las tres tarjetas en bucle: cada una guarda un significado distinto que nunca se mezcla.

4
Regla 4

Catálogo Dinámico en Línea

La descripción de la base de datos (metadata: tablas, columnas, tipos, restricciones) se almacena también como tablas, y los usuarios autorizados pueden consultarla con el mismo lenguaje que usan para consultar sus propios datos.

SQL
-- El catálogo se consulta como cualquier tabla del usuario
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_name = 'clientes';
Base de Datos tabla: clientes tabla: pedidos tabla: productos refleja information_schema tables → 'clientes' tables → 'pedidos' tables → 'productos'

Cada fila del catálogo se ilumina junto a su tabla real, en un bucle continuo de sincronía.

5
Regla 5

Sublenguaje de Datos Integral

El sistema debe ofrecer al menos un lenguaje con sintaxis bien definida que cubra: definición de datos (DDL), definición de vistas, manipulación de datos (DML), restricciones de integridad, autorización (DCL) y control de transacciones. SQL cumple ese rol.

SQL
-- Un solo lenguaje cubre DDL, DML, DCL, integridad y transacciones
BEGIN TRANSACTION;
    CREATE TABLE cuentas (
        id INTEGER PRIMARY KEY,
        saldo DECIMAL(10,2) NOT NULL
    );
    INSERT INTO cuentas VALUES (1, 1000.00);
    GRANT SELECT ON cuentas TO auditor;
COMMIT;
SQL DDL DML DCL Integridad Transac-ciones

Un mismo punto de datos recorre en bucle las cinco responsabilidades: todas caben en un único lenguaje.

6
Regla 6

Regla de Actualización de Vistas

Toda vista que sea teóricamente actualizable debe poder actualizarse a través del sistema. Los cambios sobre una vista actualizable deben reflejarse en las tablas base, y viceversa.

SQL
-- Una vista actualizable refleja cambios en la tabla base
CREATE VIEW empleados_activos AS
SELECT id, nombre, departamento
FROM empleados
WHERE activo = TRUE;

UPDATE empleados_activos
SET departamento = 'Ventas'
WHERE id = 7;
VISTA empleados_activos TABLA BASE empleados SELECT refleja los datos base UPDATE / INSERT propaga el cambio

Los cambios viajan en ambos sentidos, sin parar: la vista y su tabla base siempre están sincronizadas.

7
Regla 7

Inserción, Actualización y Borrado de Alto Nivel

El sistema debe soportar inserción, actualización y borrado como operaciones de conjunto: una sola sentencia puede afectar cero, una o muchas filas a la vez, no solo la lectura (SELECT).

SQL
-- Una sola sentencia opera sobre todo el conjunto de filas
UPDATE productos
SET precio = precio * 1.10
WHERE categoria = 'electronica';
1 sentencia → N filas UPDATE productos SET precio = precio * 1.10 fila 1 actualizada fila 2 actualizada fila 3 actualizada fila 4 actualizada todas a la vez, en cada ciclo N operaciones manuales actualizar fila 1 actualizar fila 2 actualizar fila 3 actualizar fila 4 una por una — más lento, no recomendado

A la izquierda todas las filas laten a la vez; a la derecha se procesan una por una, en cascada lenta.

8
Regla 8

Independencia Física de los Datos

Las aplicaciones deben seguir funcionando sin cambios cuando se modifica el almacenamiento físico o los métodos de acceso: agregar un índice o reorganizar archivos no debe romper ni una sola consulta existente.

SQL
-- Cambiar el almacenamiento no afecta las consultas existentes
CREATE INDEX idx_clientes_email ON clientes(email);

-- La aplicación sigue escribiendo exactamente la misma consulta:
SELECT * FROM clientes WHERE email = 'ana@ejemplo.com';
Aplicación sin cambios Motor Relacional Almacenamiento físico Índice B-Tree Estructura Hash

El almacenamiento alterna su estructura interna en bucle; la aplicación de arriba jamás lo nota.

9
Regla 9

Independencia Lógica de los Datos

Las aplicaciones deben permanecer lógicamente intactas ante cambios estructurales que preserven la información, como dividir una tabla en dos. Una vista de compatibilidad absorbe el cambio sin tocar el código existente.

SQL
-- Dividir una tabla no debe romper las consultas existentes
CREATE VIEW clientes AS
SELECT c.id, c.nombre, d.email
FROM clientes_base c
JOIN datos_contacto d ON d.cliente_id = c.id;
Esquema Antiguo Vista de Compatibilidad clientes (JOIN interno) clientes_base datos_contacto las consultas antiguas siguen funcionando sin cambios

Los datos fluyen constantemente entre ambas tablas nuevas y la vista que finge ser el esquema de siempre.

10
Regla 10

Independencia de Integridad

Las restricciones de integridad deben poder definirse en el sublenguaje relacional y almacenarse en el catálogo, no repartirse como validaciones ad-hoc dentro de cada aplicación cliente.

SQL
-- La integridad vive en la base de datos, no en cada aplicación
ALTER TABLE cuentas
ADD CONSTRAINT chk_saldo_positivo CHECK (saldo >= 0);

ALTER TABLE pedidos
ADD CONSTRAINT fk_cliente
FOREIGN KEY (cliente_id) REFERENCES clientes(id);
Validación en cada aplicación App A App B App C la validación olvidada viaja entre apps → dato inválido Restricción en la base de datos App A App B App C CHECK correcto una sola regla, siempre aplicada

A la izquierda el fallo salta de app en app; a la derecha una única puerta filtra a todas por igual, siempre.

11
Regla 11

Independencia de Distribución

El lenguaje de manipulación de datos debe verse y comportarse igual sin importar si los datos están centralizados o distribuidos en varios nodos: el motor relacional oculta esa complejidad al usuario final.

SQL
-- El lenguaje es el mismo sin importar dónde residan los datos
SELECT c.nombre, p.total
FROM clientes c
JOIN pedidos_sucursal_norte p ON p.cliente_id = c.id
WHERE p.total > 500;
Aplicación (SQL) Motor Relacional Nodo A Nodo B Nodo C

Un flujo cíclico visita cada nodo por turnos: la aplicación solo le habla al motor, nunca directamente a los nodos.

12
Regla 12

Regla de No Subversión

Si el sistema ofrece una interfaz de bajo nivel (registro a registro), esa vía no puede usarse para saltarse las reglas de integridad ni las restricciones expresadas en el lenguaje relacional de alto nivel.

SQL
-- El acceso de bajo nivel no puede evadir las reglas de integridad
INSERT INTO cuentas (id, saldo) VALUES (99, -50);
-- ERROR: viola CHECK (saldo >= 0), incluso a bajo nivel
Aplicación Motor Relacional (valida reglas) Almacenamiento acceso directo a registros bloqueado en cada intento

El camino directo se intenta una y otra vez, y una y otra vez rebota antes de tocar el almacenamiento.