SQL

Tutorial SQL: Relaciones entre tablas

Aprende los tipos de relaciones, claves y diseño relacional para bases de datos eficientes y con integridad de datos garantizada.

Aprende SQL y certifícate

Tipos de relaciones

Las bases de datos relacionales se fundamentan en la capacidad de establecer conexiones entre diferentes tablas para representar relaciones del mundo real. Estas relaciones permiten estructurar los datos de manera lógica y eficiente, evitando la redundancia y facilitando la integridad de la información.

Relaciones según cardinalidad

La cardinalidad define cuántos registros de una tabla pueden estar asociados con registros de otra tabla. Existen tres tipos fundamentales de relaciones según su cardinalidad:

  • 1. Relación uno a uno (1:1): Cada registro en la tabla A se relaciona con exactamente un registro en la tabla B, y viceversa. Este tipo de relación es la menos común en diseños de bases de datos.
-- Ejemplo: Un empleado tiene una única credencial de acceso
CREATE TABLE empleados (
    empleado_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    departamento VARCHAR(50)
);

CREATE TABLE credenciales (
    credencial_id INT PRIMARY KEY,
    empleado_id INT UNIQUE,
    codigo_acceso VARCHAR(20),
    fecha_emision DATE,
    FOREIGN KEY (empleado_id) REFERENCES empleados(empleado_id)
);

En este ejemplo, la palabra clave UNIQUE garantiza que cada empleado solo pueda tener una credencial asociada.

  • 2. Relación uno a muchos (1:N): Cada registro en la tabla A puede estar relacionado con varios registros en la tabla B, pero cada registro en B está relacionado con exactamente un registro en A. Este es el tipo de relación más común en bases de datos relacionales.
-- Ejemplo: Un departamento tiene muchos empleados
CREATE TABLE departamentos (
    departamento_id INT PRIMARY KEY,
    nombre VARCHAR(50),
    ubicacion VARCHAR(100)
);

CREATE TABLE empleados (
    empleado_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    departamento_id INT,
    FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id)
);

En este caso, la tabla empleados contiene una clave foránea que referencia a la tabla departamentos, permitiendo que un departamento tenga múltiples empleados asociados.

  • 3. Relación muchos a muchos (N:M): Cada registro en la tabla A puede relacionarse con varios registros en la tabla B, y viceversa. Este tipo de relación requiere una tabla intermedia (también llamada tabla de unión o tabla pivote) para implementarse correctamente.
-- Ejemplo: Estudiantes y cursos (un estudiante puede tomar varios cursos
-- y un curso puede tener varios estudiantes)
CREATE TABLE estudiantes (
    estudiante_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    email VARCHAR(100)
);

CREATE TABLE cursos (
    curso_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    creditos INT
);

CREATE TABLE inscripciones (
    estudiante_id INT,
    curso_id INT,
    fecha_inscripcion DATE,
    calificacion DECIMAL(4,2),
    PRIMARY KEY (estudiante_id, curso_id),
    FOREIGN KEY (estudiante_id) REFERENCES estudiantes(estudiante_id),
    FOREIGN KEY (curso_id) REFERENCES cursos(curso_id)
);

La tabla inscripciones actúa como tabla intermedia que contiene claves foráneas a ambas tablas principales, permitiendo establecer la relación muchos a muchos.

Relaciones según dependencia

Además de la cardinalidad, las relaciones pueden clasificarse según la dependencia entre las entidades:

  • 1. Relación fuerte (identificativa): La existencia de una entidad depende completamente de otra. Si se elimina el registro principal, los registros dependientes también deben eliminarse.
-- Ejemplo: Relación fuerte entre pedidos y detalles de pedido
CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    cliente_id INT,
    fecha_pedido DATE
);

CREATE TABLE detalles_pedido (
    pedido_id INT,
    linea_num INT,
    producto_id INT,
    cantidad INT,
    precio_unitario DECIMAL(10,2),
    PRIMARY KEY (pedido_id, linea_num),
    FOREIGN KEY (pedido_id) REFERENCES pedidos(pedido_id) ON DELETE CASCADE
);

La cláusula ON DELETE CASCADE indica que si se elimina un pedido, todos sus detalles asociados también serán eliminados automáticamente.

  • 2. Relación débil (no identificativa): La entidad dependiente tiene su propia identidad y puede existir independientemente de la entidad principal.
