Pla de Redisseny de Base de Dades
Objectiu: preparar un esquema de dades sòlid per donar suport a events, venues, locations, classes i un model de dances més ric, mantenint compatibilitat progressiva amb l’MVP actual.
Aquest pla no és una migració concreta, sinó un full de ruta tècnic per a la BD.
1. Abast del redisseny
1.1. Domini d’ubicacions i events
- Introduir una entitat clara d’event i una cadena:
event → venue → location.
- Revisar el model actual de
venuesilocations:- claus forànies,
- normalització (evitar duplicats de ciutats/països),
- polítiques ON DELETE coherents,
- índexs per cerca i filtres (ciutat, país, tipus, etc.).
1.2. Dances (balls)
- Revisar i completar els camps de
dances:- tècnics:
counts,walls,level,tags,style,bpm?,year?. - metadades: origen, país, notes, referències externes.
- tècnics:
- Decidir on van les etiquetes i camps flexibles:
- camps simples (
TEXT/VARCHAR), - o taules auxiliars (p. ex.
dance_tags), - o bé un camp
metadata JSONBper dades molt obertes.
- camps simples (
- Clarificar noms i tipus:
- evitar abreviatures confuses,
- triar tipus adequats (
TEXTvsVARCHAR(n),TIMESTAMPTZ, etc.).
1.3. Classes
Nova entitat classes per gestionar classes en venues:
classes( id, venue_id, instructor_id?, -- futur: relació amb persona/usuari dance_id?, -- ball principal o focus start_at, end_at, capacity?, notes? )
Punts a decidir:
- política d’eliminació (
ON DELETE SET NULLvsRESTRICT), - índexs per data (
start_at,end_at) ivenue_id, - futur suport per recurrència (classes setmanals).
1.4. Revisió global d’índexs i constraints
- Índexs per:
- cerques de text (noms de balls, cançons, coreògrafs, ciutats…),
- filtres freqüents (nivell, any, país).
- Claus forànies consistents:
- totes amb índex implícit o explícit.
- Nullability ben definida:
- només
NULLon tingui sentit.
- només
- Timestamps consistents:
created_atiupdated_ata totes les entitats principals,- triggers o lògica d’aplicació per mantenir
updated_at.
2. Model proposat (esborrany)
Nota: això no és un DDL definitiu, sinó una guia conceptual per al disseny ERD i les futures migracions.
2.1. Location i Venue
locations(
id,
country,
region?,
city,
state?,
lat?,
lng?,
created_at,
updated_at
)
venues(
id,
name,
location_id,
address?,
postal_code?,
venue_type?, -- sala de ball, bar, club, festival venue...
notes?,
created_at,
updated_at
)
Relacions:
venues.location_id → locations.id(ON DELETE RESTRICToON DELETE SET NULL).
Índexs recomanats:
idx_locations_city_country,idx_venues_location_id.
2.2. Events
events(
id,
venue_id,
name,
description?,
event_type?, -- social, festival, workshop...
start_at,
end_at?,
website_url?,
created_at,
updated_at
)
Relacions:
events.venue_id → venues.id(ON DELETE RESTRICT).
Futur:
- taula d’
occurrencessi un event té múltiples dates/slots.
2.3. Classes
classes(
id,
venue_id,
instructor_id?, -- pot apuntar a persona/usuari
dance_id?, -- ball principal
start_at,
end_at,
capacity?,
notes?,
created_at,
updated_at
)
Relacions:
classes.venue_id → venues.id(ON DELETE RESTRICT),classes.dance_id → dances.id(ON DELETE SET NULL).
Índexs recomanats:
idx_classes_venue_date (venue_id, start_at).
2.4. Dances (refinament)
Conceptes a fixar:
- camps obligatoris (nom, nivell),
- camps tècnics (
counts,walls,tags,bpm,year), - relació amb coreògraf (si no està ja clar).
Exemple simplificat:
dances(
id,
name,
level,
walls?,
counts?,
bpm?,
year?,
choreographer_id?,
tags?, -- p. ex. array de TEXT o taula auxiliar
style?,
notes?,
created_at,
updated_at
)
Relació:
dances.choreographer_id → choreographers.id(ON DELETE SET NULL).
Les decisions concretes (tipus, longituds, constraints) s’acabaran de definir a:
- l’ERD detallat,
- els scripts Flyway corresponents.
3. Estratègia de migració (Flyway)
Objectius:
- no trencar l’MVP actual,
- aplicar canvis de forma incremental,
- permetre backfill de dades.
3.1. Fases proposades
V19__add_locations_and_venues.sql- crear taules
locationsivenues, - opcionalment, migrar dades existents de “local”/“ciutat” si n’hi ha.
- crear taules
V20__add_events.sql- crear taula
eventsvinculada avenues.
- crear taula
V21__add_classes.sql- crear taula
classes, - afegir índexs bàsics per data i venue.
- crear taula
V22__refine_dances.sql- afegir/ajustar camps de
dances, - posar valors per defecte i fer backfill si cal.
- afegir/ajustar camps de
V23__indexes_and_constraints.sql- afegir índexs de cerca (
pg_trgm), - afinar constraints (
NOT NULL,ON DELETE, etc.).
- afegir índexs de cerca (
3.2. Backfill i compatibilitat
Si hi ha dades existents:
- scripts per agrupar venues per ciutat/país,
- assignar
location_idon sigui possible, - deixar
location_idaNULLquan no es pugui inferir.
Compatibilitat:
- les API que només llegeixen
dancesisongshan de continuar funcionant, - els nous camps de
danceshan de tenir defaults raonables (0,NULL, etc.), - els nous endpoints per
events/classeses poden introduir progressivament.
4. Índexs i rendiment
Criteris generals:
- Totes les claus forànies han d’estar indexades (explícitament o implícitament).
- Afegir índexs específics per:
- cerques de text, p. ex.:
pg_trgmsobredances.name,choreographers.name,locations.city, etc.;
- filtres per dates (
events.start_at,classes.start_at); - combinacions freqüents (
venue_id + start_at).
- cerques de text, p. ex.:
5. Criteris d’acceptació
Es considera que el redisseny està “acceptat” quan:
- Esquemes i relacions definits i consensuats:
- ERD actualitzat (p. ex.
diagrams/architecture/entity-relationship.mmd).
- ERD actualitzat (p. ex.
- Migracions Flyway noves (V19+) creades i testejades en local.
- Cap regressió funcional a:
- llistats i fitxes de
dancesisongs, - parts de l’MVP ja presents en test/producció.
- llistats i fitxes de
- Documentació actualitzada:
- aquest document,
architecture/architecture-overview.md,- qualsevol diagrama afectat.
6. Riscos i mitigacions
6.1. Canvis de FK que bloquegin eliminacions
- Definir
ON DELETEclarament (RESTRICTvsSET NULL). - Preparar scripts per:
- netejar registres orfes,
- o reassociar registres abans d’enforçar constraints.
6.2. Registres existents amb valors inconsistents
- Revisar dades abans d’imposar
NOT NULL. - Identificar registres problemàtics amb queries d’auditoria.
6.3. Rendiment
- Fer proves de càrrega bàsiques un cop aplicats els índexs.
- Monitoritzar queries lentes (p. ex. amb
pg_stat_statements).
7. Estat i properes decisions
Punts que s’han de tancar abans de passar a implementació:
- Definir completament els camps per a
eventsiclasses. - Tancar el model de
dancesrefinat (nivells, tags, camps tècnics). - Aprovar polítiques
ON DELETEper a totes les FKs noves. - Definir l’ordre final i dependències de les migracions Flyway.
- Actualitzar ERD i diagrames un cop aprovades les decisions.
Quan aquest pla estigui aprovat, el següent pas serà implementar les migracions Flyway i revisar que tot s’alinea amb:
- el model funcional,
- el roadmap tècnic,
- i les necessitats reals de dades del producte.