Diseño lógico de soluciones: transformar requisitos en estructuras de datos básicas

Capítulo 8

Tiempo estimado de lectura: 9 minutos

+ Ejercicio

Del enunciado al modelo: pensar en entidades, atributos y operaciones

Diseñar lógicamente una solución significa traducir un requisito escrito (lo que el sistema “debe hacer”) a un modelo de datos (qué información se guardará y cómo se organizará) y a un conjunto de operaciones (qué acciones serán frecuentes o críticas). En este capítulo el foco no es aprender nuevas estructuras, sino aprender a decidir cuáles usar y por qué, a partir de un texto.

Vocabulario de modelado (lo mínimo para decidir bien)

  • Entidad: “cosa” del mundo real sobre la que guardas información (Alumno, Producto, Evaluación, Documento).
  • Atributo: dato que describe a la entidad (nombre, id, stock, nota).
  • Colección: grupo de entidades o valores (lista de alumnos, diccionario de productos).
  • Clave: atributo que identifica de forma única (código de producto, matrícula, DNI). Puede ser compuesta (curso+fecha).
  • Operaciones principales: acciones que se repiten o son críticas (buscar por clave, agregar, eliminar, actualizar, contar, ordenar, filtrar).

Guía paso a paso para convertir enunciados a estructuras

Usa este proceso cada vez que recibas un requisito. La idea es que puedas justificar tu elección con base en: unicidad, orden, acceso por clave y operaciones críticas.

Paso (a): listar datos (sustantivos y números del enunciado)

Subraya sustantivos (posibles entidades) y números/campos (posibles atributos). Luego escribe una lista de “datos a guardar”.

Ejemplo de extracción rápida (plantilla):
- Entidades: ...
- Atributos por entidad: ...
- Eventos/acciones: ...
- Restricciones: ... (único, obligatorio, rango, etc.)

Paso (b): decidir si son únicos u ordenados

  • Únicos: si no debe repetirse (código de producto, matrícula). Esto empuja a usar claves y estructuras que eviten duplicados.
  • Ordenados: si importa el orden (por fecha, por llegada, por ranking). Esto empuja a mantener secuencias o a ordenar cuando se necesite.

Paso (c): definir claves (y claves compuestas si hace falta)

Pregunta: “¿Cómo identifico un elemento sin ambigüedad?” Si el enunciado no lo dice, propón una clave. Si una sola no alcanza, combina.

Ejemplos de claves:
- Alumno: matricula
- Producto: sku
- Asistencia: (curso_id, fecha, matricula)
- Calificación: (matricula, evaluacion_id)

Paso (d): elegir operaciones críticas (buscar/agregar/eliminar/actualizar/contar)

Haz una lista corta de operaciones y marca cuáles serán frecuentes. Esto define el “centro” del diseño.

Continúa en nuestra aplicación.
  • Escuche el audio con la pantalla apagada.
  • Obtenga un certificado al finalizar.
  • ¡Más de 5000 cursos para que explores!
O continúa leyendo más abajo...
Download App

Descargar la aplicación

OperaciónPregunta guíaImpacto en el diseño
Buscar¿Se consulta por clave o por atributo?Acceso por clave vs recorridos/filtrado
Agregar¿Se agregan muchos elementos?Validar duplicados, inicializar estructuras
Eliminar¿Se elimina por clave?Necesidad de localizar rápido el elemento
Actualizar¿Qué campos cambian?Ubicar y modificar sin romper consistencia
Contar/Resumir¿Se requieren totales o frecuencias?Acumuladores, diccionarios de conteo

Paso (e): escoger estructura y justificar

Con los pasos anteriores, redacta una justificación de 2–3 líneas: “Elijo X porque…”. Evita justificar por costumbre (“porque siempre uso listas”). Justifica por operaciones y restricciones.

Plantilla de justificación:
- Estructura elegida: ...
- Porque necesito: (buscar por clave / evitar duplicados / mantener orden / contar frecuencias)
- Claves definidas: ...
- Operaciones críticas optimizadas: ...

Ejercicios integradores (escenarios progresivos)

1) Control de asistencia

Enunciado: “Registrar asistencia de alumnos por clase. Cada clase tiene fecha y curso. Para cada alumno se guarda presente/ausente. Se debe poder: marcar asistencia, consultar asistencia de un alumno en un curso, y obtener el porcentaje de asistencia por alumno.”

