Eserciziario interattivo

Dal modello E-R al modello logico

Dieci esercizi su contesti nuovi — noleggio di attrezzature, federazione sportiva, banca, società di formazione, azienda agricola, catena di palestre, ufficio postale, settimana della moda, gare ciclistiche, agenzia immobiliare — con modello E-R, svolgimento commentato e verifica automatica della tua traduzione. Scrivi lo schema logico e premi «Verifica»: il correttore controlla tabelle, chiavi primarie, chiavi esterne e l’ordine degli attributi.

Come si traduce — le tre regole, in ordine

La traduzione si affronta in tre passi, e l’ordine non è una preferenza di stile: prima si toglie dal modello E-R ciò che il modello logico non sa rappresentare, poi si traducono le entità, infine le associazioni. Invertire i passi è l’errore più frequente.

  1. Passo 1 — Ristrutturare (Regola 1). Si eliminano i costrutti senza corrispondenza diretta: l’attributo composto si spezza negli attributi semplici che lo compongono; l’attributo multivalore genera una nuova entità legata da un’associazione 1:n — la nuova entità ha come PK il valore stesso dell’attributo (l’email, il numero di telefono) e come FK l’ente proprietario; la generalizzazione si risolve con uno dei tre metodi della tabella qui sotto.
  2. Passo 2 — Da ogni entità una tabella. Gli attributi diventano colonne; l’identificatore diventa la chiave primaria (PK). L’entità debole prende come PK la PK dell’entità forte più la propria chiave parziale.
  3. Passo 3 — Da ogni associazione, una collocazione per la chiave esterna. 1:n → la FK sta nella tabella che è dal lato con massimo 1. n:n → una tabella nuova con PK = coppia delle PK. 1:1 → si fondono le due entità in una tabella sola, oppure si mette la FK in una delle due (con vincolo UNIQUE), dalla parte con meno valori nulli. Se l’associazione è identificante, la FK è già dentro la PK composta dell’entità debole: non va dichiarata due volte (si può comunque ripeterla in coda, è la stessa cosa). Se l’associazione ha attributi propri, finiscono nella tabella generata dall’n:n, nella tabella fusa o — nel caso 1:1 con la FK in una delle due tabelle — accanto alla FK, che va trattata come una tabella a sé.
  4. Attenzione alla PK: decide il testo, non tu. La regola «PK = coppia delle PK» vale finché il testo non prevede che la stessa coppia possa ricorrere più volte: rilleggi il testo prima di scegliere la PK. Se la stessa coppia ricorre, l’associazione ha occorrenze con vita propria e non è più una semplice tabella n:n: diventa un’entità, con un identificatore proprio e le FK verso le entità collegate. Se invece la coppia non può ripetersi, la PK = coppia delle PK va bene — e non si inventa nessun attributo che il modello non preveda.

La generalizzazione: tre modi di risolverla

MetodoChe cosa faSceglilo quando…In cambio accetti…
1 — Elimina il padre Il padre sparisce. Ogni figlia diventa una tabella che ripete gli attributi comuni e le associazioni del padre. L’identificatore si può rinominare per distinguere le figlie (es. codiceC / codiceV): se la copertura è anche esclusiva, le due tabelle non possono contenere la stessa istanza, quindi si può anche riutilizzare lo stesso nome. Copertura totale (è obbligatorio); meglio se anche esclusiva. Figlie «ricche», con molti attributi propri. Le associazioni del padre duplicate verso ogni figlia; le interrogazioni «su tutti i padri» diventano un’unione di tabelle.
2 — Elimina le figlie Le figlie rientrano nel padre: un’unica tabella con gli attributi specifici di tutte, più un attributo di controllo che dice a quale figlia appartiene l’istanza (tipoFiglia; nel manuale compare anche con nomi concreti come razza o ruolo). In questo eserciario l’attributo di controllo si chiama con un nome che comincia con «tipo» (tipoFiglia, ma anche tipo, tipoCorso…): il correttore accetta qualunque di queste grafie. Sempre possibile. È la scelta naturale se la copertura è parziale o sovrapposta, o se le figlie sono «povere»: pochi attributi propri e nessuna associazione propria. Molti valori NULL: su ogni riga restano vuoti gli attributi delle figlie diverse.
3 — Tieni tutti: associazioni 1:1 La generalizzazione diventa un’associazione 1:1 tra il padre e ciascuna figlia (es. Is_C, Is_I): il padre resta, e ogni figlia ha PK = PK del padre, che è anche FK. Sempre possibile. Figlie con associazioni proprie da tenere separate (es. solo i medici seguono i ricoveri); vuoi evitare sia i nulli del Metodo 2 sia le duplicazioni del Metodo 1. Più tabelle: per rileggere una figlia insieme al padre servono più join.
L’ordine in cui decidere: 1) la copertura scritta nel testo — se è parziale, il Metodo 1 è vietato, perché perderesti chi sta solo nel padre; 2) le figlie hanno vita propria, cioè attributi specifici numerosi o associazioni proprie? (sì → 1 o 3; figlie povere → 2); 3) che cosa vuoi evitare nello schema logico? (valori nulli → non il 2; associazioni duplicate e interrogazioni a unione → non l’1; tabelle e join in più → non il 3). Motiva sempre la scelta in una riga.
Notazione usata in tutto l’eserciziario. Le tabelle si scrivono Nome (attributo(PK), altro, chiaveEsterna(FK)). La chiave primaria si può indicare in due modi equivalenti: codice(PK) oppure PK(codice); per la chiave esterna codice(FK) oppure FK(codice). La chiave esterna è sempre l’ultimo attributo elencato: prima la PK, poi gli attributi propri, infine la o le FK.

