Bases de Datos Relacionales, NoSQL, Álgebra Relacional y MongoDB

Informática y Telecomunicaciones16,71 KB

Ejercicios de Álgebra Relacional

A continuación se detallan las operaciones algebraicas para resolver cada una de las consultas sobre la base de datos universitaria relacional:

  1. Enunciado: Encontrar los estudiantes (ci_estudiante, nombre) de la carrera "Ingeniería" que estén inscriptos en materias dictadas por docentes de grado "Titular".

    A = σ carrera="Ingeniería" (Estudiante)
    B = π ci_docente (σ grado="Titular" (Docente))
    C = A ⋈ Inscripcion ⋈ Materia ⋈ B
    Resultado = π ci_estudiante, nombre (C)
  2. Enunciado: Encontrar las materias (codigo_materia, nombre_materia) que no tengan estudiantes inscriptos.

    A = π codigo_materia, nombre_materia (Materia)
    B = π codigo_materia, nombre_materia (Materia ⋈ Inscripcion)
    Resultado = A − B
  3. Enunciado: Encontrar los docentes (ci_docente, nombre) que dictan materias en las que hay al menos una inscripción con estado "Aprobado".

    A = σ estado="Aprobado" (Inscripcion)
    B = A ⋈ Materia ⋈ Docente
    Resultado = π ci_docente, nombre (B)
  4. Enunciado: Encontrar las materias (codigo_materia, nombre_materia) que sean dictadas por docentes de grado "Titular" o que tengan al menos una inscripción con estado "Aprobado".

    A = π codigo_materia, nombre_materia (Materia ⋈ σ grado="Titular" (Docente))
    B = π codigo_materia, nombre_materia (Materia ⋈ σ estado="Aprobado" (Inscripcion))
    Resultado = A ∪ B
  5. Enunciado: Encontrar los docentes (ci_docente, nombre) que dictan todas las materias en las que está inscripto el estudiante con ci_estudiante = "12345678".

    A = π codigo_materia (σ ci_estudiante="12345678" (Inscripcion))
    B = π ci_docente, codigo_materia (Materia)
    C = B ÷ A
    Resultado = π ci_docente, nombre (Docente ⋈ C)
  6. Enunciado: Encontrar los estudiantes (ci_estudiante, nombre) de la carrera "Ingeniería" que estén inscriptos en al menos una materia dictada por un docente de grado "Titular" y que además tengan al menos una inscripción con estado "Aprobado".

    A = σ carrera="Ingeniería" (Estudiante)
    B = π ci_estudiante, nombre (A ⋈ Inscripcion ⋈ Materia ⋈ π ci_docente (σ grado="Titular" (Docente)))
    C = π ci_estudiante, nombre (A ⋈ σ estado="Aprobado" (Inscripcion))
    Resultado = B ∩ C
  7. Enunciado: Encontrar los estudiantes (ci_estudiante, nombre) que estén inscriptos en todas las materias dictadas por docentes de grado "Titular".

    A = π codigo_materia (Materia ⋈ π ci_docente (σ grado="Titular" (Docente)))
    B = π ci_estudiante, codigo_materia (Inscripcion)
    C = B ÷ A
    Resultado = π ci_estudiante, nombre (Estudiante ⋈ C)

MongoDB: Definición y Consultas

1. Creación de la Base de Datos e Inserción de Documentos

// Selección de base de datos
use gestion_empresa

// Colección empresas
db.empresas.insertMany([
  {
    _id: 1,
    nombre: "TechUY",
    rubro: "Software",
    sedes: [
      {
        ciudad: "Montevideo",
        direccion: "Av. 18 de Julio 1234"
      }
    ]
  },
  {
    _id: 2,
    nombre: "SoftwareSur",
    rubro: "Software",
    sedes: [
      {
        ciudad: "Montevideo",
        direccion: "Av. 18 de Julio 1234"
      }
    ]
  }
]);

// Colección empleados
db.empleados.insertMany([
  {
    _id: 101,
    nombre: "Juan",
    departamento: "Tecnología",
    habilidades: ["JavaScript", "MongoDB"],
    sueldo: 90000,
    empresa_id: 1
  }
]);

2. Consultas en MongoDB

Gestión de Empleados y Empresas

  • Mostrar todos los empleados que trabajen en el departamento "Tecnología":

    db.empleados.find({
      departamento: "Tecnología"
    });
  • Mostrar todos los empleados que tengan simultáneamente las habilidades "JavaScript" y "MongoDB":

    db.empleados.find({
      habilidades: {
        $all: ["JavaScript", "MongoDB"]
      }
    });
  • Mostrar todos los empleados del departamento "Tecnología" que tengan un sueldo mayor a 80000:

    db.empleados.find({
      departamento: "Tecnología",
      sueldo: { $gt: 80000 }
    });
  • Mostrar las empresas del rubro "Software" que tengan una misma sede en "Montevideo" ubicada en la dirección "Av. 18 de Julio 1234":

    db.empresas.find({
      rubro: "Software",
      sedes: {
        $elemMatch: {
          ciudad: "Montevideo",
          direccion: "Av. 18 de Julio 1234"
        }
      }
    });
  • Pipeline de agregación: Mostrar los empleados que trabajan en empresas del rubro "Software", proyectando el nombre del empleado, su departamento y el nombre de la empresa:

    db.empleados.aggregate([
      {
        $lookup: {
          from: "empresas",
          localField: "empresa_id",
          foreignField: "_id",
          as: "empresa"
        }
      },
      {
        $unwind: "$empresa"
      },
      {
        $match: {
          "empresa.rubro": "Software"
        }
      },
      {
        $project: {
          _id: 0,
          nombre: 1,
          departamento: 1,
          "empresa.nombre": 1
        }
      }
    ]);

