1255 palabras
6 minutos
Justificacion del Diseno de la Base de Datos - Pillam Ltd. Co.

Justificacion del Diseno de la Base de Datos - Pillam Ltd. Co.#

Diagrama del modelo de datos

1. Tabla escola#

Por que existe?#

El enunciado (seccion 2) define las Escoles como entidad independiente que agrupa sectores y vias. El requisito “No poden existir enlloc dues Escoles amb el mateix nom” exige una tabla dedicada con unicidad en el nombre.

Campos#

CampoTipoJustificacion
id (PK)SERIALID numerico auto-incremental, mas eficiente que usar el nombre como PK para FK y joins.
nom (NN, UNIQUE)TEXTNOT NULL y UNIQUE porque no pueden existir dos escuelas con el mismo nombre.
aproximacioTEXT”Breu descripcio de com arribar”. Texto libre.
nombre_viesINTEGER”Numero total de vies”. Entero = cantidad.
popularitatTEXTTres valores: baixa, mitjana, alta. CHECK constraint en la BD.
restriccionsTEXT”Prohibicions durant certes epoques de l’any”. Texto libre.

Campos excluidos#

  • Coordenades: tachado en el enunciado. Solo los sectores tienen ubicacion; la escuela es un concepto de agrupacion.
  • Lloc (Poblacio): tachado en el enunciado.

2. Tabla sector#

Por que existe?#

El enunciado (seccion 3) define los Sectors como entidad separada: “Cada Escola tindra 1 o varis Sectors”. Son subdivisiones fisicas de una escuela (ej: Montserrat -> Vinya Nova, Collbato, Can Jorba). Tabla necesaria para:

  1. Almacenar coordenadas geograficas (solo aplican a sectores).
  2. Garantizar nombres unicos dentro de cada escuela.
  3. Tener restricciones y popularidad propias por sector.

Campos#

CampoTipoJustificacion
id (PK)SERIALEl nombre no es unico globalmente (dos escuelas podrian tener un sector “Nord”), necesitamos ID propio.
nom (NN)TEXTObligatorio. La combinacion (nom + escola_id) debe ser unica (restriccion del enunciado).
latitudDECIMAL”Coordenades: (Latitud, Longitud)” solo para sectores. DECIMAL por precision.
longitudDECIMALComplementa latitud para la ubicacion geografica.
aproximacioTEXT”Breu descripcio de com arribar”. Cada sector puede tener acceso diferente.
nombre_viesINTEGER”Numero total de vies” dentro del sector.
popularitatTEXTMismos valores que escola (baixa/mitjana/alta) con CHECK. Puede diferir de su escuela.
restriccionsTEXTRestricciones propias (ej: sector cerrado en invierno por nidificacion).
escola_id (FK)INTEGERN:1 con escola. Cada sector pertenece a exactamente una escuela.

Por que N:1?#

Un sector pertenece a una sola escuela. No tiene sentido que “Vinya Nova” pertenezca a dos escuelas.


3. Tabla via#

Por que existe?#

Las Vies son la entidad central (secciones 1.1, 1.2, 1.3). Los tres tipos (esportiva, classica, gel) comparten casi todos los atributos, por eso usamos una sola tabla con campo tipus en vez de tres tablas:

  1. Campos casi identicos -> evitamos duplicacion.
  2. Consultas como “cercar vies per dificultat” no requieren UNION.
  3. Las diferencias (anclajes, rango de longitud) se gestionan con CHECK o a nivel de aplicacion.

Campos#