Come si legge il modello E-R

SimboloChe cosa significa
RettangoloEntità: ha un identificatore proprio.
RomboAssociazione fra due entità.
Cerchio pienoChiave primaria (identificatore).
Cerchio vuotoAttributo semplice.
Cerchio doppioAttributo multivalore (va trasformato in una nuova entità).
Pallino nero pieno (●) con il tratto che lo collega Segnala l’entità debole: il pallino è accanto al suo attributo chiave parziale (quello che il testo indica come «numero progressivo interno») e il tratto passa sotto quell’attributo collegandolo all’entità. L’entità debole non ha un identificatore proprio: la sua chiave è la PK dell’entità forte più la chiave parziale.
Albero con (t,e) o (p,e) Generalizzazione: il padre sta in alto, le figlie sotto. (t,e) = copertura totale ed esclusiva, (p,e) = copertura parziale (esistono istanze del padre che non sono né l’una né l’altra figlia).
(min,max) accanto a un’entità Quante volte quell’entità partecipa all’associazione: (1,1) = al massimo una volta (in un’associazione 1:n è il lato in cui finisce la chiave esterna), (0,n) = da nessuna a n volte.
Come rispondere. Una tabella per riga, nella forma qui sopra. Il correttore non bada a spazi, maiuscole o ordine delle righe; controlla invece il contenuto: quali tabelle esistono, chi è PK, chi è FK, quali attributi sono presenti e che le FK stiano in coda. I nomi degli attributi devono corrispondere a quelli del testo e del diagramma: il correttore accetta le grafie equivalenti indicate di volta in volta (per esempio codCentro o CodSede per la stessa chiave esterna).

Esercizi

Filtra

Esercizio 1 — Noleggio di attrezzature: un n:n con attributo e un 1:nBase

3 entitàn:n con attributo1:n
TestoUno sportello di noleggio registra le attrezzature (codAttrezzo, descrizione, tariffaOraria) e i propri soci (tessera, nome, cognome). Ogni attrezzatura è acquistata da un solo fornitore (partitaIVA, denominazione, nazione), mentre un fornitore rifornisce più attrezzature. Un socio può noleggiare più attrezzature e un’attrezzatura può essere noleggiata da più soci; di ogni noleggio si registrano la data di inizio e la data di restituzione. Tradurre il modello in modello logico.
Socio Attrezzatura Fornitore Noleggia Fornita tessera nome cognome codAttrezzo descrizione tariffaOraria partitaIVA denominazione nazione dataInizio dataFine (0,n) (0,n) (1,1) (1,n)
Modello E-R dell’esercizio 1.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. Il modello E-R è già ristrutturato: nessun attributo composto, nessun multivalore, nessuna generalizzazione.
  2. Tre entità → tre tabelle: Socio, Attrezzatura, Fornitore, ognuna con il proprio identificatore come PK.
  3. L’associazione Fornita è 1:n: la FK va nella tabella dal lato con massimo 1, cioè Attrezzatura (accanto a Attrezzatura c’è (1,1)).
  4. L’associazione Noleggia è n:n e ha attributi propri: nasce una nuova tabella con PK = coppia delle PK, più dataInizio e dataFine.
  5. Prima di fissare la PK, ricontrolla il testo: la stessa coppia socio–attrezzatura non può presentarsi più volte (il testo non lo prevede), quindi la PK = coppia delle PK va bene. Se il testo lo prevedesse, l’associazione Noleggia avrebbe occorrenze con vita propria e dovrebbe diventare un’entità con un identificatore proprio.