Aplicación del proceso

  • (a) Datos: curso_id, fecha, alumno(matricula, nombre opcional), estado_asistencia (P/A).
  • (b) Único/orden: una asistencia por (curso_id, fecha, matricula) debe ser única. El orden por fecha puede importar para reportes.
  • (c) Claves: clave compuesta (curso_id, fecha, matricula).
  • (d) Operaciones críticas: marcar (agregar/actualizar), consultar por alumno+curso, calcular porcentaje (contar presentes / total clases).
  • (e) Estructura: diccionario indexado por curso y alumno para consultas rápidas; o por clase para carga rápida. Decide según la consulta más frecuente.

Modelo sugerido A (optimiza consulta por alumno en un curso)

asistencia = {
  curso_id: {
    matricula: {
      fecha: True/False
    }
  }
}

Operaciones:
- marcar(curso, matricula, fecha, estado): asistencia[curso][matricula][fecha] = estado
- porcentaje(curso, matricula): contar True / total fechas registradas

Justificación: acceso directo por curso y matrícula para consultar historial; la fecha queda como clave para evitar duplicados por día.

Modelo sugerido B (optimiza carga por clase)

asistencia = {
  (curso_id, fecha): {
    matricula: True/False
  }
}

Operaciones:
- marcar(curso, fecha, matricula, estado)
- listar_presentes(curso, fecha)
- porcentaje requiere recorrer fechas del curso

Decisión: elige A si la consulta por alumno es lo más frecuente; elige B si se trabaja principalmente “por clase del día”.

Ejercicio práctico

  • Define cuál modelo (A o B) usarías si el sistema se usa en aula para pasar lista y luego casi no se consulta individualmente. Justifica con operaciones.
  • Agrega una restricción: “no se puede marcar dos veces la misma fecha”. Explica cómo tu clave lo evita.

2) Catálogo de productos con stock

Enunciado: “Gestionar productos con SKU único, nombre, precio y stock. Se debe: agregar producto, actualizar stock, eliminar producto, buscar por SKU y listar productos con stock bajo (menor a X).”

Aplicación del proceso

  • (a) Datos: sku, nombre, precio, stock.
  • (b) Único/orden: SKU único. El orden no es requisito (listar puede ordenarse después si se pide).
  • (c) Clave: sku.
  • (d) Operaciones críticas: buscar/actualizar por sku (muy frecuente), listar por condición (stock < X).
  • (e) Estructura: diccionario sku → datos del producto.
productos = {
  "SKU123": {"nombre": "Mouse", "precio": 12.5, "stock": 30},
  "SKU999": {"nombre": "Teclado", "precio": 25.0, "stock": 5}
}

Operaciones:
- agregar(sku, datos): validar que sku no exista
- actualizar_stock(sku, delta o nuevo_valor)
- eliminar(sku)
- stock_bajo(x): recorrer productos y filtrar stock < x

Punto de decisión: la lista de “stock bajo” requiere recorrido; si fuera extremadamente frecuente y el catálogo enorme, podrías mantener una colección adicional (por ejemplo, un conjunto de SKU con stock bajo) y actualizarla cuando cambie el stock. En este nivel, basta con filtrar al momento.

Ejercicio práctico

  • Propón una validación al agregar: “precio > 0 y stock ≥ 0”. ¿Dónde la aplicarías y por qué?
  • Diseña una operación “vender(sku, cantidad)” que reduzca stock y evite stock negativo. Indica qué pasa si el SKU no existe.

3) Registro de calificaciones

Enunciado: “Registrar notas por alumno y evaluación. Cada evaluación tiene id, nombre y fecha. Se necesita: cargar nota, modificar nota, obtener promedio por alumno, y listar notas de una evaluación.”

Aplicación del proceso

  • (a) Datos: alumno(matricula), evaluación(evaluacion_id, nombre, fecha), nota.
  • (b) Único/orden: una nota por (matricula, evaluacion_id) debe ser única. El orden por fecha puede ser útil para reportes.
  • (c) Clave: (matricula, evaluacion_id) o estructura separada por alumno o por evaluación.
  • (d) Operaciones críticas: cargar/modificar (actualizar), promedio por alumno (agrupar por alumno), listar por evaluación (agrupar por evaluación).
  • (e) Estructura: aquí hay dos consultas principales; elige el índice principal y acepta recorrer para la otra, o mantén dos índices si el volumen lo justifica.

Modelo sugerido (optimiza promedio por alumno)

notas = {
  matricula: {
    evaluacion_id: 0.0
  }
}

evaluaciones = {
  evaluacion_id: {"nombre": "Parcial 1", "fecha": "2026-03-10"}
}