-- Ejemplo: Relación débil entre categorías y productos
CREATE TABLE categorias (
    categoria_id INT PRIMARY KEY,
    nombre VARCHAR(50)
);

CREATE TABLE productos (
    producto_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    precio DECIMAL(10,2),
    categoria_id INT,
    FOREIGN KEY (categoria_id) REFERENCES categorias(categoria_id) ON DELETE SET NULL
);

En este caso, si se elimina una categoría, los productos asociados no se eliminan, sino que su categoria_id se establece a NULL mediante la cláusula ON DELETE SET NULL.

Relaciones recursivas

Una relación recursiva ocurre cuando una tabla se relaciona consigo misma. Esto es útil para representar estructuras jerárquicas o relaciones entre entidades del mismo tipo.

-- Ejemplo: Estructura jerárquica de empleados (jefes y subordinados)
CREATE TABLE empleados (
    empleado_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    cargo VARCHAR(50),
    jefe_id INT,
    FOREIGN KEY (jefe_id) REFERENCES empleados(empleado_id)
);

En este ejemplo, la columna jefe_id es una clave foránea que referencia a la misma tabla, permitiendo establecer relaciones jerárquicas entre empleados.

Consideraciones prácticas

Al diseñar relaciones entre tablas, es importante considerar:

  • Integridad referencial: Las bases de datos relacionales utilizan restricciones de clave foránea para garantizar que las relaciones entre tablas sean válidas y consistentes.

  • Acciones referenciales: Al eliminar o actualizar registros, se pueden definir acciones como CASCADE, SET NULL, SET DEFAULT o RESTRICT para mantener la integridad de los datos.

  • Rendimiento: Las relaciones complejas pueden afectar el rendimiento de las consultas, por lo que es importante diseñar las relaciones considerando los patrones de acceso a los datos.

  • Normalización: El proceso de normalización ayuda a determinar qué relaciones son necesarias para minimizar la redundancia y maximizar la integridad de los datos.

Las relaciones bien diseñadas son fundamentales para crear bases de datos eficientes y que representen correctamente la lógica del negocio o dominio que se está modelando.

Claves y referencias

Las claves y referencias constituyen el fundamento técnico que permite implementar las relaciones entre tablas en bases de datos relacionales. Estos elementos son esenciales para mantener la integridad de los datos y establecer conexiones lógicas entre diferentes entidades.

Tipos de claves

En el diseño de bases de datos relacionales, existen varios tipos de claves que cumplen funciones específicas:

  • Clave primaria (Primary Key): Identifica de manera única cada registro en una tabla. No puede contener valores nulos y debe ser única para cada fila.
CREATE TABLE clientes (
    cliente_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    email VARCHAR(100)
);

También es posible definir claves primarias compuestas, formadas por múltiples columnas:

CREATE TABLE reservas (
    hotel_id INT,
    habitacion_num INT,
    fecha_entrada DATE,
    cliente_id INT,
    PRIMARY KEY (hotel_id, habitacion_num, fecha_entrada)
);
  • Clave candidata: Cualquier columna o conjunto de columnas que podría servir como clave primaria por cumplir las condiciones de unicidad y no nulidad. La clave primaria se selecciona entre las claves candidatas.

  • Clave alternativa: Son las claves candidatas que no fueron seleccionadas como clave primaria. Generalmente se implementan como restricciones UNIQUE.

CREATE TABLE usuarios (
    usuario_id INT PRIMARY KEY,
    nombre_usuario VARCHAR(50) UNIQUE,  -- Clave alternativa
    email VARCHAR(100) UNIQUE           -- Otra clave alternativa
);
  • Clave foránea (Foreign Key): Establece una relación entre dos tablas al referenciar la clave primaria de otra tabla. Es el mecanismo fundamental para implementar relaciones.
CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    fecha DATE,
    cliente_id INT,
    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id)
);
  • Clave natural: Utiliza atributos existentes del mundo real como identificadores (por ejemplo, números de identificación personal, códigos ISBN).

  • Clave subrogada (o artificial): Identificador generado artificialmente que no tiene significado en el mundo real. Típicamente son valores autoincrementales o UUIDs.

-- Ejemplo con clave subrogada autoincrementada en MySQL
CREATE TABLE productos (
    producto_id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100),
    precio DECIMAL(10,2)
);