Soluzione
Socio  (tessera(PK), nome, cognome)
Fornitore  (partitaIVA(PK), denominazione, nazione)
Attrezzatura  (codAttrezzo(PK), descrizione, tariffaOraria, partitaIVA(FK))
Noleggia  (PK(tessera, codAttrezzo), dataInizio, dataFine, tessera(FK), codAttrezzo(FK))
Da scrivere così
Socio  (tessera(PK), nome, cognome)
Fornitore  (partitaIVA(PK), denominazione, nazione)
Attrezzatura  (codAttrezzo(PK), descrizione, tariffaOraria, partitaIVA(FK))
Noleggia  (PK(tessera, codAttrezzo), dataInizio, dataFine, tessera(FK), codAttrezzo(FK))

Esercizio 2 — Due associazioni 1:n e un attributo multivaloreBase

multivalore1:n3 entità
TestoUna federazione sportiva registra gli atleti (tessera, nome, cognome, annoNascita), ciascuno tesserato presso una sola società (codSocietà, nome, città): una società ha però molti atleti. Ogni atleta pratica una sola disciplina (codDisciplina, denominazione) e una disciplina ha molti atleti. Di ogni atleta la federazione registra uno o più indirizzi email. Tradurre il modello in modello logico, ristrutturando dove necessario.
Societa Atleta Disciplina Tesserato Pratica codSocieta nome citta tessera nome cognome annoNascita email (1,n) codDisciplina denominazione (1,n) (1,1) (1,1) (1,n)
Modello E-R dell’esercizio 2.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. Passo 1 — email è multivalore: diventa una nuova entità Email, collegata ad Atleta dall’associazione 1:n Possiede.
  2. Passo 2 — tre entità → tre tabelle: Atleta, Societa, Disciplina.
  3. Passo 3 — Tesserato e Pratica sono entrambe 1:n e in tutte e due l’atleta sta dal lato con massimo 1: le due FK finiscono perciò nella stessa tabella, Atleta, una in coda all’altra.
  4. La tabella generata dal multivalore ha come PK il valore stesso (l’indirizzo email) e la FK all’atleta: l’indirizzo è già univoco, quindi non serve aggiungere altro alla PK.
Soluzione
Disciplina  (codDisciplina(PK), denominazione)
Societa  (codSocieta(PK), nome, citta)
Atleta  (tessera(PK), nome, cognome, annoNascita, codSocieta(FK), codDisciplina(FK))
Email  (email(PK), tessera(FK))
Da scrivere così
Disciplina  (codDisciplina(PK), denominazione)
Societa  (codSocieta(PK), nome, citta)
Atleta  (tessera(PK), nome, cognome, annoNascita, codSocieta(FK), codDisciplina(FK))
Email  (email(PK), tessera(FK))

Esercizio 3 — Entità debole con identificazione internaMedia

entità deboleidentificante1:n
TestoUna banca tiene traccia dei propri correntisti (codiceFiscale, nome, cognome) e dei conti correnti a loro intestati. Ogni conto è intestato a un solo correntista; di ogni conto si registra il numero progressivo interno al correntista (due correntisti diversi possono avere conti con lo stesso numero progressivo), la data di apertura e il saldo attuale. Tradurre il modello in modello logico.
Correntista codiceFiscale nome cognome Intestato (1,n) (1,1) ContoCorrente numProgressivo dataApertura saldo
Modello E-R dell’esercizio 3.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. ContoCorrente è un’entità debole: non ha un proprio identificatore, si distingue solo dal numero progressivo interno al correntista a cui è intestata.
  2. La PK è quindi composta: chiave del correntista + numero progressivo.
  3. La FK al correntista va nella stessa tabella — ed è già dentro la PK, perciò la tabella ha una sola FK, non due.
  4. La FK dentro la PK è implicita: ContoCorrente(PK(codiceFiscale, numProgressivo), …) basta da sola, ma se la dichiari lo stesso in coda — cioè codiceFiscale(FK) come ultimo attributo — il risultato è lo stesso e il correttore accetta anche entrambe le forme.
  5. Correntista diventa una tabella normale, con il proprio identificatore come PK.