Consultas Adicionales de Ejemplo

  • Mostrar personajes con las habilidades "Beber cerveza" y "Consumo de rosquillas":

    db.personajes.find({
      habilidades: {
        $all: ["Beber cerveza", "Consumo de rosquillas"]
      }
    });
  • Mostrar personajes del sector "Seguridad" con radiación acumulada superior a 16000:

    db.personajes.find({
      sector: "Seguridad",
      radiacion_acumulada: { $gt: 16000 }
    });
  • Mostrar lugares del rubro "Bares" con sede en "Springfield" en "Calle 57 Walnut":

    db.lugares.find({
      rubro: "Bares",
      sedes: {
        $elemMatch: {
          ciudad: "Springfield",
          direccion: "Calle 57 Walnut"
        }
      }
    });

3. Resumen de Métodos y Operadores en MongoDB

  • use <database>: Seleccionar o crear el contexto de una base de datos.
  • insertMany(): Inserta múltiples documentos en una colección.
  • find(): Consulta y filtra documentos.
  • $eq: Compara igualdad de valores.
  • $gt / $gte: Operador de comparación mayor que / mayor o igual que.
  • $lt / $lte: Operador de comparación menor que / menor o igual que.
  • $in: Coincide con cualquiera de los valores especificados en un arreglo.
  • $all: Comprueba que un arreglo contenga todos los elementos especificados.
  • $elemMatch: Filtra documentos cuando al menos un subdocumento o elemento de arreglo cumple con múltiples criterios combinados.
  • $lookup: Realiza una unión externa izquierda (left outer join) hacia otra colección.
  • $unwind: Descompone un campo matricial para generar un documento por cada elemento.
  • $match: Filtra documentos dentro de una etapa de agregación.
  • $project: Selecciona, suprime o calcula los campos que se transferirán a la siguiente etapa.
  • $group: Agrupa documentos según un identificador especificado.
  • $sum: Suma valores numéricos o totaliza documentos.
  • $avg: Calcula el promedio aritmético de valores.
  • $sort: Ordena el conjunto de resultados (1 ascendente, -1 descendente).
  • $limit: Restringe el número de documentos devueltos.

Criterios de Selección del Motor de Base de Datos

  • Caso 1: Gestión académica (estudiantes, docentes, inscripciones, previaturas, escolaridades y consistencia estricta).
    Solución: Base de datos relacional (ej. MySQL, PostgreSQL).
    Justificación: Existe un alto grado de interrelación entre entidades y se requiere estricta integridad referencial y transaccional (propiedades ACID) para evitar inconsistencias de datos.
    Clave: Relaciones complejas + consistencia transaccional.
  • Caso 2: Plataforma de contenidos de cursos con estructuras heterogéneas (videos, enlaces, PDF, criterios variables).
    Solución: Base de datos documental (ej. MongoDB).
    Justificación: Permite esquemas dinámicos y flexibles donde cada documento puede contener atributos diferentes sin imponer esquemas fijos a toda la colección.
    Clave: Esquema flexible + datos semiestructurados.
  • Caso 3: Manejo de sesiones, tokens de autenticación, preferencias volátiles y datos con expiración (TTL).
    Solución: Base de datos clave-valor en memoria (ej. Redis).
    Justificación: Otorga latencias de lectura/escritura ultrabajas y soporta expiración nativa mediante Time-To-Live (TTL).
    Clave: Alto rendimiento + acceso por clave + datos volátiles.
  • Caso 4: Red de investigación, recomendaciones académicas, coautorías y tutorías.
    Solución: Base de datos de grafos (ej. Neo4j).
    Justificación: Modela de forma nativa nodos y aristas para optimizar la navegación de conexiones complejas y transversales sin recurrir a costosas operaciones de join.
    Clave: Densidad de interconexiones + análisis de grafos.
  • Caso 5: Registro de auditoría y telemetría cronológica (logs, accesos, interacción con recursos).
    Solución: Base de datos de series temporales (ej. InfluxDB, TimescaleDB).
    Justificación: Especializada en gestionar flujos continuos de datos marcados con marca temporal (timestamp) para análisis retrospectivo y agregaciones temporales continuas.
    Clave: Marcas temporales + análisis evolutivo temporal.
  • Caso 6: Emisión de credenciales universitarias, títulos y certificados verificables e inalterables.
    Solución: Registro distribuido inmutable (Blockchain / DLT).
    Justificación: Garantiza la inmutabilidad y transparencia de las operaciones mediante consenso descentralizado y firmas criptográficas, evitando la adulteración de certificaciones históricas.
    Clave: Trazabilidad + inmutabilidad criptográfica.

