
3.1 Relaciones entre Tablas
En una base de datos relacional, los datos se organizan en tablas que representan entidades, y las relaciones entre estas tablas permiten asociar datos de manera coherente. Las relaciones se establecen mediante el uso de claves primarias (Primary Keys) y claves foráneas (Foreign Keys). A continuación, se exploran los diferentes tipos de relaciones y cómo se implementan en MySQL.
3.1.1 Claves Primarias y Claves Foráneas
3.1.1.1 Clave Primaria (Primary Key)
Una clave primaria es un campo o combinación de campos en una tabla que identifica de manera única cada registro en esa tabla. No puede haber dos registros con la misma clave primaria, y esta no puede contener valores `NULL`.
- Características de la clave primaria:
- Debe ser única.
- No puede ser `NULL`.
- Puede estar compuesta por una o más columnas.
Ejemplo:
CREATE TABLE empleados (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
puesto VARCHAR(50),
salario DECIMAL(10, 2)
);
En este ejemplo:
- La columna `id` es la clave primaria, lo que garantiza que cada empleado tiene un identificador único.
3.1.1.2 Clave Foránea (Foreign Key)
Una **clave foránea** es un campo o conjunto de campos en una tabla que crea una relación entre esta tabla y otra. Esencialmente, una clave foránea en una tabla apunta a una clave primaria en otra tabla, lo que establece la relación entre los registros.
- Características de la clave foránea:
- Puede haber valores duplicados.
- Puede ser `NULL`.
- Enlaza con una clave primaria en otra tabla para crear la relación.
Ejemplo:
Imagina que tienes una tabla `departamentos` y quieres relacionar cada empleado con su departamento:
CREATE TABLE departamentos (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE empleados (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
puesto VARCHAR(50),
salario DECIMAL(10, 2),
id_departamento INT,
FOREIGN KEY (id_departamento) REFERENCES departamentos(id)
);
En este ejemplo:
- La columna `id_departamento` en la tabla `empleados` es una clave foránea que se refiere a la columna `id` en la tabla `departamentos`.
- Esto significa que cada empleado está asociado a un departamento específico.
3.1.2 Tipos de Relaciones
Existen varios tipos de relaciones que se pueden establecer entre tablas en una base de datos relacional:
3.1.2.1 Relaciones Uno a Uno (1:1)
En una relación uno a uno, un registro en la tabla A está relacionado con un solo registro en la tabla B, y viceversa. Este tipo de relación es menos común y suele usarse cuando se desea dividir información en dos tablas por razones de organización o seguridad.
Ejemplo:
Supongamos que tienes una tabla `empleados` y deseas almacenar detalles confidenciales en una tabla separada llamada `detalles_confidenciales`:
CREATE TABLE empleados (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
puesto VARCHAR(50)
);
CREATE TABLE detalles_confidenciales (
id_empleado INT PRIMARY KEY,
salario DECIMAL(10, 2),
numero_seguro_social VARCHAR(20),
FOREIGN KEY (id_empleado) REFERENCES empleados(id)
);
En este caso:
- Cada empleado tiene un único conjunto de detalles confidenciales.
- La clave primaria `id_empleado` en la tabla `detalles_confidenciales` es también una clave foránea que se refiere a la clave primaria `id` en la tabla `empleados`.
3.1.2.2 Relaciones Uno a Muchos (1:N)
En una relación uno a muchos, un registro en la tabla A puede estar relacionado con múltiples registros en la tabla B, pero un registro en la tabla B solo puede estar relacionado con un registro en la tabla A.
Este es el tipo de relación más común.
Ejemplo:
Considera una tabla `clientes` y una tabla `pedidos`, donde un cliente puede hacer múltiples pedidos:
CREATE TABLE clientes (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
id_cliente INT,
fecha DATE,
total DECIMAL(10, 2),
FOREIGN KEY (id_cliente) REFERENCES clientes(id)
);
Aquí:
- Un cliente (`clientes.id`) puede tener múltiples pedidos (`pedidos.id_cliente`), pero cada pedido pertenece a un solo cliente.
3.1.2.3 Relaciones Muchos a Muchos (N:M)
En una relación muchos a muchos, varios registros en la tabla A pueden estar relacionados con varios registros en la tabla B. Para implementar este tipo de relación, es necesario usar una tabla intermedia que contenga claves foráneas que referencian a ambas tablas.
Ejemplo:
Imagina que tienes una tabla `estudiantes` y una tabla `cursos`, y quieres permitir que los estudiantes se inscriban en múltiples cursos y que cada curso pueda tener múltiples estudiantes.
CREATE TABLE estudiantes (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100)
);
CREATE TABLE cursos (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(100)
);
CREATE TABLE inscripciones (
id_estudiante INT,
id_curso INT,
PRIMARY KEY (id_estudiante, id_curso),
FOREIGN KEY (id_estudiante) REFERENCES estudiantes(id),
FOREIGN KEY (id_curso) REFERENCES cursos(id)
);
En este ejemplo:
- La tabla `inscripciones` actúa como una tabla intermedia que relaciona a los `estudiantes` con los `cursos`.
- Un estudiante puede estar inscrito en varios cursos, y un curso puede tener varios estudiantes inscritos.
3.1.3 Integridad Referencial
La integridad referencial es un conjunto de reglas que MySQL usa para garantizar que las relaciones entre tablas permanezcan consistentes. Esto se logra mediante el uso de claves foráneas, que aseguran que los registros en la tabla secundaria (que contiene la clave foránea) siempre correspondan a registros válidos en la tabla primaria (que contiene la clave primaria).
3.1.3.1 Implementación de la Integridad Referencial
Cuando se define una clave foránea, puedes especificar qué debe ocurrir cuando se actualiza o elimina el registro correspondiente en la tabla primaria. Esto se maneja a través de las opciones `ON DELETE` y `ON UPDATE`.
- CASCADE: Propaga la operación a los registros relacionados. Si eliminas o actualizas el registro en la tabla primaria, MySQL también eliminará o actualizará los registros correspondientes en la tabla secundaria.
- SET NULL: Establece la clave foránea en `NULL` si el registro relacionado en la tabla primaria es eliminado o actualizado.
- RESTRICT: Previene la eliminación o actualización del registro en la tabla primaria si existen registros relacionados en la tabla secundaria.
- NO ACTION: Similar a `RESTRICT`, pero se usa principalmente para mantener compatibilidad con otras bases de datos.
Ejemplo:
Supongamos que deseas que, al eliminar un cliente, todos sus pedidos también se eliminen:
CREATE TABLE pedidos (
id INT AUTO_INCREMENT PRIMARY KEY,
id_cliente INT,
fecha DATE,
total DECIMAL(10, 2),
FOREIGN KEY (id_cliente) REFERENCES clientes(id)
ON DELETE CASCADE
);
En este caso:
- Si un registro en `clientes` es eliminado, todos los registros relacionados en `pedidos` también serán eliminados automáticamente, asegurando la integridad referencial.
3.1.4 Ventajas y Buenas Prácticas
3.1.4.1 Ventajas de Utilizar Relaciones entre Tablas
- Organización: Las relaciones permiten dividir los datos en varias tablas lógicas, lo que facilita su manejo y actualización.
- Reducción de Redundancia: Las relaciones ayudan a evitar la duplicación de datos, lo que mejora la eficiencia del almacenamiento.
- Consistencia: Las claves foráneas y la integridad referencial garantizan que los datos en diferentes tablas estén sincronizados y sean coherentes.
3.1.4.2 Buenas Prácticas en el Diseño de Relaciones
- Normalización: Divide los datos en tablas según las entidades y atributos para evitar la duplicación de datos.
- Uso de Claves: Define claves primarias y foráneas correctamente para asegurar la integridad de los datos.
- Gestión de Claves Foráneas: Implementa adecuadamente `ON DELETE` y `ON UPDATE` para gestionar las relaciones y evitar inconsistencias.
Resumen
En el punto 3.1 Relaciones entre Tablas, aprenderás a conectar y organizar datos en múltiples tablas usando claves primarias y foráneas. También explorarás los diferentes tipos de relaciones (uno a uno, uno a muchos, muchos a muchos) y cómo implementar integridad referencial para mantener la coherencia de los datos. Este conocimiento es fundamental para diseñar bases de datos relacionales eficientes y efectivas en MySQL.
No hay comentarios