Soluzione
Correntista  (codiceFiscale(PK), nome, cognome)
ContoCorrente  (PK(codiceFiscale, numProgressivo), dataApertura, saldo, codiceFiscale(FK))
Da scrivere così
Correntista  (codiceFiscale(PK), nome, cognome)
ContoCorrente  (PK(codiceFiscale, numProgressivo), dataApertura, saldo, codiceFiscale(FK))

Esercizio 4 — Generalizzazione totale ed esclusiva: tre metodiMedia

entità figliegeneralizzazione1:n
TestoUna società di formazione eroga i corsi (codCorso, titolo, durataOre). I corsi si dividono in teorici, di cui interessa il numero di aule assegnate, e pratici, di cui interessa il numero di prove di guida: ogni corso è o teorico o pratico (copertura totale ed esclusiva). Ogni corso è erogato in un solo centro (codCentro, città, indirizzo) e in un centro si erogano più corsi. Tradurre il modello in modello logico usando uno dei tre metodi, a scelta.
Corso Teorico Pratico Centro Erogato codCorso titolo durataOre numAule numProveGuida codCentro citta indirizzo (1,1) (1,n) (t,e)
Modello E-R dell’esercizio 4.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. La copertura è totale ed esclusiva: nessuno dei tre metodi è vietato, la scelta è di merito.
  2. Metodo 1: elimini il padre Corso; le figlie ripetono titolo e durataOre, e l’associazione Erogato si duplica verso entrambe. L’identificatore si può rinominare (codCorsoT / codCorsoP) oppure lasciare com’è: con copertura esclusiva le due tabelle non si pestano i piedi.
  3. Metodo 2: le figlie confluiscono in un’unica tabella Corso con anche numAule e numProveGuida, più l’attributo di controllo tipoFiglia; molte celle restano vuote. Il nome dell’attributo di controllo è libero purché cominci con «tipo» (tipoFiglia, tipo, tipoCorso…): il correttore accetta tutte queste grafie.
  4. Metodo 3: il padre resta e ogni figlia diventa una tabella con PK = PK del padre, che è anche FK. Qui l’attributo di controllo tipoFiglia è ridondante (il tipo si deduce dalla presenza della riga nella tabella figlia): si può omettere, e il correttore accetta entrambe le forme.
Metodo 2 — le entità figlie rientrano nel padre
Centro  (codCentro(PK), citta, indirizzo)
Corso  (codCorso(PK), titolo, durataOre, numAule, numProveGuida, tipoFiglia, codCentro(FK))
Metodo 1 — eliminazione dell’entità padre
Centro  (codCentro(PK), citta, indirizzo)
Teorico  (codCorsoT(PK), titolo, durataOre, numAule, codCentro(FK))
Pratico  (codCorsoP(PK), titolo, durataOre, numProveGuida, codCentro(FK))
Metodo 1 — variante accettata, identificatore non rinominato
Centro  (codCentro(PK), citta, indirizzo)
Teorico  (codCorso(PK), titolo, durataOre, numAule, codCentro(FK))
Pratico  (codCorso(PK), titolo, durataOre, numProveGuida, codCentro(FK))
Metodo 3 — associazioni 1:1 tra padre e figlie
Centro  (codCentro(PK), citta, indirizzo)
Corso  (codCorso(PK), titolo, durataOre, tipoFiglia, codCentro(FK))
Teorico  (codCorso(PK), numAule, codCorso(FK))
Pratico  (codCorso(PK), numProveGuida, codCorso(FK))
Da scrivere così
Centro  (codCentro(PK), citta, indirizzo)
Corso  (codCorso(PK), titolo, durataOre, numAule, numProveGuida, tipoFiglia, codCentro(FK))

Esercizio 5 — Generalizzazione parziale: il Metodo 1 è vietatoMedia