Preguntas Teóricas sobre Paradigmas de Bases de Datos

  1. ¿Qué significa el escalado en bases de datos y qué variantes existen?
    El escalado consiste en incrementar la capacidad de cómputo y almacenamiento de una base de datos para responder a mayores volúmenes de consultas, usuarios o datos. Se divide en:

    • Escalado vertical (scale-up): Incremento de los recursos de hardware (CPU, memoria RAM, discos SSD) dentro del mismo servidor físico o instancia. Posee límites físicos y de costo.
    • Escalado horizontal (scale-out): Incorporación de múltiples nodos que distribuyen el procesamiento y los datos coordinadamente a través de una red.
  2. Explique una de las 4 V del movimiento NoSQL:
    El Volumen cuantifica la escala masiva de datos generados continuamente. Las tecnologías NoSQL surgen principalmente para almacenar y procesar terabytes o petabytes de manera distribuida y con alta disponibilidad, mitigando las limitaciones del almacenamiento centralizado.

  3. ¿Qué significa NoSQL y por qué surge?
    NoSQL significa "Not Only SQL" (no solo SQL). Surge para resolver las dificultades impuestas por los límites del escalado vertical de las bases de datos relacionales tradicionales ante sistemas distribuidos modernos con alta demanda de concurrencia y variedad estructural.

  4. ¿Cuáles son las 4 V del movimiento NoSQL?

    • Volumen: Magnitud cuantitativa del almacenamiento de datos.
    • Velocidad: Tasa de generación, procesamiento y transformación de los datos en tiempo real.
    • Variedad: Diversidad estructural (datos estructurados, semiestructurados y no estructurados).
    • Valencia: Complejidad y densidad de interconexiones que unen las entidades de datos.
  5. ¿Qué significa la valencia de los datos?
    La valencia describe la intensidad y frecuencia con la que los datos se vinculan internamente entre sí. A mayor número de interconexiones efectivas frente a las posibles (por ejemplo, grafos densos de redes sociales), mayor es la valencia de ese dominio de datos.

  6. ¿Cuál es la diferencia entre una base de datos relacional y una documental?
    Una base relacional organiza la información en tablas de esquema rígido con filas y columnas ligadas por claves foráneas, mientras que una documental encapsula datos jerárquicos o anidados en formatos como BSON/JSON dentro de colecciones, permitiendo esquemas dinámicos.

  7. ¿Qué es un esquema dinámico en una base de datos documental?
    Es la capacidad donde los documentos de una misma colección no requieren homogeneidad en sus propiedades, pudiendo albergar tipos y campos distintos sin necesidad de migraciones globales del esquema (por ejemplo, atributos técnicos para productos electrónicos y atributos de indumentaria para vestimenta).

  8. ¿Qué es el sharding y para qué sirve?
    El sharding es una técnica de particionamiento horizontal donde el conjunto de datos de una base de datos se fragmenta lógicamente y se distribuye entre múltiples nodos físicos independientes (shards). Sirve para equilibrar la carga de operaciones de I/O y asegurar el crecimiento distribuido horizontalmente.

  9. ¿Qué diferencia hay entre una tabla SQL y una colección de MongoDB?
    En el modelo relacional tradicional existen tablas, filas (tuplas) y columnas estructuradas rígidamente. En MongoDB existen colecciones, documentos y campos, donde cada documento puede variar su estructura.

  10. ¿Qué es una base de datos clave-valor y para qué se utiliza?
    Es un motor de almacenamiento que persiste datos indexados mediante un identificador o clave única asociada a un dato arbitrario (binario, texto, JSON). Se utiliza fundamentalmente para motores de caché, gestión rápida de sesiones web y tablas de enrutamiento con lectura por clave primaria directa.

  11. ¿Qué es una base de datos de grafos y cuándo conviene utilizarla?
    Es un sistema de gestión de bases de datos que modela las entidades como nodos y las relaciones directas como aristas (con propiedades asociadas). Resulta ideal cuando la complejidad y el coste computacional radican en la navegación profunda de relaciones (redes sociales, motores de recomendación, detección de fraude).

  12. ¿Qué es una base de datos de series temporales?
    Es un motor especializado en almacenar secuencias ordenadas de eventos donde el eje central es la marca de tiempo (timestamp). Facilita operaciones analíticas de series cronológicas, métricas de infraestructura, IoT y cotizaciones bursátiles.

  13. ¿Qué es una base de datos basada en Blockchain?
    Es una estructura de datos descentralizada, distribuida e inmutable regida por mecanismos de consenso criptográfico. Solo admite operaciones de inserción continua (append-only), garantizando un historial inviolable y auditable de transacciones.

  14. ¿Qué ventajas tienen las bases de datos documentales?
    Sobresalen por su flexibilidad de esquema, correspondencia natural con objetos en lenguajes de programación modernos, soporte para estructuras complejas anidadas y facilidad intrínseca para aplicar escalamiento horizontal mediante particionado (sharding).

Descargar

PDF Word HTML