Operaciones:
- cargar_nota(matricula, evaluacion_id, nota)
- promedio(matricula): promedio de valores en notas[matricula]
- notas_de_evaluacion(evaluacion_id): recorrer alumnos y tomar quienes tengan esa clave

Alternativa: si lo más frecuente es “listar notas de una evaluación”, invierte el índice: evaluacion_id → {matricula: nota}.

Ejercicio práctico

  • Elige un índice principal (por alumno o por evaluación) para un colegio donde los docentes consultan constantemente “mi evaluación” y rara vez “promedio por alumno”. Justifica.
  • Agrega una regla: “la nota va de 0 a 10”. ¿En qué operación la controlas?

4) Análisis simple de texto con frecuencias

Enunciado: “Dado un texto, calcular la frecuencia de cada palabra. Debe ignorar mayúsculas/minúsculas y signos básicos. Luego mostrar las 5 palabras más frecuentes.”

Aplicación del proceso

  • (a) Datos: texto, palabras normalizadas, conteos.
  • (b) Único/orden: las palabras son únicas como claves; el resultado final requiere ordenar por frecuencia (orden derivado).
  • (c) Clave: palabra normalizada.
  • (d) Operaciones críticas: contar ocurrencias (incrementar), ordenar por conteo para top 5.
  • (e) Estructura: diccionario palabra → conteo.
frecuencias = {
  "hola": 3,
  "mundo": 1
}

Proceso típico:
1) normalizar: pasar a minúsculas
2) limpiar: reemplazar signos por espacios (según reglas)
3) separar en palabras
4) acumular: frecuencias[palabra] += 1
5) obtener top 5: ordenar pares (palabra, conteo) por conteo desc

Ejercicio práctico

  • Define una regla de limpieza mínima (por ejemplo, quitar “.,;:!?”). Explica cómo afecta el conteo.
  • ¿Qué decisión tomarías con palabras vacías (artículos como “el”, “la”)? Indica si las filtras o no, y por qué según el objetivo.

Autoevaluación práctica (decisiones y justificación)

Responde justificando cada elección con: (1) clave(s), (2) operaciones críticas, (3) por qué esa estructura facilita esas operaciones.

  • 1) “Guardar turnos médicos: cada turno tiene fecha, hora, paciente_id y médico_id. Se consulta por médico para ver su agenda del día y se reprograma un turno.” ¿Cuál sería tu clave? ¿Indexarías por médico o por turno?
  • 2) “Sistema de biblioteca: registrar préstamos (libro_id, socio_id, fecha_prestamo, fecha_devolucion). Se necesita saber si un libro está prestado y listar préstamos vencidos.” ¿Qué estructura usarías para responder rápido ‘¿está prestado?’ y cómo obtendrías vencidos?
  • 3) “Chat simple: guardar mensajes en orden por sala. Se busca el último mensaje y a veces se elimina un mensaje por id.” ¿Qué estructura principal usarías y qué dato adicional agregarías para poder eliminar por id sin recorrer todo?
  • 4) “Encuesta: cada persona responde una sola vez. Se requiere contar cuántas respuestas por opción y evitar duplicados por persona_id.” ¿Qué clave evita duplicados? ¿Cómo modelas el conteo?
  • 5) “Inventario por almacén: cada almacén tiene productos con cantidades. Se consulta cantidad de un producto en un almacén y se mueve stock entre almacenes.” Define claves y estructura. Indica qué operaciones deben ser atómicas (consistentes) a nivel lógico.

Ahora responde el ejercicio sobre el contenido:

En un sistema de control de asistencia, se registra presente/ausente por clase y alumno, y una restricción indica que no se puede marcar dos veces la misma fecha para el mismo curso y alumno. ¿Qué decisión de modelado asegura mejor esa unicidad y además facilita consultas directas por alumno en un curso?

¡Tienes razón! Felicitaciones, ahora pasa a la página siguiente.

¡Tú error! Inténtalo de nuevo.

Indexar por curso y matrícula permite acceder sin recorrer colecciones al historial de un alumno. Al usar la fecha como clave (o una clave compuesta equivalente), no puede existir más de un registro para el mismo día, evitando duplicados.

Portada de libro electrónico gratuitaEstructuras de datos básicas para lógica de programación: variables, listas y diccionarios
100%

Estructuras de datos básicas para lógica de programación: variables, listas y diccionarios

Nuevo curso

8 páginas

Descarga la aplicación para obtener una certificación gratuita y escuchar cursos en segundo plano, incluso con la pantalla apagada.