entità figliegeneralizzazionecopertura parziale1:n
TestoUn’azienda agricola registra i terreni (particella, estensioneEttari). I terreni si dividono in seminativi, di cui interessa la coltura, e prati, di cui interessa il numero di tagli annuali; esistono però anche terreni incolti, che restano semplici terreni senza attributi specifici (copertura parziale). Ogni conducente (codConducente, nome, cognome) coltiva un solo terreno, mentre un terreno può essere coltivato da più conducenti. Tradurre il modello in modello logico con il Metodo 2 oppure con il Metodo 3.
Terreno Seminativo Prato Conducente Coltiva particella estensioneEttari coltura numTagli codConducente nome cognome (1,n) (1,1) (p,e)
Modello E-R dell’esercizio 5.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. La copertura è parziale: esistono terreni che non sono né seminativi né prati.
  2. Per questo il Metodo 1 è vietato: eliminando il padre Terreno perderesti del tutto gli incolti, che non hanno una figlia in cui stare.
  3. Resta il Metodo 2 (tutti in un’unica tabella + attributo di controllo, con nulli) o il Metodo 3 (padre e figlie in 1:1, che conserva anche gli incolti). L’attributo di controllo del Metodo 2 si chiama con un nome che comincia con «tipo» (tipoFiglia, tipo, tipoTerreno…): il correttore accetta tutte queste grafie.
  4. In entrambi i casi l’associazione Coltiva mette la FK in Conducente: è il lato con massimo 1 (accanto a Conducente c’è (1,1)), perché ogni conducente coltiva un solo terreno.
  5. Nel Metodo 3 l’attributo di controllo tipoFiglia è ridondante (il tipo si deduce dalla presenza della riga in Seminativo o in Prato): si può omettere, e il correttore accetta entrambe le forme.
Metodo 2 — le entità figlie rientrano nel padre
Conducente  (codConducente(PK), nome, cognome, particella(FK))
Terreno  (particella(PK), estensioneEttari, coltura, numTagli, tipoFiglia)
Metodo 3 — associazioni 1:1 tra padre e figlie
Conducente  (codConducente(PK), nome, cognome, particella(FK))
Terreno  (particella(PK), estensioneEttari, tipoFiglia)
Seminativo  (particella(PK), coltura, particella(FK))
Prato  (particella(PK), numTagli, particella(FK))
Da scrivere così
Conducente  (codConducente(PK), nome, cognome, particella(FK))
Terreno  (particella(PK), estensioneEttari, coltura, numTagli, tipoFiglia)

Esercizio 6 — Entità debole di una generalizzazioneAlta

entità figlieentità deboledebole + generalizzazionegeneralizzazione1:n
TestoUna catena di palestre registra i corsi (codCorso, nome, livello). I corsi si dividono in collettivi, di cui interessa il numero massimo di partecipanti, e individuali, di cui interessa la durata in minuti: ogni corso è o collettivo o individuale (copertura totale ed esclusiva). Di ogni corso si tengono più sedute, identificate da un numero progressivo interno al corso, di cui interessa la data e l’aula. Ogni corso è tenuto da un solo istruttore (matricola, nome, cognome) e un istruttore tiene più corsi. Tradurre il modello in modello logico usando uno dei tre metodi per la generalizzazione.
Corso codCorso nome livello (t,e) Collettivo Individuale maxPartecipanti durataMinuti Tenuto (1,1) (1,n) Istruttore matricola nome cognome Identifica (1,n) (1,1) Seduta numSeduta data aula
Modello E-R dell’esercizio 6.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. Due costrutti insieme: una generalizzazione (t,e) sulle figlie e un’entità debole che dipende dal padre della generalizzazione.
  2. Con il Metodo 1 il costo è doppio: oltre a duplicare l’associazione Tenuto devi duplicare anche l’entità debole, perché Seduta era identificata da un codice che non esiste più.
  3. Con il Metodo 2 nulla si duplica: un’unica tabella Corso con l’attributo di controllo, e Seduta resta identificata da quella PK. L’attributo di controllo si chiama con un nome che comincia con «tipo» (tipoFiglia, tipo, tipoCorso…): il correttore accetta tutte queste grafie.
  4. Con il Metodo 3 il padre resta, quindi Seduta continua a puntare a Corso; le figlie hanno PK = PK del padre, che è anche FK. Qui tipoFiglia è ridondante e si può omettere: il correttore accetta entrambe le forme.
  5. Nel Metodo 1 l’identificatore si può rinominare (codCorsoC / codCorsoI) oppure lasciare com’è: con copertura esclusiva le due tabelle figlie non si pestano i piedi, e il correttore accetta entrambe le forme.