-- Ejemplo con clave subrogada autoincrementada en PostgreSQL
CREATE TABLE productos (
    producto_id SERIAL PRIMARY KEY,
    nombre VARCHAR(100),
    precio DECIMAL(10,2)
);

Restricciones de integridad referencial

Las restricciones de integridad referencial garantizan que las relaciones entre tablas permanezcan válidas. Estas restricciones se implementan mediante claves foráneas y acciones referenciales:

  • ON DELETE: Define qué ocurre con los registros relacionados cuando se elimina un registro referenciado:
-- Los pedidos se eliminan automáticamente si se elimina el cliente
CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    cliente_id INT,
    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id) ON DELETE CASCADE
);

-- El cliente_id se establece a NULL si se elimina el cliente
CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    cliente_id INT,
    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id) ON DELETE SET NULL
);

-- Impide eliminar un cliente si tiene pedidos asociados
CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    cliente_id INT,
    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id) ON DELETE RESTRICT
);
  • ON UPDATE: Define qué ocurre cuando se actualiza la clave primaria referenciada:
-- Actualiza automáticamente el cliente_id en pedidos si cambia en clientes
CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    cliente_id INT,
    FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id) ON UPDATE CASCADE
);

Implementación de claves en MySQL y PostgreSQL

Ambos sistemas de gestión de bases de datos ofrecen sintaxis similar para la implementación de claves, con algunas diferencias específicas:

  • Claves primarias autoincrementales:
-- MySQL
CREATE TABLE productos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nombre VARCHAR(100)
);

-- PostgreSQL
CREATE TABLE productos (
    id SERIAL PRIMARY KEY,
    nombre VARCHAR(100)
);
  • Definición de claves foráneas:
-- Sintaxis común para ambos sistemas
CREATE TABLE pedidos (
    id INT PRIMARY KEY,
    cliente_id INT,
    CONSTRAINT fk_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);
  • Añadir claves a tablas existentes:
-- Añadir clave primaria
ALTER TABLE productos ADD PRIMARY KEY (producto_id);

-- Añadir clave foránea
ALTER TABLE pedidos 
ADD CONSTRAINT fk_cliente 
FOREIGN KEY (cliente_id) REFERENCES clientes(id);

Índices y su relación con las claves

Las bases de datos crean automáticamente índices para las claves primarias y únicas, lo que mejora significativamente el rendimiento de las consultas:

  • Índices de clave primaria: Se crean automáticamente para facilitar la búsqueda rápida de registros por su identificador único.

  • Índices de clave foránea: No se crean automáticamente en todas las bases de datos, pero es una buena práctica crearlos manualmente para mejorar el rendimiento de las operaciones JOIN.

-- Crear índice para una clave foránea
CREATE INDEX idx_pedidos_cliente ON pedidos(cliente_id);

Consideraciones de diseño

Al trabajar con claves y referencias, es importante considerar:

  • Selección de claves primarias: Preferir claves subrogadas (autoincrementales o UUIDs) sobre claves naturales para evitar problemas si los datos del mundo real cambian.
-- Mejor opción para la mayoría de casos
CREATE TABLE empleados (
    id SERIAL PRIMARY KEY,
    dni VARCHAR(15) UNIQUE,  -- Clave natural como alternativa
    nombre VARCHAR(100)
);
  • Integridad de datos: Utilizar las restricciones adecuadas (NOT NULL, UNIQUE, CHECK) junto con las claves para garantizar la calidad de los datos.
CREATE TABLE productos (
    id SERIAL PRIMARY KEY,
    codigo VARCHAR(20) UNIQUE NOT NULL,
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) CHECK (precio > 0)
);
  • Rendimiento: Las operaciones de unión (JOIN) basadas en claves foráneas pueden afectar el rendimiento, especialmente en tablas grandes. Los índices adecuados son cruciales.

  • Ciclos de referencia: Evitar ciclos de referencia que puedan complicar las operaciones de inserción o eliminación de datos.

-- Potencial problema con ciclos de referencia
CREATE TABLE A (
    id INT PRIMARY KEY,
    b_id INT,
    FOREIGN KEY (b_id) REFERENCES B(id)
);

CREATE TABLE B (
    id INT PRIMARY KEY,
    a_id INT,
    FOREIGN KEY (a_id) REFERENCES A(id)
);
  • Nomenclatura consistente: Adoptar convenciones de nomenclatura claras para las claves y restricciones mejora la mantenibilidad del esquema.