CampoTipoJustificacion
id (PK)SERIALIdentificador unico.
nomTEXTCada via tiene “nom propi”. Los largos individuales no tienen nombre, la via si.
llargadaINTEGER5-30m (deportivas), 15-300m (clasicas/gel). Para clasicas/gel es la longitud total; el detalle por largo va en tabla llarg.
grau_dificultatTEXTEscala: 4, 4+, 5, 5+, 6a…9c+. TEXT por combinar numeros y letras. Regex tachada, se valida en aplicacion.
orientacioTEXTN, NE, NO, SE, SO, E, O, S. Regex tachada, pero aplicamos CHECK constraint por ser valores cerrados.
estatTEXTApte, Construccio, Tancada con CHECK. Al pasar a Construccio/Tancada se registra el momento.
data_canvi_estatTIMESTAMPRegistra cuando cambio de estado. TIMESTAMP por necesitar fecha y hora.
tipusTEXTesportiva, classica, gel con CHECK. Permite filtrar y aplicar reglas por tipo.
ancoratgeTEXT”Cada via te un sol tipus d’ancoratge”. Deportivas: punts, parabolics, quimics. Clasicas/gel: + friends, fisures, bagues, pitons, Tricams, BigBros.
sector_id (FK)INTEGERN:1 con sector. “Cada Sector tindra 1 o varies vies”.
creada_per_id (FK)INTEGERN:1 con escalador. “L’escalador ha d’apareixer a la BDD o sino donar d’alta”.

Campos excluidos#

  • Lloc: tachado para los tres tipos.
  • Tipus de roca: tachado para los tres tipos.
  • Coordenades: tachadas. Las vias heredan ubicacion del sector.

Por que apunta a sector y no a escola?#

Jerarquia: Escola -> Sector -> Via. El sector ya indica la escuela; poner escola_id en via seria redundante.


4. Tabla llarg#

Por que existe?#

Las vias clasicas se componen de “diversos llargs (L1, L2, L3…)” que pueden superar 50m. Las de gel tambien tienen tramos. Tabla separada porque:

  1. Numero variable de largos por via (1, 2, 5, 10…).
  2. Cada largo tiene su propia longitud.
  3. Relacion 1 que no cabe en un solo campo.

Las vias deportivas NO tienen largos (un solo tramo de 5-30m).

Campos#

CampoTipoJustificacion
id (PK)SERIALIdentificador unico.
numeroINTEGERNumero del largo (1, 2, 3… = L1, L2, L3). Permite ordenar secuencialmente.
llargadaINTEGER”La Llargada s’haura de definir per a cada Llarg (Tram)”. Cada largo tiene su longitud.
via_id (FK)INTEGERN:1 con via. Cada largo pertenece a una sola via.

5. Tabla escalador#

Por que existe?#

El enunciado (seccion 4) define los Escaladors como entidad propia, referenciados desde via.creada_per_id y necesarios para el CRUD que pide el enunciado.

Campos#

CampoTipoJustificacion
id (PK)SERIALIdentificador unico.
nomTEXT”Nom de l’escalador”.
aliesTEXT”Alies de l’escalador”. Apodo/nickname.
edatINTEGER”Edat de l’escalador”. Entero = anos.
nivellTEXT”Nivell maxim que ha assolit, de 4 a 9c+”. TEXT por formato numeros + letras.
estil_preferitTEXTTres opciones: esportiva, classica, gel. Se puede aplicar CHECK como en via.tipus.
via_maxim_id (FK)INTEGERN:1 con via. “Nom de la via on ha assolit el nivell maxim”. Multiples escaladores pueden referenciar la misma via.

Campos excluidos#

  • Historial: tachado (marcado PENDENT).
  • Fita: tachado (marcado PENDENT).

Resumen de Relaciones#

RelacionTipoJustificacion
sector.escola_id -> escola.idN:1”Cada Escola tindra 1 o varis Sectors”. Un sector pertenece a una escuela.
via.sector_id -> sector.idN:1”Cada Sector tindra 1 o varies vies”. Una via pertenece a un sector.
via.creada_per_id -> escalador.idN:1El creador debe existir en la BD. Un escalador puede crear multiples vias.
llarg.via_id -> via.idN:1Vias clasicas/gel tienen multiples largos. Cada largo pertenece a una via.
escalador.via_maxim_id -> via.idN:1Cada escalador referencia su via de nivel maximo. Multiples escaladores pueden apuntar a la misma via.

Jerarquia del Modelo#

Escola (1) ---> (N) Sector (1) ---> (N) Via (1) ---> (N) Llarg
|
| creada_per
v
Escalador
|
| via_maxim
v
Via