Metodo 2 — le entità figlie rientrano nel padre
Istruttore  (matricola(PK), nome, cognome)
Corso  (codCorso(PK), nome, livello, maxPartecipanti, durataMinuti, tipoFiglia, matricola(FK))
Seduta  (PK(codCorso, numSeduta), data, aula, codCorso(FK))
Metodo 1 — eliminazione dell’entità padre
Istruttore  (matricola(PK), nome, cognome)
Collettivo  (codCorso(PK), nome, livello, maxPartecipanti, matricola(FK))
Individuale  (codCorso(PK), nome, livello, durataMinuti, matricola(FK))
SedutaCollettiva  (PK(codCorso, numSeduta), data, aula, codCorso(FK))
SedutaIndividuale  (PK(codCorso, numSeduta), data, aula, codCorso(FK))
Metodo 1 — variante accettata, identificatore rinominato
Istruttore  (matricola(PK), nome, cognome)
Collettivo  (codCorsoC(PK), nome, livello, maxPartecipanti, matricola(FK))
Individuale  (codCorsoI(PK), nome, livello, durataMinuti, matricola(FK))
SedutaCollettiva  (PK(codCorsoC, numSeduta), data, aula, codCorsoC(FK))
SedutaIndividuale  (PK(codCorsoI, numSeduta), data, aula, codCorsoI(FK))
Metodo 3 — associazioni 1:1 tra padre e figlie
Istruttore  (matricola(PK), nome, cognome)
Corso  (codCorso(PK), nome, livello, tipoFiglia, matricola(FK))
Collettivo  (codCorso(PK), maxPartecipanti, codCorso(FK))
Individuale  (codCorso(PK), durataMinuti, codCorso(FK))
Seduta  (PK(codCorso, numSeduta), data, aula, codCorso(FK))
Da scrivere così
Istruttore  (matricola(PK), nome, cognome)
Corso  (codCorso(PK), nome, livello, maxPartecipanti, durataMinuti, tipoFiglia, matricola(FK))
Seduta  (PK(codCorso, numSeduta), data, aula, codCorso(FK))

Esercizio 7 — Multivalore ed entità debole insiemeAlta

multivaloreentità debole3 entità1:n
TestoUn ufficio postale registra i propri mittenti (codMittente, nome, cognome) e le raccomandate spedite. Ogni raccomandata è intestata a un solo mittente; di ogni raccomandata si registra il numero progressivo interno al mittente, la data di spedizione e il peso. Di ogni mittente l’ufficio registra uno o più numeri di telefono. Ogni raccomandata è spedita a una sola località (codCAP, denominazione, provincia) e verso una città partono più raccomandate. Tradurre il modello in modello logico.
Mittente codMittente nome cognome Telefono (1,n) Intestata (1,n) (1,1) Raccomandata numProgressivo dataSpedizione peso Destinata (1,1) (1,n) Localita codCAP denominazione provincia
Modello E-R dell’esercizio 7.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. Attenzione agli attributi omonimi: l’entità si chiama Localita, l’identificatore è codCAP e la denominazione è un attributo semplice.
  2. Due ristrutturazioni distinte: il multivalore telefono genera una nuova entità Telefono, con PK il numero stesso e FK al mittente; Raccomandata è debole perché il suo numero progressivo ha senso solo dentro un mittente.
  3. La PK di Raccomandata è: codMittente + numProgressivo.
  4. Le FK di Raccomandata sono due — una al mittente (che però è già nella PK) e una alla località — e vanno entrambe in coda.
Soluzione
Localita  (codCAP(PK), denominazione, provincia)
Mittente  (codMittente(PK), nome, cognome)
Raccomandata  (PK(codMittente, numProgressivo), dataSpedizione, peso, codMittente(FK), codCAP(FK))
Telefono  (numero(PK), codMittente(FK))
Da scrivere così
Localita  (codCAP(PK), denominazione, provincia)
Mittente  (codMittente(PK), nome, cognome)
Raccomandata  (PK(codMittente, numProgressivo), dataSpedizione, peso, codMittente(FK), codCAP(FK))
Telefono  (numero(PK), codMittente(FK))

Esercizio 8 — Un’associazione 1:1Alta