-- Convención de nomenclatura clara
CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    cliente_id INT,
    CONSTRAINT fk_pedidos_clientes FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id)
);

Las claves y referencias bien diseñadas son fundamentales para crear bases de datos relacionales robustas que mantengan la integridad de los datos y permitan consultas eficientes entre tablas relacionadas.

Diseño relacional

El diseño relacional es el proceso mediante el cual se estructura una base de datos para representar eficientemente la información y las relaciones entre entidades del mundo real. Un buen diseño relacional es fundamental para garantizar la integridad, flexibilidad y rendimiento de las aplicaciones que utilizan la base de datos.

Proceso de diseño relacional

El diseño de una base de datos relacional generalmente sigue un proceso estructurado que consta de varias etapas:

  • 1. Análisis de requisitos: Identificar qué información necesita almacenar la base de datos y cómo será utilizada.

  • 2. Diseño conceptual: Crear un modelo de alto nivel (generalmente un diagrama entidad-relación) que represente las entidades y sus relaciones.

  • 3. Diseño lógico: Transformar el modelo conceptual en un modelo relacional compuesto por tablas, atributos y relaciones.

  • 4. Normalización: Aplicar reglas formales para eliminar redundancias y anomalías.

  • 5. Diseño físico: Implementar el modelo lógico en un sistema de gestión de bases de datos específico.

Modelado entidad-relación

El diagrama entidad-relación (ER) es una herramienta visual que ayuda a conceptualizar la estructura de la base de datos antes de implementarla:

  • Entidades: Representan objetos o conceptos del mundo real (por ejemplo, clientes, productos, pedidos).

  • Atributos: Propiedades que describen a las entidades (nombre, precio, fecha).

  • Relaciones: Conexiones lógicas entre entidades que reflejan cómo interactúan entre sí.

Un diagrama ER típico utiliza rectángulos para representar entidades, óvalos para atributos y rombos o líneas para relaciones, con símbolos que indican la cardinalidad (1:1, 1:N, N:M).

Normalización de bases de datos

La normalización es un proceso sistemático que elimina la redundancia y mejora la integridad de los datos mediante la descomposición de tablas grandes en tablas más pequeñas y mejor estructuradas. Las formas normales más comunes son:

  • Primera Forma Normal (1NF): Elimina grupos repetitivos y garantiza que cada columna contenga valores atómicos (indivisibles).
-- Tabla NO normalizada (viola 1NF)
CREATE TABLE pedidos_no_normalizado (
    pedido_id INT,
    cliente VARCHAR(100),
    productos VARCHAR(255)  -- Contiene múltiples productos separados por comas
);

-- Tabla en 1NF
CREATE TABLE pedidos (
    pedido_id INT,
    cliente VARCHAR(100)
);

CREATE TABLE detalles_pedido (
    pedido_id INT,
    producto VARCHAR(100),
    cantidad INT
);
  • Segunda Forma Normal (2NF): Cumple 1NF y elimina dependencias parciales (cada atributo no clave debe depender de toda la clave primaria).
-- Tabla que viola 2NF
CREATE TABLE inscripciones_no_2nf (
    estudiante_id INT,
    curso_id INT,
    nombre_estudiante VARCHAR(100),  -- Depende solo de estudiante_id
    nombre_curso VARCHAR(100),       -- Depende solo de curso_id
    calificacion DECIMAL(4,2),
    PRIMARY KEY (estudiante_id, curso_id)
);

-- Tablas en 2NF
CREATE TABLE estudiantes (
    estudiante_id INT PRIMARY KEY,
    nombre_estudiante VARCHAR(100)
);

CREATE TABLE cursos (
    curso_id INT PRIMARY KEY,
    nombre_curso VARCHAR(100)
);

CREATE TABLE inscripciones (
    estudiante_id INT,
    curso_id INT,
    calificacion DECIMAL(4,2),
    PRIMARY KEY (estudiante_id, curso_id),
    FOREIGN KEY (estudiante_id) REFERENCES estudiantes(estudiante_id),
    FOREIGN KEY (curso_id) REFERENCES cursos(curso_id)
);
  • Tercera Forma Normal (3NF): Cumple 2NF y elimina dependencias transitivas (atributos no clave no deben depender de otros atributos no clave).
-- Tabla que viola 3NF
CREATE TABLE empleados_no_3nf (
    empleado_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    departamento_id INT,
    nombre_departamento VARCHAR(50),  -- Depende de departamento_id, no de empleado_id
    ubicacion_departamento VARCHAR(50) -- Depende de departamento_id
);

