Base de Datos Relacionales: Claves y Relaciones
🔑 Diferencias entre Clave Primaria, Clave Foránea y Clave Índice
Clave Primaria (Primary Key)
· Identificador único de cada registro en una tabla
· No permite valores nulos ni duplicados
· Solo puede haber una por tabla
· Ejemplo: ID_Usuario en la tabla Usuarios
Clave Foránea (Foreign Key)
· Establece relación entre dos tablas
· Referencia a una clave primaria de otra tabla
· Puede tener valores nulos y duplicados (dependiendo de la relación)
· Puede haber varias en una tabla
· Ejemplo: ID_Usuario en la tabla Pedidos que referencia a Usuarios
Clave Índice (Index)
· Mejora el rendimiento de las consultas
· No garantiza unicidad (a menos que sea único)
· Puede crearse sobre cualquier campo
· Puede haber múltiples índices por tabla
· Ejemplo: Índice en el campo Email para búsquedas rápidas
👤 Relación Uno a Uno (One-to-One)
Ejemplo 1: Usuario - Perfil
```sql
CREATE TABLE Usuarios (
ID_Usuario INT PRIMARY KEY,
Email VARCHAR(100) UNIQUE NOT NULL,
Fecha_Registro DATE
);
CREATE TABLE Perfiles (
ID_Perfil INT PRIMARY KEY,
ID_Usuario INT UNIQUE NOT NULL,
Nombre_Completo VARCHAR(100),
Telefono VARCHAR(15),
FOREIGN KEY (ID_Usuario) REFERENCES Usuarios(ID_Usuario)
);
```
Explicación: Cada usuario tiene exactamente un perfil y cada perfil
pertenece a un solo usuario.
Ejemplo 2: Empleado - Despacho
```sql
CREATE TABLE Empleados (
ID_Empleado INT PRIMARY KEY,
Nombre VARCHAR(100) NOT NULL,
Puesto VARCHAR(50)
);
CREATE TABLE Despachos (
ID_Despacho INT PRIMARY KEY,
ID_Empleado INT UNIQUE NOT NULL,
Numero_Despacho VARCHAR(10),
Piso INT,
FOREIGN KEY (ID_Empleado) REFERENCES Empleados(ID_Empleado)
);
```
Explicación: Cada empleado tiene asignado exclusivamente un
despacho.
👥 Relación Uno a Muchos (One-to-Many)
Ejemplo 1: Cliente - Pedidos
```sql
CREATE TABLE Clientes (
ID_Cliente INT PRIMARY KEY,
Nombre_Empresa VARCHAR(100) NOT NULL,
Contacto VARCHAR(100)
);
CREATE TABLE Pedidos (
ID_Pedido INT PRIMARY KEY,
ID_Cliente INT NOT NULL,
Fecha_Pedido DATE,
Total DECIMAL(10,2),
FOREIGN KEY (ID_Cliente) REFERENCES Clientes(ID_Cliente)
);
```
Explicación: Un cliente puede realizar muchos pedidos, pero cada pedido
pertenece a un solo cliente.
Ejemplo 2: Departamento - Empleados
```sql
CREATE TABLE Departamentos (
ID_Departamento INT PRIMARY KEY,
Nombre_Departamento VARCHAR(50) NOT NULL,
Presupuesto DECIMAL(15,2)
);
CREATE TABLE Empleados (
ID_Empleado INT PRIMARY KEY,
ID_Departamento INT NOT NULL,
Nombre VARCHAR(100) NOT NULL,
Salario DECIMAL(10,2),
FOREIGN KEY (ID_Departamento) REFERENCES
Departamentos(ID_Departamento)
);
```
Explicación: Un departamento puede tener muchos empleados, pero
cada empleado trabaja en un solo departamento.
🔄 Relación Muchos a Muchos (Many-to-Many)
Ejemplo 1: Estudiantes - Cursos
```sql
CREATE TABLE Estudiantes (
ID_Estudiante INT PRIMARY KEY,
Nombre VARCHAR(100) NOT NULL,
Carrera VARCHAR(50)
);
CREATE TABLE Cursos (
ID_Curso INT PRIMARY KEY,
Nombre_Curso VARCHAR(100) NOT NULL,
Creditos INT
);
-- Tabla intermedia (puente)
CREATE TABLE Matriculas (
ID_Matricula INT PRIMARY KEY,
ID_Estudiante INT NOT NULL,
ID_Curso INT NOT NULL,
Fecha_Matricula DATE,
Calificacion DECIMAL(3,1),
FOREIGN KEY (ID_Estudiante) REFERENCES
Estudiantes(ID_Estudiante),
FOREIGN KEY (ID_Curso) REFERENCES Cursos(ID_Curso)
);
```
Explicación: Un estudiante puede matricularse en muchos cursos y un
curso puede tener muchos estudiantes.
Ejemplo 2: Productos - Pedidos
```sql
CREATE TABLE Productos (
ID_Producto INT PRIMARY KEY,
Nombre_Producto VARCHAR(100) NOT NULL,
Precio DECIMAL(10,2)
);
CREATE TABLE Pedidos (
ID_Pedido INT PRIMARY KEY,
Fecha_Pedido DATE,
Cliente VARCHAR(100)
);
-- Tabla intermedia (detalle)
CREATE TABLE Detalle_Pedidos (
ID_Detalle INT PRIMARY KEY,
ID_Pedido INT NOT NULL,
ID_Producto INT NOT NULL,
Cantidad INT NOT NULL,
Precio_Unitario DECIMAL(10,2),
FOREIGN KEY (ID_Pedido) REFERENCES Pedidos(ID_Pedido),
FOREIGN KEY (ID_Producto) REFERENCES Productos(ID_Producto)
);
```
Explicación: Un pedido puede contener muchos productos y un producto
puede estar en muchos pedidos.
📊 Resumen Visual de las Relaciones
Tipo Relación Estructura Cardinalidad
Uno a Uno A ←→ B 1:1
Uno a Muchos A ←→ BBB 1:N
Muchos a Muchos AAA ↔ BBB M:N