1:1n:n con attributo3 entità
TestoUna settimana della moda registra gli stilisti (codStilista, nome, cognome) e le sfilate (codSfilata, data, città). Ogni sfilata è allestita da un solo stilista e ogni stilista allestisce al massimo una sfilata. Ogni sfilata presenta più capi (codCapo, descrizione, prezzo) e un capo può essere presentato in più sfilate; di ogni presentazione si registra il numero progressivo di uscita in passerella. Tradurre il modello in modello logico.
Stilista Sfilata Capo Organizza Presenta codStilista nome cognome codSfilata citta data codCapo descrizione prezzo numUscita (1,1) (1,1) (0,n) (0,n)
Modello E-R dell’esercizio 8.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. L’associazione Organizza è 1:1: una sfilata ha un solo stilista e uno stilista ha al massimo una sfilata.
  2. Due strade: fondere le due entità in un’unica tabella (gli attributi dello stilista entrano nella tabella della sfilata e codStilista resta un attributo semplice, senza tabella Stilista), oppure tenere le due tabelle e mettere la FK in una delle due (con vincolo UNIQUE).
  3. Se metti la FK, conviene dalla parte con meno valori nulli: ogni sfilata ha sempre uno stilista, mentre molti stilisti non allestiscono nessuna sfilata → FK in Sfilata.
  4. L’associazione Presenta è n:n con attributo: nuova tabella con PK = coppia delle PK e numUscita.
Soluzione A — la FK sta in Sfilata
Stilista  (codStilista(PK), nome, cognome)
Sfilata  (codSfilata(PK), data, citta, codStilista(FK))
Capo  (codCapo(PK), descrizione, prezzo)
Presenta  (PK(codSfilata, codCapo), numUscita, codSfilata(FK), codCapo(FK))
Soluzione B — la FK sta in Stilista
Stilista  (codStilista(PK), nome, cognome, codSfilata(FK))
Sfilata  (codSfilata(PK), data, citta)
Capo  (codCapo(PK), descrizione, prezzo)
Presenta  (PK(codSfilata, codCapo), numUscita, codSfilata(FK), codCapo(FK))
Soluzione C — le due entità sono fuse in una tabella
Sfilata  (codSfilata(PK), data, citta, codStilista, nome, cognome)
Capo  (codCapo(PK), descrizione, prezzo)
Presenta  (PK(codSfilata, codCapo), numUscita, codSfilata(FK), codCapo(FK))
Da scrivere così
Stilista  (codStilista(PK), nome, cognome)
Sfilata  (codSfilata(PK), data, citta, codStilista(FK))
Capo  (codCapo(PK), descrizione, prezzo)
Presenta  (PK(codSfilata, codCapo), numUscita, codSfilata(FK), codCapo(FK))

Esercizio 9 — Cinque entità e un n:n con attributoAlta

5 entitàn:n con attributo1:n
TestoUna società organizzatrice registra le gare (codGara, nome, data). Ogni gara si svolge su un solo circuito (codCircuito, nome, città, lunghezza) e su un circuito si svolgono più gare. Ogni gara è aperta a una sola categoria (codCategoria, denominazione, etàMinima) e una categoria ha più gare. I ciclisti (codTessera, nome, cognome, nazionalità) partecipano alle gare: un ciclista partecipa a più gare e una gara ha più ciclisti, e di ogni partecipazione si registrano il piazzamento e il tempo impiegato. Ogni ciclista appartiene a una sola squadra (codSquadra, nome, nazione) e una squadra ha molti ciclisti. Tradurre il modello in modello logico.
Circuito SiSvolge Gara Appartiene Categoria Iscrizione Ciclista Squadra Milita codCircuito nome citta lunghezza codGara nome data codCategoria denominazione etaMinima codSquadra nome nazione codTessera nome cognome nazionalita tempo piazzamento (1,n) (1,1) (1,1) (1,n) (0,n) (0,n) (1,n) (1,1)
Modello E-R dell’esercizio 9.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. Cinque entità → cinque tabelle, più una tabella generata dall’associazione n:n.
  2. Attenzione a Gara: è l’unica tabella con due FK (una al circuito, una alla categoria), ed entrambe vanno in coda.
  3. L’associazione Iscrizione è n:n con attributi: nuova tabella con PK = coppia delle PK, più piazzamento e tempo. La PK resta la coppia (ciclista, gara): è quella che garantisce una sola riga per partecipazione.
  4. L’associazione Milita è 1:n: la FK alla squadra va in Ciclista, l’unica tabella con un massimo pari a 1 dalla sua parte.
