Publicado en

El modelo relacional en bases de datos

 

Modelo relacional BBDD

Cuando Edgar F. Codd publicó su modelo relacional en 1970, propuso algo que hoy nos parece obvio: organizar los datos en tablas y definir relaciones entre ellas mediante claves. Esa idea, con décadas de vida, sigue siendo la base de la inmensa mayoría de los sistemas de bases de datos que se usan en producción hoy.

¿Qué es una tabla?

Una tabla es la unidad fundamental del modelo relacional. Está formada por filas y columnas:

  • Columnas (o campos): Definen el tipo de información que almacena la tabla. Por ejemplo, en una tabla de usuarios tendríamos columnas como nombre, email o fecha_registro. Cada columna tiene un tipo de dato asociado (texto, número entero, fecha, etc.).
  • Filas (o registros): Cada fila representa una instancia concreta de la entidad. Si la tabla es de usuarios, cada fila es un usuario real. No puede haber dos filas idénticas en la misma tabla.

A diferencia de una hoja de cálculo, una tabla de base de datos impone reglas estrictas: no se puede almacenar un texto donde se espera un número, ni dejar vacío un campo obligatorio.

Las claves

Las claves son el mecanismo que permite identificar registros de forma unívoca y establecer relaciones entre tablas. Existen varios tipos.

Clave primaria (PRIMARY KEY)

Es la columna o conjunto de columnas que identifica de forma única cada fila de la tabla. No puede contener valores nulos ni repetidos. Cada tabla debe tener exactamente una clave primaria.

Lo más habitual es usar un campo id de tipo entero con autoincremento. Por ejemplo, en una tabla usuarios, el campo id_usuario sería la clave primaria: cada usuario tiene un identificador único que nunca se repite.

Clave foránea (FOREIGN KEY)

Es la columna que referencia la clave primaria de otra tabla. Es el mecanismo que crea la relación entre dos tablas y garantiza la integridad referencial: no puedes crear un pedido para un usuario que no existe.

Siguiendo el ejemplo: la tabla pedidos tendría un campo id_usuario que referencia a la clave primaria de usuarios. Ese campo es una clave foránea.

Clave candidata

Es cualquier columna que podría ser clave primaria porque sus valores son únicos, pero que no ha sido elegida como tal. Por ejemplo, en una tabla de usuarios, el campo email es una clave candidata: dos usuarios no pueden compartir el mismo correo, pero hemos elegido id_usuario como clave primaria.

Clave compuesta

Es una clave primaria formada por dos o más columnas. Se usa cuando ninguna columna por sí sola identifica de forma única un registro. Es habitual en las tablas intermedias que resuelven relaciones muchos a muchos. Por ejemplo, una tabla pedidos_productos tendría como clave compuesta la combinación de id_pedido e id_producto.

Tipos de relaciones entre tablas

La potencia del modelo relacional no está en las tablas individuales, sino en cómo se relacionan entre sí. Hay tres tipos de relaciones posibles.

Uno a uno (1:1)

Un registro de la tabla A se relaciona con exactamente un registro de la tabla B, y viceversa. Es el tipo de relación menos común. Un ejemplo clásico es la relación entre persona y pasaporte: cada persona tiene un único pasaporte y cada pasaporte pertenece a una única persona.

Uno a muchos (1:N)

Un registro de la tabla A puede relacionarse con muchos registros de la tabla B, pero cada registro de B solo apunta a uno de A. Es el tipo de relación más habitual. Ejemplos:

  • Un usuario puede tener muchos pedidos, pero cada pedido pertenece a un único usuario.
  • Un autor puede escribir muchos artículos, pero cada artículo tiene un único autor.
  • Una categoría puede contener muchos productos, pero cada producto pertenece a una categoría.

Se implementa añadiendo una clave foránea en la tabla del lado «muchos» que apunta a la clave primaria del lado «uno».

Muchos a muchos (N:M)

Muchos registros de A se relacionan con muchos registros de B. Un pedido puede contener muchos productos y un producto puede aparecer en muchos pedidos. Este tipo de relación no puede implementarse directamente: requiere una tabla intermedia (o tabla de unión) que convierte la relación N:M en dos relaciones 1:N.

En el ejemplo, la tabla pedidos_productos tendría los campos id_pedido y id_producto, ambos como claves foráneas y juntos formando la clave primaria compuesta.

Un ejemplo completo

Juntando todo, un esquema básico de una tienda online quedaría así:

  • usuarios (id_usuario PK, nombre, email)
  • pedidos (id_pedido PK, id_usuario FK, fecha, total)
  • productos (id_producto PK, nombre, precio)
  • pedidos_productos (id_pedido FK, id_producto FK) → clave compuesta

Con este esquema: un usuario puede tener muchos pedidos (1:N), y cada pedido puede incluir muchos productos mientras que un producto puede estar en muchos pedidos (N:M a través de la tabla intermedia). Usaremos exactamente este esquema en los próximos artículos de la serie cuando practiquemos SQL.