<div class="page"> <div class="cover text-center"> <img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo"> # Transformació de Model Entitat Relació a Model Relacional <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> 2023/2024</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} ## Introducció En aquest material ens centrarem en les regles generals per transformar un Model Entitatt Relació a un Model Relacional on les dades s'emmagatzemaran en __taules relacionals__. ## Entitats regulars Totes les __entitats regulars o fortes__ es transformen en una __taula relacional__, on cada atribut està definit en les columnes de la taula. El nom de les taules és en majúscula, i el nom dels atributs en minúscula i sense espais. ::: tip Si una entitat o atribut està composta per diferents paraules, podeu utilitzar la convenció __snake\_case__, on cada paraula està separada per guions baixos. ::: Les claus primàries es mantenen en els dos models. Per norma general, totes les __taules relacionals__ necessiten una clau primària per identificar els seus elements. Si no s'ha definit una __clau primària__ en el model entitat relació, es pot crear una clau primària "fictícia", com `id` o `ref`. ::: example ![](/itb/DAM-BD/UD3/img/cotxe.png){.center} L'entitat __Cotxe__ es traduiria com: - COTXE(++#matricula++, marca, model, km, data_compra) - ++matricula++ és la clau primària. Aquesta taula podria contindre diversos elements o ocurrències: | Taula Cotxe ||||||| | #Matrícula | N. Bastidor | Marca | Model | Km | Data compra | | :- | :- | :- | :- | :- | :- | :- | | 4231 KJL | 16483920 | Ford | Focus | 39031 | 08/12/2000 | | 4078 CMP | 23948756 | Ford | Fiesta | 10542 | 02/01/2001 | | 3091 LSF | 12347003 | Volkswagen | Golf | 8065 | 02/04/2001 | | 7012 DLM | 84012398 | Peugeot | 207 | 48623 | 28/11/2001 | | 3877 FFT | 74832134 | Audi | Q2 | 57737 | 05/12/2001 | | 1034 KMC | 56481093 | BMW | X3 | 8480 | NULL | {.center} ::: ## Relacions La transformació de les relacions del model ER no és directa, i la transformació es realitzarà de diferents maneres, segons el tipus de relació, el grau i la cardinalitat. Per norma general, totes les relacions poden ser modelades utilitzant una taula relacional. No obstant això, el fet de combinar moltes taules és una operació costosa i pot afectar el rendiment de la base de dades. ### Taula relacional addicional. Cardinalitat M:N Les relacions binàries de cardinalitat __M:N__, és a dir, __molts a molts__, sempre es convertiran en una __taula relacional__ que emmagatzema quins elements de cada taula estan relacionats. En cas que aquesta relació tinga algun __atribut__, també s'afegirà a la taula relacional com una columna. Aquesta estratègia funciona amb qualsevol relació, però cal evitar crear taules innecessàries per evitar una sobrecàrrega en la base de dades. ::: example ![](/itb/DAM-BD/UD3/img/cistella_compra.png){.center} Aquest diagrama es traduiria com: - PRODUCTE(++#id++, nom, preu) - ++id++ és la clau primària. - CISTELLA_COMPRA(++#id++) - ++id++ és la clau primària. - CISTELLA_PRODUCTE(_++#id_cistella(CISTELLA_COMPRA:#id)++_, _++#id_producte(PRODUCTE:#id)++_, unitats) - El conjunt de ++id_cistella++ i ++id_producte++ és la clau primària. - Clau forana _id_cistella_ fa referència a l'atribut ++id++ de la taula __CISTELLA__. - Clau forana _id_producte_ fa referència a l'atribut ++id++ de la taula __PRODUCTE__. Un exemple amb les dades podria ser el següent: <div class="d-flex justify-content-evenly flex-wrap flex-wrap"> | CISTELLA | | ++id++ | | :- | | __1__{.red} | | __2__{.green} | | __3__{.yellow} | | PRODUCTE ||| | ++id++ | Nom | Preu | | :- | :- | :- | | __1__{.red} | Barra de pa | 0.7 | | __2__{.green} | Botella aigua 0.5L | 0.3 | | __3__{.yellow} | Pot Coca-Cola 33 cL | 1.5 | | __4__{.blue} | Napolitana xocolate | 1.5 | | CISTELLA_PRODUCTE ||| | _++id_cistella++_ | _++id_producte++_ | Unitats | | :- | :- | :- | | __1__{.red} | __1__{.red} | 3 | | __1__{.red} | __2__{.green} | 1 | | __1__{.red} | __3__{.yellow} | 1 | | __3__{.yellow} | __2__{.green} | 2 | | __3__{.yellow} | __4__{.blue} | 1 | </div> Aquestes dades representen que existeixen tres cistelles: - __Cistella 1__, que conté: - 3 unitats del __Producte 1: Barra de pa__. - 1 unitat del __Producte 2: Botella aigua 0.5L__. - 1 unitat del __Producte 3: Pot Coca-Cola 33 cL__. - __Cistella 2__, que no conté cap producte. - __Cistella 3__, que conté: - 2 unitats del __Producte 2: Botella aigua 0.5L__. - 1 unitat del __Producte 4: Napolitana Xocolate__. Es pot veure que aquesta estructura permet que una cistella continguen múltiples productes i que un producte pot estar en múltiples cistelles (N:N). ::: ### Propagació de clau forana. Cardinalitat 1:N En les relacions binàries de cardinalitat __1:N__, no és necessari crear una taula relacional addicional. L'entitat que estiga associada a un únic objecte de l'altra entitat, conté la _clau forana_ de l'altra entitat com a atribut. A aquesta tècnica s'anomena __propagació de clau forana__. En el cas que hi haja un atribut en la relació, aquest s'afegiria a la taula que conté la clau forana. Si la cardinalitat és `(0,1)`, la clau forana pot prendre el valor `NULL` per indicar que no té cap element associat de l'altra entitat. En canvi, si la cardinalitat és `(1,1)`, hauríem de definir la restricció `NOT NULL` a la clau forana. ::: example ![](/itb/DAM-BD/UD3/img/persona_cotxe.png){.center} Aquest diagrama es traduiria com: - PERSONA(++#dni++, nom, cognoms) - ++dni++ és la clau primària. - COTXE(++#matricula++, n_bastidor, marca, model, km, _propietari(PERSONA:#dni)_, data_compra) - ++matricula++ és la clau primària. - Clau forana _propietari_ fa referència a l'atribut ++dni++ de la taula __PERSONA__. Un exemple amb dades podria ser: <div class="d-flex justify-content-evenly flex-wrap flex-wrap"> | Taula Persona ||||| | #DNI | Nom | Cognoms | | :- | :- | :- | | __91471118A__{.green} | Carles | Perelló | | __23986973C__{.yellow} | Òscar | Peris | | __24211153L__{.orange} | Andrès | Pastor | | __76064612R__{.blue} | Isabel | Mora | | Taula Cotxe ||||||| | #Matrícula | N. Bastidor | Marca | Model | Km | _Propietari_ | Data compra | | :- | :- | :- | :- | :- | :- | :- | | 4231 KJL | 16483920 | Ford | Focus | 39031 | __91471118A__{.green} | 08/12/2000 | | 4078 CMP | 23948756 | Ford | Fiesta | 10542 | __91471118A__{.green} | 02/01/2001 | | 3091 LSF | 12347003 | Volkswagen | Golf | 8065 | __23986973C__{.yellow} | 02/04/2001 | | 7012 DLM | 84012398 | Peugeot | 207 | 48623 | __24211153L__{.orange} | 28/11/2001 | | 3877 FFT | 74832134 | Audi | Q2 | 57737 | __76064612R__{.blue} | 05/12/2001 | | 1034 KMC | 56481093 | BMW | X3 | 8480 | NULL | NULL | </div> En aquest cas, una persona pot tindre en possessió múltiples cotxes, però un cotxe sols pot tindre un propietari, o no tindre'n cap (`NULL`). ::: ### Cardinalitat 1:1 En les relacions binàries de cardinalitat __1:1__ poden ser resoltes de diverses maneres. #### Combinació de taules En el cas que siga una relació `(1,1)` a `(1,1)`, és a dir, que un objecte d'una entitat __sempre està associat a un i sols un__ element d'una altra entitat, ens podem fer les següents preguntes: - _Té sentit que siguen dues entitats separades?_ - _Cada entitat es relaciona amb altres entitats per si mateixa?_ En cas afirmatiu, aquest mètode no és l'adient. En cas negatiu, es poden combinar les dues entitats en una mateixa taula. ::: example ![](/itb/DAM-BD/UD3/img/conductor.png){.center} Aquest diagrama es pot traduir de les següents dues maneres: - CONDUCTOR(++#dni++, nom, cognoms, n_permis, data_obtencio) - ++`dni`++ és la clau primària. - `n_permis` és una clau alternativa. O bé: - PERMIS(++#n_permis++, data_obtencio, dni, nom, cognoms). - ++`n_permis`++ és la clau primària. - `dni` és una clau alternativa. Un exemple de la primera opció amb dades podria ser: | Taula Conductor ||||| | #DNI | Nom | Cognoms | N. Permís | Data obtenció | | :- | :- | :- | :- | :- | | __91471118A__{.green} | Carles | Perelló | 70594827 | 28/06/2019 | | __23986973C__{.yellow} | Òscar | Peris | 63351206 | 24/02/2020 | | __24211153L__{.orange} | Andrès | Pastor | 80536775 | 16/09/2020 | | __76064612R__{.blue} | Isabel | Mora | 80536775 | 15/07/2021 | {.center} S'han combinat les dues entiats en la mateixa taula. ::: #### Propagació de clau forana De la mateixa manera que hem modelat anteriorment les relacions __1:N__, podem modelar les relacions __1:1__. Aquesta és l'opció més comuna, ja que permet modelar aquesta relació sense necessitat d'una taula relacional addicional i a més permet mantindre la independència entre les dues entitats. En aquest cas, per evitar que múltiples elements puguen estar associats a un mateix element de l'altra entitat, s'ha de definir la restricció `UNIQUE`. A més, aquesta estratègia permet tindre relacions amb cardinalitat `(0,1)`, on quan no hi ha un element associat s'indica amb el valor `NULL`. ::: example ![](/itb/DAM-BD/UD3/img/conductor.png){.center} Aquest diagrama es pot traduir de les següents dues maneres: - CONDUCTOR(++#dni++, nom, cognoms) - ++`dni`++ és la clau primària. - PERMIS(++#n_permis++, data_obtencio, _dni\_conductor(CONDUCTOR:#dni)_) - ++`n_permis`++ és la clau primària. - _`dni_conductor`_ és una clau forana que fa referència a l'atribut ++dni++ de la taula __CONDUCTOR__. Restricció `UNIQUE` per evitar que dos permisos estiguen associats al mateix conductor. O bé: - CONDUCTOR(++#dni++, nom, cognoms, _n\_permis(PERMIS:#n\_permis))_) - ++`dni`++ és la clau primària. - _`n_permis`_ és una clau forana que fa referència a l'atribut ++n_permis++ de la taula __PERMIS__. Restricció `UNIQUE`. Restricció `UNIQUE` per evitar que dos conductors estiguen associats al mateix permís. - PERMIS(++#n_permis++, data_obtencio) - ++`n_permis`++ és la clau primària. Un exemple de la primera opció amb dades podria ser: <div class="d-flex justify-content-evenly flex-wrap flex-wrap"> | Taula Conductor ||| | #DNI | Nom | Cognoms | | :- | :- | :- | | __91471118A__{.green} | Carles | Perelló | | __23986973C__{.yellow} | Òscar | Peris | | __24211153L__{.orange} | Andrès | Pastor | | __76064612R__{.blue} | Isabel | Mora | | Taula Permís ||||| | #N. Permís | Data obtenció | _DNI Conductor_ | | :- | :- | :- | :- | :- | | 70594827 | 28/06/2019 | __91471118A__{.green} | | 63351206 | 24/02/2020 | __23986973C__{.yellow} | | 80536775 | 16/09/2020 | __24211153L__{.orange} | | 80536775 | 15/07/2021 | __76064612R__{.blue} | </div> ::: #### Taula relacional addicional De la mateixa manera que hem modelat anteriorment les relacions __N:N__, podem modelar les relacions __1:1__ mitjançant la creació d'una __taula relacional addicional__. Aquesta és l'opció menys comuna, ja que s'ha de crear una nova taula relacional, quan amb les dues opcions anteriors no ho necessiten. No obstant això, permet mantindre la independència entre les dues entitats. Aquesta estratègia pot ser útil en el cas d'una relació `(0,1)` a `(0,1)` on hi ha __molta dispersió__, és a dir, on molts dels elements de les dues entitats no estan relacionades entre si. En compte de crear una columna amb la clau forana on molts valors seran `NULL`, s'opta per crear una taula per emmagatzemar aquells elements que sí que estan relacionats. En aquest cas, per evitar que múltiples elements puguen estar associats a un mateix element de l'altra entitat, s'ha de definir la restricció `UNIQUE` en les dues claus foranes de la taula relacional addicional. ::: example ![](/itb/DAM-BD/UD3/img/conductor.png){.center} Aquest diagrama es pot traduir de la següent manera mitjançant una taula relacional addicional: - CONDUCTOR(++#dni++, nom, cognoms) - ++`dni`++ és la clau primària. - PERMIS(++#n_permis++, data_obtencio) - ++`n_permis`++ és la clau primària. - CONDUCTOR_PERMIS(++_#dni\_conductor(CONDUCTOR:#dni)_++, ++_#n\_permis(PERMIS:#n\_permis))_++) - El conjunt de ++dni++ i ++n_permis++ és la clau primària. - ++_`dni_conductor`_++ és una clau forana que fa referència a l'atribut ++dni++ de la taula __CONDUCTOR__. Restricció `UNIQUE` per evitar que dos permisos estiguen associats al mateix conductor. - ++_`n_permis`_++ és una clau forana que fa referència a l'atribut ++n_permis++ de la taula __PERMIS__. Restricció `UNIQUE`. Restricció `UNIQUE` per evitar que dos conductors estiguen associats al mateix permís. Un exemple amb dades podria ser: <div class="d-flex justify-content-evenly flex-wrap flex-wrap"> | Taula Conductor ||| | #DNI | Nom | Cognoms | | :- | :- | :- | | __91471118A__{.green} | Carles | Perelló | | __23986973C__{.yellow} | Òscar | Peris | | __24211153L__{.orange} | Andrès | Pastor | | __76064612R__{.blue} | Isabel | Mora | | Taula Conductor/Permís || | _#DNI Conductor_ | _#N. Permís_ | | :- | :- | | __91471118A__{.green} | __70594827__{.green} | | __23986973C__{.yellow} | __63351206__{.yellow} | | __24211153L__{.orange} | __80536775__{.orange} | | __76064612R__{.blue} | __80536775__{.blue} | | Taula Permís || | #N. Permís | Data obtenció | | :- | :- | | __70594827__{.green} | 28/06/2019 | | __63351206__{.yellow} | 24/02/2020 | | __80536775__{.orange} | 16/09/2020 | | __80536775__{.blue} | 15/07/2021 | </div> ::: ## Relacions reflexives Les __relacions reflexives__ es modelen de la mateixa manera que les relacions binàries, i el seu modelatge depén de la cardinalitat d'aquesta relació. ### Cardinalitat 1:N Quan la cardinalitat d'una relació reflexiva és __1:N__ es pot resoldre mitjançant una propagació de la clau forana, on la mateixa entitat té una clau forana que fa referència a l'entitat. ::: example ![](/itb/DAM-BD/UD3/img/empleat_1N.png){.center} Aquest diagrama es pot traduir de la següent manera mitjançant propagació de clau forana: - EMPLEAT(++#dni++, nom, cognoms, _dni_superior(EMPLEAT:#dni)_) - ++`dni`++ és la clau primària. - _`dni_superior`_ és una clau forana que fa referència a l'atribut ++dni++ de la mateixa taula __EMPELAT__. Un exemple amb dades podria ser: | Taula Empleat ||||| | #DNI | Nom | Cognoms | _Superior_ | | :- | :- | :- | :- | | __91471118A__{.green} | Carles | Perelló | NULL | | __23986973C__{.yellow} | Òscar | Peris | __24211153L__{.orange} | | __24211153L__{.orange} | Andrès | Pastor | __91471118A__{.green} | | __76064612R__{.blue} | Isabel | Mora | __91471118A__{.green} | {.center} En aquest cas es modela que: - L'empleat __91471118A__{.green} no té cap superior assignat. És el superior dels empleats: - __24211153L__{.orange} - __76064612R__{.blue} - L'empleat __24211153L__{.orange} està subordinat __91471118A__{.green}. És el superior de l'empleat __23986973C__{.yellow}. ::: ### Cardinalitat N:N Quan la cardinalitat d'una relació reflexiva és __N:N__ es pot resoldre mitjançant una taula relacional addicional, on es referència la mateixa entitat dues vegades. ::: example ![](/itb/DAM-BD/UD3/img/empleat_NN.png){.center} Aquest diagrama es pot traduir de la següent manera mitjançant una taula relacional addicional: - EMPLEAT(++#dni++, nom, cognoms) - ++`dni`++ és la clau primària. - EMPLEAT_SUPERIOR(_++#dni++(EMPLEAT:#dni)_, _++#dni_superior++(EMPLEAT:#dni)_) - El conjunt ++`dni`++ i ++`dni_superior`++ és la clau primària. - _`dni`_ és una clau forana que fa referència a l'atribut ++dni++ de la mateixa taula __EMPELAT__. - _`dni_superior`_ és una clau forana que fa referència a l'atribut ++dni++ de la mateixa taula __EMPELAT__. Un exemple amb dades podria ser: <div class="d-flex justify-content-evenly flex-wrap flex-wrap"> | Taula Empleat |||| | #DNI | Nom | Cognoms | | :- | :- | :- | | __91471118A__{.green} | Carles | Perelló | | __23986973C__{.yellow} | Òscar | Peris | | __24211153L__{.orange} | Andrès | Pastor | | __76064612R__{.blue} | Isabel | Mora | | Taula Empleat/Superior ||||| | _#DNI_ | _#Superior_ | | :- | :- | | __23986973C__{.yellow} | __24211153L__{.orange} | | __24211153L__{.orange} | __91471118A__{.green} | | __76064612R__{.blue} | __91471118A__{.green} | | __76064612R__{.blue} | __24211153L__{.orange} | </div> En aquest cas es modela que: - L'empleat __91471118A__{.green} no té cap superior assignat. És el superior dels empleats: - __24211153L__{.orange} - __76064612R__{.blue} - L'empleat __24211153L__{.orange} està subordinat __91471118A__{.green}. És el superior dels empleats: - __23986973C__{.yellow} - __76064612R__{.blue} ::: ## Grau N Quan el grau de la relació és major a 2, sempre es requereix una taula relacional addicional per emmagatzemar quins elements de cada entitat estan relacionats entre si. Si es necessita definir restriccions de cardinalitat en alguna entitat, es pot utilitzar el `UNIQUE`. ::: example ![](/itb/DAM-BD/UD3/img/medicina.png){.center} Aquest diagrama es pot traduir de la següent manera mitjançant una taula relacional addicional: - METGE(++#dni++, nom, cognoms, especialitat) - ++`dni`++ és una clau primària. - PACIENT(++#dni++, nom, cognoms) - ++`dni`++ és una clau primària. - MEDICINA(++#referencia++, nom) - ++`referencia`++ és una clau primària. - PRESCRIU(_++dni_metge++(METGE:#dni)_, _++#dni_pacient++(PACIENT:#dni)_, _++#medicina++(MEDICINA:#referencia)_, quantitat) - _`dni_metge`_ és una clau forana que fa referència a l'atribut ++dni++ de la taula __METGE__. - _`dni_pacient`_ és una clau forana que fa referència a l'atribut ++dni++ de la taula __PACIENT__. - _`medicina`_ és una clau forana que fa referència a l'atribut ++referencia++ de la taula __MEDICINA__. <div class="d-flex justify-content-evenly flex-wrap"> | Taula Metge ||||| | #DNI | Nom | Cognoms | Especialitat | | :- | :- | :- | :- | | __91471118A__{.green} | Carles | Perelló | Medicina general | | __23986973C__{.orange} | Òscar | Peris | Endocrinologia | | Taula Pacient |||| | #DNI | Nom | Cognoms | | :- | :- | :- | | __24211153L__{.green} | Andrès | Pastor | | __76064612R__{.orange} | Isabel | Mora | | Taula Medicina |||| | #Referència | Nom | | :- | :- | :- | | __3270__{.green} | Ibuprofeno 600 mg | | __658244__{.orange} | Paracetamol 500 mg | | Taula Prescriu |||| | _#DNI Metge_ | _#DNI Pacient_ | _#Referència_ | Quantitat | | :- | :- | :- | :- | | __91471118A__{.green} | __24211153L__{.green} | __3270__{.green} | 1 | | __91471118A__{.green} | __24211153L__{.green} | __658244__{.orange} | 3 | | __91471118A__{.green} | __76064612R__{.orange} | __658244__{.orange} | 2 | | __23986973C__{.orange} | __24211153L__{.green} | __3270__{.green} | 1 | | __23986973C__{.orange} | __76064612R__{.orange} | __658244__{.orange} | 2 | </div> ::: ## Entitats febles Les __entitats febles__ es transformen en una __taula relacional__, on cada atribut està definit en les columnes de la taula. Aquestes entitats estan identificades per una entitat regular i, per tant, necessàriament estan relacionades amb aquesta. Es realitza una __propagació de clau forana__ a l'entitat feble, que a més, serà part de la clau primària juntament amb els __discriminants__. ::: example ![](/itb/DAM-BD/UD3/img/avio.png){.center} Aquest diagrama es pot traduir de la següent manera mitjançant propagació de clau forana: - AVIO(++#codi++, marca, model) - ++`codi`++ és la clau primària. - SEIENT(_++#codi_avio++(AVIO:#codi)_, ++#fila++, ++#lletra++) - El conjunt ++`codi_avio`++, ++`fila`++ i ++`lletra`++ és la clau primària. - _`codi_avio`_ és una clau forana que fa referència a l'atribut ++codi++ de la taula __AVIO__. Un exemple amb dades podria ser: <div class="d-flex justify-content-evenly flex-wrap flex-wrap"> | Taula Avió |||| | #Codi | Marca | Model | | :- | :- | :- | | __RYR3755__{.green} | Boeing | 737-800 | | __VLG1377__{.orange} | Airbus | A320 | | Taula Seient ||||| | _#Codi Avió_ | #Fila | #Lletra | | :- | :- | :- | | __RYR3755__{.green} | 1 | A | | __RYR3755__{.green} | 1 | B | | __RYR3755__{.green} | 2 | A | | __RYR3755__{.green} | 2 | B | | __VLG1377__{.orange} | 1 | A | | __VLG1377__{.orange} | 1 | B | | __VLG1377__{.orange} | 2 | A | | __VLG1377__{.orange} | 2 | B | </div> ::: ## Generalització i especialització La __generalització i especialització__ es modela mitjançant taules relacionals. L'entitat general i les entitats específiques es modelen mitjançant taules relacionals, que __comparteixen la clau primària__. A més, les taules de les entitats especialitzades estan relacionades a la taula general mitjançant la clau primària, que a més a més és una clau forana. Aquestes taules contindran els atributs específics de cada entitat especialitzada. ::: example ![](/itb/DAM-BD/UD2/img/vehicle_generalitzacio.png){.center} Aquest diagrama es pot traduir de la següent manera: - VEHICLE(++#matricula++, marca, model) - Aquesta és l'entitat general, que conté els atributs comuns a totes les entitats. - ++`matricula`++ és la clau primària. - COTXE(_++#matricula++(VEHICLE:#matricula)_, nombre_seients) - Aquesta emmagatzema els atributs especialitzats de __COTXE__. - ++`matricula`++ és la clau primària. - _`matricula`_ és una clau forana que fa referència a l'atribut ++matricula++ de la taula __VEHICLE__. - MOTO(_++#matricula++(VEHICLE:#matricula)_, cilindrada) - Aquesta emmagatzema els atributs especialitzats de __MOTO__. - ++`matricula`++ és la clau primària. - _`matricula`_ és una clau forana que fa referència a l'atribut ++matricula++ de la taula __VEHICLE__. Un exemple amb dades podria ser: <div class="d-flex justify-content-evenly flex-wrap flex-wrap"> | Taula Vehicle |||| | #Matrícula | Marca | Model | | :- | :- | :- | | __4231 KJL__{.green} | Ford | Focus | | __3091 LSF__{.yellow} | Volkswagen | Golf | | __7012 DLM__{.orange} | Peugeot | 5008 | | __4078 CMP__{.blue} | Suzuki | V-Strom 800 | | __3877 FFT__{.lightblue} | Honda | Africa Twin | | __1034 KMC__{.purple} | Ducati | DesertX | | Taula Cotxe |||| | _#Matrícula_ | Nombre Seients | | :- | :- | | __4231 KJL__{.green} | 5 | | __3091 LSF__{.yellow} | 5 | | __7012 DLM__{.orange} | 7 | | Taula Moto ||| | _#Matrícula_ | Cilindrada | | :- | :- | | __4078 CMP__{.blue} | 776 | | __3877 FFT__{.lightblue} | 1084 | | __1034 KMC__{.purple} | 937 | </div> ::: ## Bibliografia - Material de Laura Villalba, _Introducció a les bases de dades_. - Ahijado Sánchez, A, _Bases de datos_, Ed. Marcombo. - https://stackoverflow.com/questions/18365870/er-diagram-ternary-relationship-how-to-read-properly