<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# Solució DDL Ciclisme
<div class="text-end fit-content ms-auto my-3 mt-auto pt-3">
<p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p>
<p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p>
<p><strong>Curs:</strong> 2024/2025</p>
</div>
<div>
<p class="fw-bold mb-0">Llicència: BY-NC-SA</p>
<p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank">
<img class="mx-auto" src="/itb/images/license.png" alt="Licence"/>
</a>
</div><!--license-->
</div><!--cover-->
</div><!--page-->
{:toc}
## Objectius
L'objectiu d'aquest exercici és practicar en definir un model relacional en una base de dades relacional
a partir del Diagrama d'Entitat Relació i el Model Relacional.
## Enunciat
Crea la base de dades __ciclisme__ i defineix les taules necessàries
per emmagatzemar correctament la informació.
Totes les sentències per la creacó de la base de dades i les taules han de ser
especificades en un únic fitxer anomenat __create_schema_ciclisme.sql__, que ha
de poder executar-se directament en el SGBD sense cap error.
### Diagrama Entitat Relació
::: note
La relació __Porta__ entre _Mallot - Ciclista - Etapa_ es una relació ternària.
La cardinalitat es correspon a:
- Un ciclista pot portar un mallot en moltes etapes.
- Un ciclista en una etapa pot portar diferents mallot.
- En una etapa, un mallot sols pot ser portat per un ciclista.
Més info: https://stackoverflow.com/questions/18365870/er-diagram-ternary-relationship-how-to-read-properly
::: warning
La cardinalitat ha segut canviada en l'enunciat després de la pràctica.
:::
{.center}
### Model Relacional
- [EQUIP]{.blue}(++[#nom]{.red}++, entrenador)
- [CICLISTA]{.blue}(++[#dorsal]{.red}++, nom, edat, _equip([EQUIP]{.blue}:[#nom]{.red})_)
- [ETAPA]{.blue}(++[#id_etapa]{.red}++, inici, final, km, _dorsal_guanyador([CICLISTA]{.blue}:[#dorsal]{.red})_)
- [PORT_MUNTANYA]{.blue}(++[#nom]{.red}++, categoria, altura, pendent, _id_etapa([ETAPA]{.blue}:[#id_etapa]{.red})_, _dorsal_guanyador([CICLISTA]{.blue}:[#dorsal]{.red})_)
- [MALLOT]{.blue}(++[#id_mallot]{.red}++, tipus, color, premi)
- [PORTA]{.blue}(++_[#id_etapa]{.red}([ETAPA]{.blue}:[#id_etapa]{.red})_++, ++_[#id_mallot]{.red}([MALLOT]{.blue}:[#id_mallot]{.red})_++, _dorsal_ciclista([CICLISTA]{.blue}:[#dorsal]{.red})_)
### Taules i consideracions
Crea les següents taules en la base de dades __ciclisme__.
| Taula | Camp | Tipus | Descripció | Restriccions |
| --------------- | ------------------- | ------------ | ----------- | ----------- |
| equip | nom | varchar(25) | Nom de l'equip | |
| ^^ | entrenador | varchar(50) | Nom de l'entrenador de l'equip | |
| ciclista | dorsal | int | Dorsal del ciclista | No pot ser negatiu |
| ^^ | nom | varchar(25) | Nom del ciclista | NN |
| ^^ | edat | int | Edat del ciclista | NN |
| ^^ | equip | varchar(25) | Equip del ciclista | |
| etapa | id_Etapa | int | ID de l'etapa | |
| ^^ | km | int | Quilòmetres de l'etapa | NN, No pot ser negatiu |
| ^^ | inici | varchar(50) | Municipi on comença l'etapa | NN |
| ^^ | final | varchar(50) | Municipi on acaba l'etapa | NN |
| ^^ | dorsal_guanyador | int | Ciclista que ha guanyat l'etapa | |
| mallot | id_mallot | char(3) | ID del mallot | |
| ^^ | color | varchar(30) | Color del mallot | NN |
| ^^ | tipus | varchar(30) | Tipus de mallot | NN, No pot ser negatiu |
| ^^ | premi | int | Premi en diners per portar el mallot | No pot ser negatiu |
| port_muntanya | nom | varchar(30) | Nom del port de muntanya | |
| ^^ | altura | int | Altura del port de muntanya | NN |
| ^^ | categoria | char | Categoria del port de muntanya | |
| ^^ | pendent | decimal(4,2) | Pendent mitjanca del port de muntanya en % | No pot ser negativa. No pot ser major de 100 |
| ^^ | etapa | int | Etapa on està inclòs el port de muntanya | |
| ^^ | dorsal_guanyador | int | Ciclista que ha guanyat el port de muntanya | |
| porta | id_etapa | int | Etapa en la qual un ciclista porta un mallot | |
| ^^ | id_mallot | char(3) | Jersei portat per un ciclista en una etapa | |
| ^^ | dorsal_ciclista | int | Ciclista que porta un mallot en una etapa | |
::: note
- Heu de respectar el nom de les taules i el noms dels atributs.
- __NN__: `NOT NULL`
- No s'han especificat totes les restriccions que haurien d'existir.
- Heu de respectal al màxim possible les cardinalitats del model proposat.
- Podeu utilitzar `NOT NULL` o `UNIQUE` quan cregueu necessari.
:::
## Definició de la base de dades Ciclisme
```sql
drop database if exists ciclisme;
create database ciclisme;
use ciclisme;
create table equip (
nom varchar(25) primary key,
entrenador varchar(50) not null
);
create table ciclista (
dorsal int unsigned primary key,
nom varchar(50) not null,
edat int unsigned not null,
equip varchar(25) not null,
foreign key (equip) references equip (nom)
);
create table etapa (
id_etapa int primary key auto_increment,
inici varchar(50) not null,
final varchar(50) not null,
km int unsigned not null,
ciclista_guanyador int unsigned not null,
foreign key (ciclista_guanyador) references ciclista (dorsal)
);
create table port_muntanya (
nom varchar(30) primary key,
altura int unsigned not null,
categoria enum('E', '1', '2', '3') not null,
pendent decimal(4, 2) not null check (pendent >= 0 and pendent <= 100),
id_etapa int not null,
ciclista_guanyador int unsigned not null,
foreign key (id_etapa) references etapa (id_etapa),
foreign key (ciclista_guanyador) references ciclista (dorsal)
);
create table mallot (
id_mallot char(3) primary key,
color varchar(30) not null,
tipus varchar(30) not null,
premi int unsigned not null
);
create table porta (
dorsal_ciclista int unsigned not null,
id_etapa int not null,
id_mallot char(3) not null,
primary key(id_etapa, id_mallot),
foreign key (dorsal_ciclista) references ciclista (dorsal),
foreign key (id_etapa) references etapa (id_etapa),
foreign key (id_mallot) references mallot (id_mallot)
);
```
## Bibliografia
Aquest material és propietat del profesorat de "Bases de Dades i Sistemes d'Informació".
Escola Tècnica Superior d'Enginyeria Informàtica. Universitat Politècnica de València.
Adaptat per <a href="/about/">Joan Puigcerver</a>
## Llicència
Aquest material és propietat del profesorat de "Bases de Dades i Sistemes d'Informació".
Escola Tècnica Superior d'Enginyeria Informàtica. Universitat Politècnica de València.
© Tots els drets reservats.
No es permet la còpia ni redistribució d'aquest material.