-- Tablas en 3NF
CREATE TABLE departamentos (
    departamento_id INT PRIMARY KEY,
    nombre_departamento VARCHAR(50),
    ubicacion VARCHAR(50)
);

CREATE TABLE empleados (
    empleado_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    departamento_id INT,
    FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id)
);
  • Forma Normal Boyce-Codd (FNBC): Una versión más estricta de 3NF que aborda ciertos casos especiales de dependencias funcionales.

  • Cuarta Forma Normal (4NF) y Quinta Forma Normal (5NF): Tratan con dependencias multivaluadas y dependencias de join, respectivamente.

Desnormalización estratégica

Aunque la normalización es importante para la integridad de los datos, en algunos casos puede ser necesario desnormalizar estratégicamente para mejorar el rendimiento:

-- Tabla normalizada
CREATE TABLE productos (
    producto_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    categoria_id INT,
    FOREIGN KEY (categoria_id) REFERENCES categorias(categoria_id)
);

-- Tabla parcialmente desnormalizada para mejorar rendimiento de consultas frecuentes
CREATE TABLE productos_desnormalizado (
    producto_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    categoria_id INT,
    nombre_categoria VARCHAR(50),  -- Redundante pero mejora rendimiento
    FOREIGN KEY (categoria_id) REFERENCES categorias(categoria_id)
);

La desnormalización debe aplicarse con cautela, considerando:

  • Frecuencia de consultas vs. actualizaciones
  • Volumen de datos
  • Requisitos de rendimiento específicos
  • Mecanismos para mantener la consistencia de datos redundantes

Patrones de diseño relacional

Existen varios patrones comunes que ayudan a resolver problemas específicos de diseño:

  • Patrón de tabla de catálogo: Utilizado para almacenar listas de valores predefinidos.
CREATE TABLE estados_pedido (
    estado_id INT PRIMARY KEY,
    nombre VARCHAR(50),
    descripcion VARCHAR(255)
);

CREATE TABLE pedidos (
    pedido_id INT PRIMARY KEY,
    cliente_id INT,
    estado_id INT,
    FOREIGN KEY (estado_id) REFERENCES estados_pedido(estado_id)
);
  • Patrón de tabla de historial: Mantiene un registro histórico de cambios.
CREATE TABLE productos (
    producto_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    precio DECIMAL(10,2),
    ultima_actualizacion TIMESTAMP
);

CREATE TABLE historial_precios (
    historial_id INT PRIMARY KEY,
    producto_id INT,
    precio_anterior DECIMAL(10,2),
    precio_nuevo DECIMAL(10,2),
    fecha_cambio TIMESTAMP,
    usuario VARCHAR(50),
    FOREIGN KEY (producto_id) REFERENCES productos(producto_id)
);
  • Patrón de tabla de intersección: Implementa relaciones muchos a muchos con atributos adicionales.
CREATE TABLE proyectos (
    proyecto_id INT PRIMARY KEY,
    nombre VARCHAR(100)
);

CREATE TABLE empleados (
    empleado_id INT PRIMARY KEY,
    nombre VARCHAR(100)
);

CREATE TABLE asignaciones (
    proyecto_id INT,
    empleado_id INT,
    fecha_inicio DATE,
    rol VARCHAR(50),
    horas_asignadas INT,
    PRIMARY KEY (proyecto_id, empleado_id),
    FOREIGN KEY (proyecto_id) REFERENCES proyectos(proyecto_id),
    FOREIGN KEY (empleado_id) REFERENCES empleados(empleado_id)
);
  • Patrón de árbol jerárquico: Representa estructuras jerárquicas como organigramas o categorías anidadas.
-- Patrón de adyacencia simple
CREATE TABLE categorias (
    categoria_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    categoria_padre_id INT,
    FOREIGN KEY (categoria_padre_id) REFERENCES categorias(categoria_id)
);

-- Patrón de conjunto anidado (para consultas eficientes de jerarquías)
CREATE TABLE categorias_anidadas (
    categoria_id INT PRIMARY KEY,
    nombre VARCHAR(100),
    izquierda INT,
    derecha INT
);

Consideraciones prácticas de diseño

