Módulo 2 · Bases de datos

Lección 08 — Modelado de datos

Normalización, relaciones y cuándo desnormalizar: el diseño como consecuencia de las invariantes.

Publicada
En esta lección
  1. Ejercicio 1 — Auditoría de normalización
  2. Ejercicio 2 — Snapshot vs derivado
  3. Ejercicio 3 — Tarjeta regalo (nueva entidad)
  4. Ejercicio 4 — Polimórfico bajo juicio
  5. Ejercicio 5 — Auditoría en tu BD real
  6. Entrega

Papel y SQL; solo el último ejercicio toca tu TicketFlow real. No mires solutions.md hasta entregar.

Ejercicio 1 — Auditoría de normalización

Revisa el modelo v1 de la 00b campo a campo y responde:

  1. ¿Hay alguna dependencia transitiva (3FN rota)? Justifica cada sospecha.
  2. Payment.gateway_reference (lo que devuelve la pasarela): ¿dato, snapshot o derivado? ¿Y si la pasarela permite actualizar la referencia después?
  3. ¿Dónde pondrías event.slug (para URLs) y qué constraint exige?

Ejercicio 2 — Snapshot vs derivado

  1. Añadir "total de la reserva" (reservation.total) — ¿snapshot, derivado o calculado al vuelo? Decide y justifica con el patrón de lectura/escritura de TicketFlow.
  2. Propón cómo mantenerlo si lo materializas (trigger, save() del modelo, o nunca) y qué invariante protege.

Ejercicio 3 — Tarjeta regalo (nueva entidad)

TicketFlow quiere vender tarjetas regalo: código canjeable por saldo, aplicable a una reserva como método de pago parcial.

  1. Modela la entidad (campos, claves, estados) y su relación con Payment.
  2. ¿Puede una tarjeta pagarse en dos reservas (saldo parcial)? ¿Qué constraint lo permite/prohíbe?
  3. ¿Dónde registras los movimientos de saldo y por qué NO en un solo campo balance?

Ejercicio 4 — Polimórfico bajo juicio

Un compañero propone añadir descuentos con una tabla discount(code, related_type, related_id, pct), donde related_* apunta a evento, a usuario o a "global".

  1. Enumera los problemas concretos de ese diseño (integridad, consultas, índices).
  2. Rediseña: qué tablas crearías y cómo aplicarías un descuento a una reserva.
  3. ¿Y si el descuento se aplica a UNA reserva concreta (cupón de uso único)? ¿Cambia el diseño?

Ejercicio 5 — Auditoría en tu BD real

En tu TicketFlow:

  1. \d+ events_seat (o introspección por Django): ¿los tipos son los elegidos conscientemente o heredados?
  2. ¿Hay columnas NULL que en realidad nunca son NULL? ¿Hay is_* que ya son estados escondidos?
  3. Escribe una lista "para la revisión del modelo" de 3 mejoras concretas (no las apliques todavía: la Lección 11 las convierte en migraciones).

Entrega

Pega el diseño de la tarjeta regalo (SQL o descripción) y la lista de mejoras. Después: Lección 09 — Índices y EXPLAIN.