Este módulo explora las relaciones y claves en MariaDB, fundamentales para establecer conexiones entre tablas y organizar datos de forma eficiente. Veremos el concepto de claves primarias, únicas y foráneas, tipos de relaciones (uno a uno, uno a muchos, muchos a muchos), y cómo establecer y utilizar estas relaciones en MariaDB. Finalmente, aprenderás a hacer consultas relacionales usando JOIN.
4.1 Claves Primarias y Únicas
Las claves primarias y únicas son esenciales para identificar filas en una tabla de forma unívoca, lo cual es crucial para la integridad de la base de datos.
Clave Primaria (PRIMARY KEY):
Una clave primaria identifica cada fila de forma única en una tabla.
Una tabla solo puede tener una clave primaria, y el valor de la clave primaria no puede ser NULL.
Ejemplo: Creación de una tabla con una clave primaria.
CREATE TABLE empleados (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
puesto VARCHAR(50)
);
En este ejemplo, id es la clave primaria y se incrementa automáticamente con cada nuevo registro gracias a AUTO_INCREMENT.
Clave Única (UNIQUE KEY):
La clave única garantiza que los valores de una columna o grupo de columnas sean únicos.
A diferencia de la clave primaria, una tabla puede tener múltiples claves únicas.
Ejemplo: Creación de una tabla con una clave única.
CREATE TABLE clientes (
id INT PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(50) UNIQUE,
nombre VARCHAR(50)
);
Aquí, email es único, lo que impide que se registren dos clientes con el mismo correo electrónico.
Añadir Claves en Tablas Existentes:
Puedes añadir una clave única o primaria a una tabla existente usando ALTER TABLE.
Ejemplo:
ALTER TABLE empleados ADD UNIQUE (email);
4.2 Claves Foráneas y Relaciones entre Tablas
Las claves foráneas (foreign keys) permiten crear relaciones entre tablas, lo cual es fundamental en bases de datos relacionales.
Clave Foránea (FOREIGN KEY):
Una clave foránea en una tabla apunta a una clave primaria en otra tabla, estableciendo una relación.
Ejemplo: Supongamos que tenemos una tabla departamentos que contiene el id del departamento y su nombre:
CREATE TABLE departamentos (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL
);
Luego, en la tabla empleados, agregamos una columna departamento_id que será una clave foránea apuntando a la clave primaria id de la tabla departamentos:
CREATE TABLE empleados (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
puesto VARCHAR(50),
departamento_id INT,
FOREIGN KEY (departamento_id) REFERENCES departamentos(id)
);
Con esto, se establece una relación entre empleados y departamentos, asegurando que cada empleado pertenece a un departamento válido.
Restricciones de las Claves Foráneas:
Las claves foráneas permiten mantener la integridad referencial: si intentas insertar un departamento_id en empleados que no existe en departamentos, MariaDB arrojará un error.
4.3 Tipos de relaciones: Uno a uno, uno a muchos, muchos a muchos
En bases de datos relacionales, existen tres tipos principales de relaciones:
Relación Uno a Uno:
Cada fila en una tabla está asociada a una única fila en otra tabla.
Ejemplo: Una tabla usuarios y una tabla perfiles donde cada usuario tiene un perfil único y viceversa.
CREATE TABLE usuarios (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50)
);
CREATE TABLE perfiles (
id INT PRIMARY KEY AUTO_INCREMENT,
usuario_id INT UNIQUE,
biografia TEXT,
FOREIGN KEY (usuario_id) REFERENCES usuarios(id)
);
Aquí, perfiles.usuario_id se relaciona uno a uno con usuarios.id.
Relación Uno a Muchos:
Una fila en una tabla se asocia con múltiples filas en otra tabla.
Ejemplo: Un departamento puede tener varios empleados, pero cada empleado pertenece a un solo departamento
CREATE TABLE empleados (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50),
departamento_id INT,
FOREIGN KEY (departamento_id) REFERENCES departamentos(id)
);
Relación Muchos a Muchos:
Una fila en una tabla está relacionada con múltiples filas en otra tabla y viceversa.
Para crear una relación muchos a muchos, se usa una tabla intermedia.
Ejemplo: Un proyecto puede tener varios empleados, y un empleado puede trabajar en varios proyectos. La tabla empleados_proyectos actúa como tabla intermedia.
CREATE TABLE proyectos (
id INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50)
);
CREATE TABLE empleados_proyectos (
empleado_id INT,
proyecto_id INT,
FOREIGN KEY (empleado_id) REFERENCES empleados(id),
FOREIGN KEY (proyecto_id) REFERENCES proyectos(id)
);
La tabla empleados_proyectos relaciona empleados y proyectos, estableciendo una relación muchos a muchos.
4.4 Creación y Uso de Relaciones en MariaDB
A continuación, se muestra cómo crear y utilizar relaciones en una base de datos de ejemplo.
Ejemplo Completo de Relaciones:
- Supongamos que tienes las tablas
departamentos,empleados, yproyectoscomo en los ejemplos anteriores. Esta configuración permite definir un esquema de organización en el que:- Cada empleado pertenece a un departamento.
- Cada proyecto puede tener varios empleados y viceversa.
- Crear una relación entre
empleadosydepartamentos(uno a muchos) y entreempleadosyproyectos(muchos a muchos) permite modelar un sistema complejo que refleja una organización real.
Integridad Referencial y Restricciones de Clave Foránea:
Si intentas eliminar un departamento en uso por algún empleado, MariaDB bloqueará la acción si la restricción de clave foránea está habilitada.
Puedes especificar acciones ON DELETE o ON UPDATE para personalizar qué sucede con las claves foráneas al modificar o eliminar filas.
ALTER TABLE empleados
ADD CONSTRAINT fk_departamento
FOREIGN KEY (departamento_id) REFERENCES departamentos(id)
ON DELETE CASCADE ON UPDATE CASCADE;
Esto asegura que al eliminar un departamento, también se eliminarán sus empleados (ON DELETE CASCADE), y si se actualiza el id de un departamento, se actualizará en empleados.
4.5 Consultas Relacionales Básicas (JOIN)
Las consultas JOIN permiten recuperar datos relacionados entre varias tablas, simplificando la consulta de información distribuida en múltiples tablas.
INNER JOIN:
- Recupera solo las filas que tienen coincidencias en ambas tablas.
- Ejemplo: Mostrar empleados junto con el nombre de su departamento.
SELECT empleados.nombre AS empleado, departamentos.nombre AS departamento
FROM empleados
INNER JOIN departamentos ON empleados.departamento_id = departamentos.id;
LEFT JOIN:
- Muestra todas las filas de la tabla izquierda y las coincidencias de la tabla derecha; si no hay coincidencia, se muestra
NULL. - Ejemplo: Mostrar todos los empleados, incluyendo aquellos sin departamento asignado.
SELECT empleados.nombre AS empleado, departamentos.nombre AS departamento
FROM empleados
LEFT JOIN departamentos ON empleados.departamento_id = departamentos.id;
RIGHT JOIN:
- Muestra todas las filas de la tabla derecha y las coincidencias de la tabla izquierda; si no hay coincidencia, se muestra
NULL. - Ejemplo: Mostrar todos los departamentos, incluyendo aquellos sin empleados asignados.sqlCopiar código
SELECT empleados.nombre AS empleado, departamentos.nombre AS departamento
FROM empleados
RIGHT JOIN departamentos ON empleados.departamento_id = departamentos.id;
Consulta con JOIN para Relaciones Muchos a Muchos:
- En una relación muchos a muchos, se utiliza una tabla intermedia en la consulta.
- Ejemplo: Mostrar todos los proyectos junto con los empleados asignados.
SELECT empleados.nombre AS empleado, departamentos.nombre AS departamento
FROM empleados
RIGHT JOIN departamentos ON empleados.departamento_id = departamentos.id;
- Aquí se obtienen todos los proyectos junto con los empleados involucrados en cada uno, utilizando la tabla intermedia
empleados_proyectos.
Con el conocimiento de claves, relaciones y JOIN, tienes una base sólida para estructurar y consultar datos relacionales en MariaDB.