Al diseñar una base de datos relacional, es importante considerar:

  • Equilibrio entre normalización y rendimiento: Normalizar lo suficiente para mantener la integridad de datos, pero considerar la desnormalización estratégica donde sea necesario para el rendimiento.

  • Escalabilidad: Diseñar pensando en el crecimiento futuro de los datos y las necesidades cambiantes.

-- Diseño que facilita la partición horizontal futura
CREATE TABLE ventas (
    venta_id INT,
    fecha DATE,
    cliente_id INT,
    total DECIMAL(10,2),
    -- Incluir una columna que facilite la partición
    region_id INT,
    PRIMARY KEY (venta_id)
);
  • Integridad de datos: Utilizar restricciones adecuadas para garantizar la validez de los datos.
CREATE TABLE productos (
    producto_id INT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    precio DECIMAL(10,2) CHECK (precio > 0),
    stock INT DEFAULT 0 CHECK (stock >= 0),
    categoria_id INT NOT NULL,
    FOREIGN KEY (categoria_id) REFERENCES categorias(categoria_id)
);
  • Convenciones de nomenclatura: Adoptar convenciones coherentes para nombres de tablas, columnas y restricciones.
-- Convención consistente
CREATE TABLE tbl_clientes (
    cli_id INT PRIMARY KEY,
    cli_nombre VARCHAR(100),
    cli_email VARCHAR(100)
);

CREATE TABLE tbl_pedidos (
    ped_id INT PRIMARY KEY,
    ped_fecha DATE,
    cli_id INT,
    CONSTRAINT fk_pedidos_clientes FOREIGN KEY (cli_id) REFERENCES tbl_clientes(cli_id)
);
  • Documentación: Mantener documentación actualizada del esquema, incluyendo diagramas ER y descripciones de tablas y relaciones.

Herramientas de diseño relacional

Existen diversas herramientas que facilitan el diseño relacional:

  • MySQL Workbench: Permite crear diagramas ER y generar código SQL para MySQL.
  • pgModeler: Herramienta específica para modelado de bases de datos PostgreSQL.
  • Lucidchart: Herramienta en línea para crear diagramas ER.
  • DbSchema: Herramienta visual de diseño compatible con múltiples sistemas de bases de datos.

Estas herramientas permiten visualizar el diseño, validar relaciones y generar scripts SQL para implementar el esquema diseñado.

Un buen diseño relacional es la base de cualquier sistema de información eficiente. Aunque requiere tiempo y esfuerzo iniciales, evita problemas costosos de integridad de datos y rendimiento a largo plazo, además de facilitar el mantenimiento y la evolución de la base de datos a medida que cambian los requisitos del negocio.

Aprende SQL online

Otras lecciones de SQL

Accede a todas las lecciones de SQL y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Introducción A Sql

Introducción Y Entorno

Ddl Y Dml

Introducción Y Entorno

Instalación De Mysql

Introducción Y Entorno

Instalación De Postgresql

Introducción Y Entorno

Tipos De Datos

Introducción Y Entorno

Bases De Datos Y Tablas

Introducción Y Entorno

Sistemas De Gestión De Bases De Datos

Introducción Y Entorno

Tipos De Bases De Datos

Introducción Y Entorno

Creación De Bases De Datos Y Tablas: Create Database, Create Table

Sintaxis Dml Crud

Consultas Básicas De Selección: Select Y Where

Sintaxis Dml Crud

Inserción De Datos: Insert Into

Sintaxis Dml Crud

Actualización De Datos: Update

Sintaxis Dml Crud

Eliminación De Datos: Delete

Sintaxis Dml Crud

Introducción A Dml

Sintaxis Dml Crud

Consultar Datos: Select

Sintaxis Dml Crud

Clasificación De Resultados Con Order By

Filtros Y Clasificación

Filtrado De Valores Únicos Con Distinct

Filtros Y Clasificación

Paginación Con Limit Y Offset

Filtros Y Clasificación

Alterar La Estructura De Tablas Existentes: Alter Table

Sintaxis Ddl

Renombrar Tablas Y Bases De Datos: Rename

Sintaxis Ddl

Vaciar Tablas Y Bases De Datos: Drop

Sintaxis Ddl

Uso De Funciones Agregadas: Count, Sum, Avg, Max, Min

Funciones Y Agrupación

Agrupación De Resultados Con Group By

Funciones Y Agrupación

Filtrado De Grupos De Resultados Con Having

Funciones Y Agrupación

