Materias · 🏛️ Universidad y trabajo

Bases de datos

Ejercicios resueltos de Bases de datos paso a paso, con el error que más se comete en cada uno: Normalización, Índices y rendimiento de consultas y más. Gratis y en español.

Preguntarle al tutor de Bases de datos

Sin instalar nada. Puedes probar antes de crear cuenta.

Ejercicios resueltos de Bases de datos

Resueltos paso a paso, como te los explicaría el tutor, y con el error que más se comete.

Normalización

Una tabla única llamada pedidos tiene estas columnas: id_pedido, fecha, id_cliente, nombre_cliente, ciudad_cliente, id_producto, nombre_producto, precio_unitario, cantidad. Llévala a tercera forma normal y explica qué problema concreto evita cada paso.

Cómo se resuelve

  1. 1Antes de aplicar ninguna regla hay que saber cuál es la clave, porque las tres formas normales se definen contra ella. Una fila de esta tabla no es un pedido: es una línea de pedido, porque un pedido con tres productos ocupa tres filas. La clave es la pareja (id_pedido, id_producto).
  2. 2Primera forma normal: ya se cumple. Pide que cada celda guarde un solo valor, y aquí ninguna columna trae listas ni valores repetidos adentro. Es el paso que casi siempre está resuelto de entrada y en el que no hay nada que hacer.
  3. 3Segunda forma normal: prohíbe que una columna dependa de SOLO UNA PARTE de la clave compuesta. fecha, id_cliente, nombre_cliente y ciudad_cliente dependen únicamente de id_pedido, así que se van a una tabla pedidos(id_pedido, fecha, id_cliente, nombre_cliente, ciudad_cliente). Y nombre_producto depende únicamente de id_producto, así que se va a productos(id_producto, nombre, precio_actual). Lo que queda con la clave completa es pedido_items(id_pedido, id_producto, cantidad).
  4. 4Eso es lo que evita la 2FN: hoy, un pedido de tres productos repite tres veces la fecha y el nombre del cliente, y nada impide que las tres copias terminen distintas.
  5. 5Tercera forma normal: prohíbe que una columna que no es clave dependa de OTRA columna que tampoco es clave. En la tabla pedidos, nombre_cliente y ciudad_cliente dependen de id_cliente, que no es la clave. Se llevan a clientes(id_cliente, nombre, ciudad) y en pedidos queda solo id_cliente.
  6. 6Ahora la excepción, que es lo que separa a quien entiende de quien aplica reglas de memoria: precio_unitario NO se va a productos, se queda en pedido_items con el nombre precio_cobrado.
  7. 7La razón: el precio del catálogo cambia con el tiempo; el precio que se le cobró a ese cliente ese día es un hecho del pedido y no puede volver a moverse nunca. No es redundancia, es un dato histórico.

Respuesta: Cuatro tablas: clientes(id, nombre, ciudad), productos(id, nombre, precio_actual), pedidos(id, fecha, id_cliente) y pedido_items(id_pedido, id_producto, cantidad, precio_cobrado). Corregir el nombre de un cliente pasa a ser una sola fila en vez de cientos, y deja de ser posible que quede escrito de dos formas distintas.

El error de siempre: Normalizar también el precio y leerlo siempre desde productos con un join. El día que suban los precios, todas las facturas viejas cambian solas, los totales históricos dejan de cuadrar con la contabilidad y no hay forma de reconstruir lo que realmente se cobró. La normalización se aplica a los datos que describen algo; los que registran lo que pasó en un momento se congelan a propósito.

Índices y rendimiento de consultas

Una tabla de facturas tiene 5 millones de filas con 5 años de historia, y el 60% de ellas son de Bogotá. La consulta filtra WHERE ciudad = 'Bogotá' AND fecha BETWEEN el primero y el último día de un mes, y tarda 9 segundos leyendo la tabla completa. Ya existe un índice sobre ciudad y el motor no lo usa. ¿Por qué, y qué índice conviene?

Cómo se resuelve

  1. 1Se mira la selectividad de cada condición, que es la fracción de filas que sobrevive al filtro. Como el 60% de las facturas son de Bogotá, el índice de ciudad señalaría 3 millones de las 5 millones de filas.
  2. 2Usar ese índice obliga a saltar a la tabla una vez por cada fila señalada, y eso son 3 millones de accesos aleatorios. El planificador calcula que leer la tabla de corrido sale más barato y por eso descarta el índice. No está fallando: está acertando.
  3. 3La condición selectiva es la fecha: un mes de 5 años es 1 de 60, o sea 5.000.000 ÷ 60 = unas 83.000 filas. Ese sí es un filtro que vale la pena.
  4. 4Se crea un índice compuesto, y el orden de las columnas decide si funciona: primero las columnas de igualdad, de último la de rango. Queda (ciudad, fecha).
  5. 5Con ese orden el motor se posiciona en el bloque de Bogotá y dentro de él recorre un rango de fechas contiguo, y se lleva las 83.000 filas seguidas.
  6. 6Con el orden contrario, (fecha, ciudad), el rango de fechas abre muchos valores distintos de la primera columna y la segunda ya no sirve para acotar: tocaría revisar una por una las filas del rango para ver cuáles son de Bogotá.

Respuesta: Un índice compuesto (ciudad, fecha): la columna de igualdad primero y la de rango de última. El índice suelto sobre ciudad no se usa porque señala el 60% de la tabla y el motor prefiere leerla completa.

El error de siempre: Crear un índice por columna y suponer que el motor los combina. Casi siempre escoge uno solo y descarta el resto, así que dos índices sueltos no equivalen a uno compuesto. Y cada índice de más se paga en cada INSERT y en cada UPDATE, que es como una tabla de escritura intensa termina lenta por exceso de índices que nadie usa.

¿Y si tu ejercicio no es ninguno de estos?

No hace falta buscar el ejercicio exacto en internet. Trae el tuyo, o pide los que te falten.

Todo esto es gratis y sin instalar nada. Puedes probar antes de crear cuenta.

Lo que cubre

  • Normalización
  • Índices y rendimiento de consultas

Preguntas que le puedes hacer

  • NormalizaciónExplícame «Normalización» con un ejemplo práctico y dime en qué suele equivocarse la gente.
  • Índices y rendimiento…Explícame «Índices y rendimiento de consultas» con un ejemplo práctico y dime en qué suele equivocarse la gente.

Cómo enseña este tutor

Es riguroso y completo: justifica cada paso y nombra el teorema, la norma o la buena práctica que está aplicando, para que puedas citarla en tu trabajo o en el parcial.

  • · Te muestra el camino completo, no solo el resultado.
  • · Si algo no te cuadra, te lo explica otra vez de otra manera.
  • · Con una foto de tu cuaderno te dice dónde está el error.
  • · Te arma quizzes de lo que acabas de ver para saber si de verdad quedó.

Otras materias de Universidad y trabajo