Decisiones de Diseno Clave#

  1. Una sola tabla via para los 3 tipos: Atributos casi identicos + consultas sin UNION. Las diferencias se gestionan con tipus y logica de aplicacion.

  2. Tabla llarg separada: Numero variable de tramos con longitud propia. Relacion 1 que no cabe en un campo.

  3. Coordenadas solo en sector: Tachadas en escola y via. La escuela agrupa; la via hereda ubicacion del sector.

  4. creada_per_id como FK: El enunciado exige que el escalador creador exista en la BD -> integridad referencial.

  5. CHECK constraints en vez de regex: El enunciado tacha regex, pero para campos con valores cerrados (popularitat, orientacio, estat, tipus) usamos CHECK, mas simple y directo. Solo grau_dificultat se valida en aplicacion por su rango extenso (4…9c+).


SQL de Creacion de Tablas#

-- =========================
-- ESCOLA
-- =========================
CREATE TABLE escola (
id SERIAL PRIMARY KEY,
nom TEXT UNIQUE NOT NULL,
aproximacio TEXT,
nombre_vies INTEGER,
popularitat TEXT CHECK (popularitat IN ('baixa', 'mitjana', 'alta')),
restriccions TEXT
);
-- =========================
-- SECTOR
-- =========================
CREATE TABLE sector (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
latitud DECIMAL,
longitud DECIMAL,
aproximacio TEXT,
nombre_vies INTEGER,
popularitat TEXT CHECK (popularitat IN ('baixa', 'mitjana', 'alta')),
restriccions TEXT,
escola_id INTEGER,
CONSTRAINT fk_sector_escola
FOREIGN KEY (escola_id)
REFERENCES escola(id)
ON DELETE CASCADE
);
-- =========================
-- ESCALADOR
-- =========================
CREATE TABLE escalador (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
alies TEXT,
edat INTEGER,
nivell TEXT,
estil_preferit TEXT,
via_maxim_id INTEGER
);
-- =========================
-- VIA
-- =========================
CREATE TABLE via (
id SERIAL PRIMARY KEY,
nom TEXT NOT NULL,
llargada INTEGER,
grau_dificultat TEXT,
orientacio TEXT CHECK (orientacio IN ('N','NE','NO','SE','SO','E','O','S')),
estat TEXT CHECK (estat IN ('Apte','Construccio','Tancada')),
data_canvi_estat TIMESTAMP,
tipus TEXT CHECK (tipus IN ('esportiva','classica','gel')),
ancoratge TEXT,
sector_id INTEGER,
creada_per_id INTEGER,
CONSTRAINT fk_via_sector
FOREIGN KEY (sector_id)
REFERENCES sector(id)
ON DELETE CASCADE,
CONSTRAINT fk_via_escalador
FOREIGN KEY (creada_per_id)
REFERENCES escalador(id)
ON DELETE SET NULL
);
-- =========================
-- LLARG
-- =========================
CREATE TABLE llarg (
id SERIAL PRIMARY KEY,
numero INTEGER,
llargada INTEGER,
via_id INTEGER,
CONSTRAINT fk_llarg_via
FOREIGN KEY (via_id)
REFERENCES via(id)
ON DELETE CASCADE
);
-- =========================
-- RELACION ESCALADOR -> VIA (MAXIMO)
-- =========================
ALTER TABLE escalador
ADD CONSTRAINT fk_escalador_via_maxim
FOREIGN KEY (via_maxim_id)
REFERENCES via(id)
ON DELETE SET NULL;

Notas sobre el SQL#

  • Dependencia circular: via referencia escalador y viceversa. Se resuelve creando escalador primero sin la FK, y anadiendo fk_escalador_via_maxim con ALTER TABLE al final.
  • CHECK constraints: En popularitat, orientacio, estat y tipus para restringir valores en BD.
  • ON DELETE CASCADE: Refleja la jerarquia Escola -> Sector -> Via -> Llarg. Borrar un padre borra sus hijos.
  • ON DELETE SET NULL: En via.creada_per_id y escalador.via_maxim_id. No queremos borrar una via porque se elimine un escalador, ni viceversa.
Justificacion del Diseno de la Base de Datos - Pillam Ltd. Co.
https://blog.lucialv.com/posts/justificacio_db/
Autor
Lucía
Publicado el
2026-04-14
Licencia
CC BY-NC-SA 4.0