Funciones Numéricas Y Matemáticas

Funciones Y Agrupación

Funciones De Fecha Y Hora

Funciones Y Agrupación

Funciones De Texto

Funciones Y Agrupación

Many To One

Asociaciones Entre Tablas

One To Many

Asociaciones Entre Tablas

One To One

Asociaciones Entre Tablas

Many To Many

Asociaciones Entre Tablas

Relaciones Entre Tablas

Joins Y Subqueries

Uso De Inner Join, Left Join, Right Join, Full Join

Joins Y Subqueries

Creación Y Uso De Subqueries

Joins Y Subqueries

Left Join Y Right Join

Joins Y Subqueries

Full Join

Joins Y Subqueries

Cross Join Y Self Join

Joins Y Subqueries

Optimización De Consultas

Sintaxis Avanzada

Uso De Índices Y Particiones

Sintaxis Avanzada

Uso De Vistas

Sintaxis Avanzada

Triggers Y Eventos

Sintaxis Avanzada

Particiones

Sintaxis Avanzada

Restricciones E Integridad

Sintaxis Avanzada

Transacciones

Sintaxis Avanzada

Vistas Materializadas

Sintaxis Avanzada

Rollback

Sintaxis Avanzada

Vistas Con Create View

Sintaxis Avanzada

Principios Acid

Sintaxis Avanzada

Manejo De Errores Y Excepciones

Sintaxis Avanzada

Funciones Ventana

Sintaxis Avanzada

Índices

Sintaxis Avanzada

Expresiones De Tabla Comunes (Cte) Con With

Sintaxis Avanzada

Creación Y Uso De Funciones

Programación En Sql

Creación Y Uso De Procedimientos Almacenados

Programación En Sql

Variables Y Control De Flujo

Programación En Sql

Creación Y Manejo De Usuarios Y Roles

Seguridad Y Administración

Asignación Y Gestión De Permisos

Seguridad Y Administración

Copias De Seguridad Y Restauración De Bases De Datos

Seguridad Y Administración

Accede GRATIS a SQL y certifícate

Ejercicios de programación de SQL

Evalúa tus conocimientos de esta lección Relaciones entre tablas con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Tipos de datos

Test

Inserción de datos: INSERT INTO

Test

Filtrado de grupos de resultados con HAVING

Test

Uso de índices y particiones

Test

Renombrar tablas y bases de datos: RENAME

Test

Uso de vistas

Test

Uso de INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN

Test

Agrupación de resultados con GROUP BY

Test

Creación y uso de subqueries

Test

Sentencias INSERT

Código

Copias de seguridad y restauración de bases de datos

Test

Uso de INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN

Código

Instalación de MySQL

Test

Relaciones entre tablas

Código

Eliminación de datos: DELETE

Test

Creación de bases de datos y tablas: CREATE DATABASE, CREATE TABLE

Test

Creación y uso de funciones

Test

Creación de tablas e inserción de datos con SQL

Proyecto

Uso de funciones agregadas: COUNT, SUM, AVG, MAX, MIN

Test

Optimización de consultas

Test

Introducción a SQL

Test

Triggers y eventos

Test

Clasificación de resultados con ORDER BY

Test

Alterar la estructura de tablas existentes: ALTER TABLE

Test

Eliminación de datos: DELETE

Código

Instalación de PostgreSQL

Test

Creación y uso de procedimientos almacenados

Test

Consultas básicas de selección: SELECT y WHERE

Test

Vaciar tablas y bases de datos: DROP

Test

Actualización de datos: UPDATE

Test

Creación y manejo de usuarios y roles

Test

Consultas básicas de selección SELECT y WHERE

Código

Creación de bases de datos y tablas

Código

Bases de datos y tablas

Test

Actualización de datos: UPDATE

Código

Relaciones entre tablas

Test

Filtrado de valores únicos con DISTINCT

Test

Asignación y gestión de permisos

Test

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender los diferentes tipos de relaciones entre tablas según cardinalidad y dependencia.
  • Identificar y aplicar correctamente las claves primarias, candidatas, alternativas y foráneas.
  • Entender y utilizar las restricciones de integridad referencial para mantener la consistencia de los datos.
  • Aplicar principios de diseño relacional y normalización para estructurar bases de datos eficientes y coherentes.
  • Reconocer patrones comunes de diseño y considerar aspectos prácticos para optimizar rendimiento y mantenimiento.