Modelos de datos y visión conceptual BD

📌 1. Diferencia entre modelo conceptual, lógico y físico

🧩 Criterio de Evaluación: CE1.1 – Se han descrito las características de los modelos de datos conceptuales, lógicos y físicos.

  • Modelo conceptual: Representación abstracta de alto nivel que identifica las entidades principales, sus atributos y las relaciones entre ellas, sin considerar detalles de implementación.
  • Modelo lógico: Transforma el modelo conceptual a un esquema específico para un tipo de SGBD (relacional, orientado a objetos, etc.), definiendo tablas, claves y relaciones.
  • Modelo físico: Describe la implementación concreta en un SGBD específico, incluyendo estructuras de almacenamiento, índices, particiones y optimizaciones de rendimiento.

📌 2. Diseña un modelo entidad-relación para una biblioteca con libros, usuarios y préstamos

🧩 Criterio de Evaluación: CE2.2 – Se han identificado las entidades y relaciones de un supuesto planteado.

ENTIDADES PRINCIPALES:
- LIBRO (ISBN*, título, autor, editorial, año_publicación, ejemplares)
- USUARIO (id_usuario*, nombre, apellidos, dirección, teléfono, email)
- PRÉSTAMO (id_préstamo*, fecha_préstamo, fecha_devolución_prevista, fecha_devolución_real)

RELACIONES:
- REALIZA: Un USUARIO realiza varios PRÉSTAMOS (1:N)
- CONTIENE: Un PRÉSTAMO puede contener varios LIBROS (M:N) → se implementa con tabla intermedia:
  DETALLE_PRÉSTAMO (id_préstamo*, ISBN*, estado)

ATRIBUTOS ADICIONALES:
- LIBRO: categoría, idioma, disponibilidad
- USUARIO: tipo (estudiante, profesor, etc.), fecha_registro
- PRÉSTAMO: estado (activo, devuelto, retrasado), multa
                

📌 3. Explica con ejemplos qué son las operaciones de selección y proyección en álgebra relacional

🧩 Criterio de Evaluación: CE3.1 – Se han descrito los distintos operadores del álgebra relacional.

  • Selección (σ): Operación unaria que filtra tuplas (filas) de una relación según una condición.
    σ(ciudad='Madrid')(CLIENTES) → Devuelve todos los clientes de Madrid

    Ejemplo práctico: Seleccionar productos con stock menor a 10 unidades:

    σ(stock < 10)(PRODUCTOS)
  • Proyección (π): Operación unaria que selecciona ciertos atributos (columnas) de una relación.
    π(nombre, teléfono)(CLIENTES) → Devuelve solo nombre y teléfono de todos los clientes

    Ejemplo práctico: Obtener solo códigos y nombres de productos:

    π(cod_producto, nombre)(PRODUCTOS)

📌 4. A partir del siguiente modelo ER, crea el modelo relacional

Profesor(dni, nombre)
Asignatura(cod_asig, nombre)
Imparte(dni, cod_asig, horario)

🧩 Criterio de Evaluación: CE4.2 – Se han transformado las entidades y relaciones en tablas relacionales.

-- Tablas base para entidades
PROFESOR (
    dni VARCHAR(9) PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    fecha_contratacion DATE,
    departamento VARCHAR(50)
)

ASIGNATURA (
    cod_asig VARCHAR(10) PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    creditos INT,
    curso VARCHAR(20)
)

-- Tabla para relación IMPARTE (considerando que es N:M con atributo)
IMPARTE (
    dni VARCHAR(9),
    cod_asig VARCHAR(10),
    horario VARCHAR(50) NOT NULL,
    aula VARCHAR(20),
    semestre VARCHAR(20),
    PRIMARY KEY (dni, cod_asig, horario),
    FOREIGN KEY (dni) REFERENCES PROFESOR(dni)
        ON DELETE CASCADE,
    FOREIGN KEY (cod_asig) REFERENCES ASIGNATURA(cod_asig)
        ON DELETE CASCADE
)

-- Ejemplo de índices para mejorar consultas frecuentes
CREATE INDEX idx_profesor_nombre ON PROFESOR(nombre);
CREATE INDEX idx_asignatura_curso ON ASIGNATURA(curso);
                

📌 5. Analiza el siguiente esquema y normalízalo

CLIENTE(id, nombre, producto, precio)

🧩 Criterio de Evaluación: CE4.4 – Se han detectado dependencias funcionales y aplicado normalización.

