Lo schema concettuale ER viene trasformato in uno schema relazionale equivalente. Si tratta di rappresentare attraverso l’unico costrutto del modello dei dati relazionale i vari costrutti del modello ER. La trasformazione si basa su semplici regole di “sintattiche”. ## Associazioni n:m (molti-a-molti) Facciamo un esempio: ![[nm1.PNG]] Il suo schema relazionale sarà: - **Stud(matr**, cognome) - **Mat(cod**, nome) - **Esame(matr***, \underline{mat*, data, voto)} Una relazione per ogni entità, più una relazione per l’associazione. Gli attributi *matr* e *mat* di **Esame** sono chiavi secondarie che si riferiscono alle chiavi primarie *matr* (**Stud**) e *Cod* (**Mat**). La coppia di attributi (*matr*, *mat*) di **Esame** è chiave primaria: quindi non possono esistere più registrazioni dello stesso esame. ![[nm2.PNG]] Facciamo un altro esempio: ![[nm3.PNG]] Il suo schema relazionale sarà: - **Forn(CodF**, città, nome) - **Dip(CodD**, nome) - **Prod(CodP**, nome) - **Fornitura(CodF***, \underline{CodD*, CodP*, quant, data)} Lo schema di una relazione R che rappresenta una associazione n-aria molti-a-molti è composto: - dalle n chiavi primarie delle entità connesse; ognuna di queste è una chiave secondaria, e tutte assieme formano la chiave primaria di R; - dagli attributi della associazione. ## Associazioni 1:n (uno-a-molti) Facciamo un esempio: ![[1n1.png]] Il suo schema relazionale sarà: - **Pers(CF**, cognome, residenza*, data) - **Città(nome**, regione) L'associazione *residenza* si rappresenta con l'attributo *residenza* di **Pers** che è chiave secondaria che si riferisce alla chiave primaria *nome* di **Città**: esso consente quindi di associare ad ogni istanza di persona una istanza di città. L'attributo data della relazione *residenza* viene inserito nella relazione **Pers** in cui è presente la chiave secondaria *residenza*. ![[1n2.png]] Facciamo un altro esempio: ![[1n3.png]] Il suo schema relazionale sarà: - Pers(CF, cognome, $<$nome, provincia$>$*, data) - Comune(nome, provincia, regione) La chiave secondaria in **Pers** è *$<$nome, provincia$>$*: essa consente di associare ad ogni istanza di **Pers** una istanza di **Comune**. Una associazione 1:n tra due entità A e B, dove A sta dalla parte 1 dell'associazione, si rappresenta introducendo nella relazione che rappresenta A: - una chiave secondaria S definita sulla chiave primaria della relazione che rappresenta B - gli eventuali attributi dell'associazione **NOTA:** si può sempre utilizzare lo schema usato per le associazioni n:m, usando un vincolo di unicità su S per garantire il vincolo di cardinalità 1:1 su A. ## Associazioni 1:1 (uno-a-uno) ![[111.png]] Schema relazionale: - Prof(codP, nome, età) - Dip(codD, nome, ha\_dir*, data) oppure: - Prof(codP, nome, età, è\_dir*, data) - Dip(codD, nome) Come nel caso generale, l'associazione si rappresenta tramite chiave secondaria. Essendo l'associazione simmetrica (1:1) si può scegliere dove piazzarla: in **}{Prof** o in **}{Dip**. I due schemi così ottenuti sono equivalenti. Quello di sopra, però, è preferibile per via dei valori nulli, meno valori nulli. ![[112.png]] Consideriamo la sezione a sinistra: per garantire che un **Prof** non sia direttore di più di un **Dip** si introduce un vincolo di unicità sull'attributo *ha\_dir*. Si tratta di una associazione simmetrica. Una associazione 1:1 tra due entità A e B si rappresenta introducendo nella relazione che rappresenta A (oppure B): - una chiave secondaria definita sulla chiave primaria della relazione che rappresenta B (oppure A); - gli eventuali attributi della associazione. Se, ad es. su A, l’associazione è opzionale, si preferisce introdurre la chiave secondaria sulla relazione che rappresenta B. ## Associazioni ricorsive ![[ricorsive1.PNG]] **NOTA:** si tratta di una relazione 1:n. Lo schema relazionale sarà: Imp(matr, nome ha\_capo*) Nella relazione **Imp**, l’attributo *ha\_capo* è una chiave secondaria che ammette come valori le matricole degli impiegati. Quindi, una chiave secondaria definita sulla chiave primaria della stessa relazione di appartenenza. ## Chiavi esterne (o composte) Facciamo l'esempio dell'entità **Squadra** e **Partita**: ![[composte1.PNG]] Il suo schema relazionale sarà: - **Squadra(nome**, città) - **Partita(casa***, \underline{ospite*, data)} La chiave primaria di Partita è la coppia di nomi delle due squadre. *casa* e *ospite* sono anche chiavi secondarie che consentono di rappresentare le due associazioni 1:n. ![[composte2.PNG]] Facciamo un altro esempio: ![[composte3.PNG]] Il suo schema relazionale sarà: - **Forn(codF**, città, nome) - **Dip(codD**, nome) - **Prod(codP**, nome) - **Fornitura(codF***, \underline{codP*, codD*, quant, data)} ## Esempio di traduzione ![[esempioTraduzione.PNG]] ## Quadro riassuntivo ![[quadro1.PNG]] ![[quadro2.PNG]] ## Eliminazione delle generalizzazioni Prima di tradurre uno schema ER in uno schema relazionale, è necessario eliminare eventuali generalizzazioni, riconducendole ai costrutti di base del modello ER. Solo successivamente si procedere alla traduzione seguendo le regole sopra esposte. ![[eliminazione1.PNG]] 1. *accorpamento delle figlie nel genitore:* scompaiono le entità figlie le cui istanze vengono immerse nel genitore e l’associazione con **Materia** diventa opzionale. ![[eliminazione2.PNG]] 1. *accorpamento del genitore nelle figlie:* possibile solo se la generalizzazione è totale ![[eliminazione3.PNG]] 1. *sostituzione generalizzazione con associazioni:* rimangono tutte le entità dello schema iniziale ![[eliminazione4.PNG]]