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.
- Escuche el audio con la pantalla apagada.
- Obtenga un certificado al finalizar.
- ¡Más de 5000 cursos para que explores!
Descargar la aplicación
| Operación | Pregunta guía | Impacto 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 registradasJustificació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 cursoDecisió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 < xPunto 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 claveAlternativa: 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 descEjercicio 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.