Proceso de normalización:

  1. Problema detectado: La tabla mezcla datos de clientes con datos de productos/ventas, creando redundancia.
  2. 1FN (Primera Forma Normal): Ya está en 1FN (no hay grupos repetitivos).
  3. 2FN (Segunda Forma Normal): Hay dependencias parciales (producto y precio dependen solo de parte de la clave).

Solución normalizada:

-- Tabla CLIENTE (datos del cliente)
CLIENTE (
    id INT PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    direccion VARCHAR(200),
    telefono VARCHAR(15),
    email VARCHAR(100)
)

-- Tabla PRODUCTO (catálogo de productos)
PRODUCTO (
    cod_producto VARCHAR(10) PRIMARY KEY,
    nombre VARCHAR(100) NOT NULL,
    descripcion TEXT,
    precio DECIMAL(10,2) NOT NULL,
    categoria VARCHAR(50)
)

-- Tabla VENTA (transacciones)
VENTA (
    id_venta INT PRIMARY KEY,
    id_cliente INT,
    fecha DATE NOT NULL,
    total DECIMAL(10,2),
    FOREIGN KEY (id_cliente) REFERENCES CLIENTE(id)
)

-- Tabla DETALLE_VENTA (productos por venta)
DETALLE_VENTA (
    id_venta INT,
    cod_producto VARCHAR(10),
    cantidad INT NOT NULL,
    precio_unitario DECIMAL(10,2) NOT NULL,
    descuento DECIMAL(5,2) DEFAULT 0,
    PRIMARY KEY (id_venta, cod_producto),
    FOREIGN KEY (id_venta) REFERENCES VENTA(id_venta),
    FOREIGN KEY (cod_producto) REFERENCES PRODUCTO(cod_producto)
)
                

📌 6. Actividad práctica: Dibuja el diagrama ER de un sistema de gestión de cursos, con instructores, cursos y alumnos

🧩 Criterio de Evaluación: CE2.3 – Se han representado gráficamente las entidades y relaciones.

Diagrama Entidad-Relación para Gestión de Cursos

ENTIDADES PRINCIPALES:
----------------------
INSTRUCTOR (
    id_instructor*: INT
    nombre: VARCHAR(100)
    especialidad: VARCHAR(50)
    email: VARCHAR(100)
    telefono: VARCHAR(15)
)

ALUMNO (
    id_alumno*: INT
    nombre: VARCHAR(100)
    apellidos: VARCHAR(100)
    fecha_nacimiento: DATE
    direccion: VARCHAR(200)
)

CURSO (
    id_curso*: INT
    titulo: VARCHAR(100)
    descripcion: TEXT
    duracion_horas: INT
    nivel: VARCHAR(30)
)

AULA (
    id_aula*: VARCHAR(10)
    capacidad: INT
    equipamiento: TEXT
    ubicacion: VARCHAR(50)
)

RELACIONES:
-----------
IMPARTE: INSTRUCTOR → CURSO (1:N)
  - Un instructor puede impartir varios cursos
  - Un curso es impartido por un solo instructor
  - Atributos: periodo_academico, horario

MATRÍCULA: ALUMNO → CURSO (M:N)
  - Un alumno puede matricularse en varios cursos
  - Un curso puede tener muchos alumnos matriculados
  - Implementada como tabla intermedia:
    MATRICULA (
      id_alumno*: INT (FK)
      id_curso*: INT (FK)
      fecha_matricula: DATE
      calificacion: DECIMAL(3,1)
      estado: VARCHAR(20)
      PRIMARY KEY (id_alumno, id_curso)
    )

ASIGNADO: CURSO → AULA (M:N)
  - Un curso puede asignarse a varias aulas (ej. teoría y laboratorio)
  - Un aula puede albergar varios cursos en distintos horarios
  - Tabla intermedia:
    HORARIO (
      id_curso*: INT (FK)
      id_aula*: VARCHAR(10) (FK)
      dia_semana: VARCHAR(10)
      hora_inicio: TIME
      hora_fin: TIME
      PRIMARY KEY (id_curso, id_aula, dia_semana)
    )

ENTIDADES DÉBILES:
------------------
MODULO (
    id_modulo*: INT
    id_curso*: INT (FK)
    nombre: VARCHAR(100)
    descripcion: TEXT
    PRIMARY KEY (id_modulo, id_curso)
)
                
↑ volver