Soluzione
Squadra  (codSquadra(PK), nome, nazione)
Categoria  (codCategoria(PK), denominazione, etaMinima)
Circuito  (codCircuito(PK), nome, citta, lunghezza)
Ciclista  (codTessera(PK), nome, cognome, nazionalita, codSquadra(FK))
Gara  (codGara(PK), nome, data, codCircuito(FK), codCategoria(FK))
Iscrizione  (PK(codTessera, codGara), piazzamento, tempo, codTessera(FK), codGara(FK))
Da scrivere così
Squadra  (codSquadra(PK), nome, nazione)
Categoria  (codCategoria(PK), denominazione, etaMinima)
Circuito  (codCircuito(PK), nome, citta, lunghezza)
Ciclista  (codTessera(PK), nome, cognome, nazionalita, codSquadra(FK))
Gara  (codGara(PK), nome, data, codCircuito(FK), codCategoria(FK))
Iscrizione  (PK(codTessera, codGara), piazzamento, tempo, codTessera(FK), codGara(FK))

Esercizio 10 — Generalizzazione e n:n con attributoAlta

entità figliegeneralizzazionen:n con attributo
TestoUn’agenzia immobiliare registra gli immobili (codImmobile, indirizzo, superficieMq, canoneMensile). Gli immobili si dividono in uffici, di cui interessa il numero di posti, e negozi, di cui interessa la larghezza della vetrina: ogni immobile è o un ufficio o un negozio (copertura totale ed esclusiva). Gli inquilini (codInquilino, nome, cognome) prendono in affitto gli immobili: un inquilino può avere in affitto più immobili e un immobile può essere affittato a più inquilini, e di ogni contratto si registrano la data di inizio e la data di fine. Tradurre il modello in modello logico con il Metodo 2 oppure con il Metodo 3.
Immobile Ufficio Negozio Inquilino Affitta codImmobile indirizzo superficieMq canoneMensile numPosti larghezzaVetrina codInquilino nome cognome dataInizio dataFine (0,n) (0,n) (t,e)
Modello E-R dell’esercizio 10.

La tua traduzione

Mostra svolgimento e soluzione
Svolgimento
  1. La copertura è totale ed esclusiva, quindi anche il Metodo 1 sarebbe lecito: ma l’n:n Affitta si raddoppierebbe (una tabella per gli uffici, una per i negozi) — è il motivo per cui qui conviene il 2 o il 3.
  2. Metodo 2: un’unica tabella Immobile con tipoFiglia; numero di posti e larghezza della vetrina restano nulli a metà. L’attributo di controllo si chiama con un nome che comincia con «tipo» (tipoFiglia, tipo, tipoImmobile…): il correttore accetta tutte queste grafie.
  3. Metodo 3: il padre tiene gli attributi comuni, le figlie solo il proprio attributo specifico, con PK = PK del padre che è anche FK; l’n:n Affitta non si duplica, perché il padre è ancora lì. Qui tipoFiglia è ridondante e si può omettere: il correttore accetta entrambe le forme.
  4. In entrambi i casi Affitta ha PK = coppia delle PK di Inquilino e della tabella che rappresenta l’immobile. Prima di fissare la PK, ricontrolla il testo: la stessa coppia inquilino–immobile non può presentarsi più volte (il testo non lo prevede), quindi la PK = coppia delle PK va bene.
Metodo 2 — le entità figlie rientrano nel padre
Inquilino  (codInquilino(PK), nome, cognome)
Immobile  (codImmobile(PK), indirizzo, superficieMq, canoneMensile, numPosti, larghezzaVetrina, tipoFiglia)
Affitta  (PK(codInquilino, codImmobile), dataInizio, dataFine, codInquilino(FK), codImmobile(FK))
Metodo 3 — associazioni 1:1 tra padre e figlie
Inquilino  (codInquilino(PK), nome, cognome)
Immobile  (codImmobile(PK), indirizzo, superficieMq, canoneMensile, tipoFiglia)
Ufficio  (codImmobile(PK), numPosti, codImmobile(FK))
Negozio  (codImmobile(PK), larghezzaVetrina, codImmobile(FK))
Affitta  (PK(codInquilino, codImmobile), dataInizio, dataFine, codInquilino(FK), codImmobile(FK))
Da scrivere così
Inquilino  (codInquilino(PK), nome, cognome)
Immobile  (codImmobile(PK), indirizzo, superficieMq, canoneMensile, numPosti, larghezzaVetrina, tipoFiglia)
Affitta  (PK(codInquilino, codImmobile), dataInizio, dataFine, codInquilino(FK), codImmobile(FK))