20 min di lettura
Pubblicato il 12 Novembre 2026 · Aggiornato il 12 Novembre 2026
📚 Progettazione Basi di Dati · Esempio Hotel Aurora
Guida a cura di Prof. Giagnotti

Come progettare il database fino al modello logico - Hotel Aurora

Da cliente a fattura: modelliamo clienti privati e aziende, prenotazioni, camere, servizi extra e fatture con generalizzazione totale ed esclusiva, attributi composti e multivalore, associazioni 1:N, N:M e 1:1. La traccia completa, dal concettuale al logico.

🧩 Focus: Generalizzazione (T,E) + N:M + 1:1 💡 Metodo: Analisi → E/R → Logico → Vincoli
🎯 Cosa imparerai
✓Riconoscere una generalizzazione totale ed esclusiva: ogni cliente è esattamente un privato oppure un'azienda
✓Distinguere attributo composto (indirizzo), multivalore (telefono) e attributo di associazione (prezzo_notte, quantita)
✓Derivare il logico: generalizzazione con 3 tabelle, N:M con tabella ponte, 1:1 con FK UNIQUE
✓Scrivere le regole di lettura e ricavare la cardinalità dai soli massimi
✓Elencare i vincoli che il logico non esprime: totalità, minime a 1, sovrapposizione camere, coerenza fattura

1. Lo scenario Hotel Aurora: cosa ci chiede la traccia

📌 Traccia

L’Hotel Aurora vuole realizzare un database per gestire clienti e prenotazioni.

Clienti. Privati o aziende (mai entrambe). Per ogni cliente: codice cliente, indirizzo (via, numero civico, CAP, città), email, uno o più telefoni. Privati: codice fiscale, nome, cognome, data di nascita. Aziende: partita IVA, ragione sociale, codice destinatario per la fatturazione elettronica.
Prenotazioni. Un cliente può effettuare molte prenotazioni, anche nessuna; ogni prenotazione è di un solo cliente. Codice, data di registrazione, data di arrivo, data di partenza.
Camere. Ogni prenotazione comprende almeno una camera; una camera può comparire in molte prenotazioni in periodi diversi, oppure in nessuna. Numero (unico nell'hotel), piano, tipologia (singola, doppia, suite), posti letto. Per ogni camera in prenotazione: prezzo per notte concordato e numero di ospiti.
Servizi extra. Codice, descrizione, prezzo unitario. Per ogni prenotazione, per ciascun servizio richiesto, la quantità complessiva. Un servizio può essere richiesto in molte prenotazioni; una prenotazione può non richiederne nessuno.
Fatturazione. Al massimo una fattura per prenotazione; ogni fattura si riferisce a una sola prenotazione. Identificata da anno + numero progressivo nell'anno; data di emissione e importo totale.

Questa è una delle tracce che uso sempre al compito in classe: sembra una semplice gestione alberghiera, ma in realtà contiene quasi tutto il programma. Generalizzazione, composto, multivalore, N:M con attributi, 1:1. Se sbagli uno di questi, perdi la parte logica.

💬 Tip del docente

Quando leggi "mai entrambe le cose" → sottolinea DUE volte. È il segnale di generalizzazione esclusiva. E quando leggi "ogni cliente è privato oppure azienda" → è anche totale. In verifica scrivo sempre: "Quanti tipi può essere un cliente?" Risposta giusta: esattamente uno. Mai zero, mai due.

2. Le 4 consegne: cosa devi consegnare

CONSEGNA 1 · ANALISI

Ipotesi, entità, associazioni

Attributi, identificatori e molteplicità. Senza ipotesi dichiarate, il resto non si può valutare.

CONSEGNA 2 · SCHEMA E/R

Disegno con (min,max)

Cardinalità e generalizzazione indicate. Lo schema si deve leggere ad alta voce.

CONSEGNA 3 · SCHEMA LOGICO

Regole motivate, PK e FK

Non basta elencare le tabelle: devi dire quale regola hai usato e perché.

CONSEGNA 4 · VINCOLI

Quelli che il logico non esprime

È qui che si vede se hai capito davvero: il logico non dice tutto.

🎯 Come valuto la consegna

Non guardo solo il disegno. Guardo se le ipotesi sono dichiarate, se le molteplicità si leggono, se la derivazione è motivata e se i vincoli mancanti sono elencati. Un E/R senza ipotesi è un disegno, non una progettazione.

3. Ipotesi e analisi preliminare

Prima di disegnare, dichiaro le ipotesi. Sono le decisioni che prendo dove la traccia tace: se non le scrivi, chi corregge non può sapere se hai sbagliato o se hai semplicemente scelto un'altra interpretazione.

#IpotesiPerché / cosa cambia
1L'hotel è uno solo: non serve un'entità HOTEL e il numero di camera è unico in tutto l'hotel.Senza questa, CAMERA diventerebbe debole. Con più hotel, servirebbe HOTEL come padre.
2Ogni cliente ha un codice interno (id_cliente) che lo identifica a prescindere dal tipo. Codice fiscale e partita IVA sono univoci nel rispettivo sottotipo, ma non esistono per tutti i clienti.Per questo il codice fiscale non può identificare CLIENTE: le aziende non ce l'hanno.
3La classificazione dei clienti è totale ed esclusiva: ogni cliente è esattamente un privato oppure un'azienda.È la (T,E) della generalizzazione: mai zero, mai due.
4Un cliente ha almeno un telefono e può averne più di uno: attributo multivalore (1,N).Nel logico diventerà una tabella a parte, non una colonna.
5L'indirizzo è un attributo composto (via, civico, CAP, città): le componenti si usano anche separatamente, per esempio per cercare per città.Nel logico si scompone in quattro colonne.
6La tipologia della camera è un attributo e non un'entità: nella traccia ha solo un nome e nessuna proprietà propria.Diventa entità solo se avesse attributi suoi (es. prezzo di listino, descrizione).
7I servizi extra si registrano con una quantità complessiva per prenotazione, senza data: la coppia (prenotazione, servizio) compare una sola volta. Se servisse la data di ogni erogazione, il servizio richiesto diventerebbe un'entità.È l'ipotesi che giustifica RICHIEDE come associazione N:M e non come entità.
8Il prezzo per notte sta nell'associazione COMPRENDE perché può differire dal prezzo di listino e cambiare nel tempo.Stessa camera, prenotazioni diverse → prezzi diversi.
9Non si registrano i dati anagrafici degli ospiti, solo il loro numero.Altrimenti servirebbe un'entità OSPITE.
10L'importo totale della fattura è memorizzato come valore storico, non ricalcolato ogni volta.Se i prezzi cambiano dopo, la fattura resta quella emessa.
11Una camera nuova può non avere ancora prenotazioni e un servizio appena inserito può non essere ancora stato richiesto: da qui le minime a 0.Le minime a 0 non sono un dettaglio: decidono NULL e UNIQUE nel logico.
💬 Tip del docente - le ipotesi valgono punti

In verifica, l'ipotesi 7 è quella che separa il 6 dal 9. Chi scrive "RICHIEDE è N:M perché la quantità è complessiva e senza data" ha capito. Chi fa RICHIEDE entità senza motivare, sta improvvisando. Scrivi sempre il "perché", non solo il "cosa".

4. Le entità e la generalizzazione

ENTITÀ PADRE

CLIENTE

id_cliente, indirizzo composto, email, telefono (1,N). Generalizzazione (T,E) verso PRIVATO e AZIENDA.

SOTTOENTITÀ

PRIVATO

codice_fiscale, nome, cognome, data_nascita. Eredita id_cliente dal padre.

SOTTOENTITÀ

AZIENDA

partita_iva, ragione_sociale, codice_destinatario. Eredita id_cliente dal padre.

ENTITÀ

PRENOTAZIONE

codice_prenotazione, data_registrazione, data_arrivo, data_partenza. Si collega a cliente, camere, servizi e fattura.

ENTITÀ

CAMERA

numero_camera, piano, tipologia, posti_letto. Identificatore: il numero, unico nell'hotel.

ENTITÀ

SERVIZIO

codice_servizio, descrizione, prezzo_unitario. Catalogo dei servizi extra.

ENTITÀ

FATTURA

anno + numero_fattura, data_emissione, importo_totale. Identificatore composto.

EntitàFrase della tracciaPerché è un'entità
CLIENTE«I clienti sono privati o aziende»Ha identità propria e partecipa a più associazioni
PRIVATO«Per i clienti privati interessano anche…»Sottoentità con attributi propri
AZIENDA«per le aziende partita IVA…»Sottoentità con attributi propri
PRENOTAZIONE«Di ogni prenotazione si registrano un codice…»Ha un identificatore e si collega a clienti, camere, servizi e fattura
CAMERA«Di ogni camera interessano il numero…»Ha un identificatore (il numero) e proprietà proprie
SERVIZIO«ciascuno con un codice, una descrizione e un prezzo»Ha identificatore e proprietà proprie
FATTURA«identificata dall'anno e dal numero progressivo»Ha un identificatore composto
⚠️ Errore comune - non sono entità

Indirizzo, telefono e tipologia non sono entità: sono proprietà senza attributi propri. Indirizzo è composto, telefono è multivalore, tipologia è un semplice attributo con tre valori possibili. E le date non sono entità: sono attributi. Se trasformi tutto in entità, lo schema esplode e diventa illeggibile.

💬 Tip del docente - generalizzazione

Disegnala con due frecce dai figli verso il padre e l'etichetta circolare al cui interno è scritto (T,E)(T,E). T = totale: ogni cliente è in almeno un figlio. E = esclusiva: in al massimo uno. L'etichetta è la sostanza, non la decorazione.

5. Le associazioni

E/R · ASSOCIAZIONI - VERBI INFINITO
1. GENERALIZZAZIONE: CLIENTE --- (T,E) --- PRIVATO / AZIENDA Ogni cliente è un privato oppure un'azienda (mai entrambe, mai nessuno).2. EFFETTUARE: CLIENTE (0,n) --- EFFETTUARE --- (1,1) PRENOTAZIONE Un cliente può effettuare molte prenotazioni, anche nessuna. Ciascuna prenotazione è effettuata da uno e un solo cliente.3. COMPRENDERE: PRENOTAZIONE (1,n) --- COMPRENDERE --- (0,n) CAMERA Ogni prenotazione comprende almeno una camera. Una camera può comparire in molte prenotazioni.4. RICHIEDERE: PRENOTAZIONE (0,n) --- RICHIEDERE --- (0,n) SERVIZIO Una prenotazione può non richiedere nessun servizio. Un servizio può essere richiesto in molte prenotazioni.5. GENERARE: PRENOTAZIONE (0,1) --- GENERARE --- (1,1) FATTURA Una prenotazione ha al massimo una fattura. Ogni fattura si riferisce a una sola prenotazione.
💬 Tip del docente - perché verbi all'infinito?

Perché il diagramma si legge come frase: "CLIENTE EFFETTUA PRENOTAZIONE". Se metti "effettua" o "ha" poi nella relazione inversa non torna. All'infinito è neutro e professionale. Stessa regola che uso per tutte le tracce.

6. Attributi e identificatori

Entità o associazioneAttributiNote
CLIENTEid_cliente, indirizzo, email, telefonoindirizzo è composto (via, civico, cap, città); telefono è multivalore (1,n)
PRIVATOcodice_fiscale, nome, cognome, data_nascita
AZIENDApartita_iva, ragione_sociale, codice_destinatario
PRENOTAZIONEcodice_prenotazione, data_registrazione, data_arrivo, data_partenza
CAMERAnumero_camera, piano, tipologia, posti_letto
SERVIZIOcodice_servizio, descrizione, prezzo_unitario
FATTURAanno, numero_fattura, data_emissione, importo_totale
COMPRENDEREprezzo_notte, numero_ospitiDipendono dalla coppia prenotazione-camera, non da una sola delle due
RICHIEDEREquantitaDipende dalla coppia prenotazione-servizio
EFFETTUARE, GENERAREnessuno
🎯 Regola pratica - dove va l'attributo?

Un attributo va nell'associazione quando il suo valore cambia al cambiare della coppia di istanze collegate. Il prezzo per notte non può stare in CAMERA, perché la stessa camera ha prezzi diversi in prenotazioni diverse. La quantità non può stare in SERVIZIO, perché lo stesso servizio ha quantità diverse in prenotazioni diverse. Se lo metti nell'entità sbagliata, perdi informazione.

Identificatori

EntitàIdentificatoreTipo
CLIENTEid_clienteSemplice
PRIVATOid_cliente (ereditato dal padre)Alternativo: codice_fiscale
AZIENDAid_cliente (ereditato dal padre)Alternativo: partita_iva
PRENOTAZIONEcodice_prenotazioneSemplice
CAMERAnumero_cameraSemplice (unico nell'hotel)
SERVIZIOcodice_servizioSemplice
FATTURAanno + numero_fatturaComposto
⚠️ Errore comune - codice fiscale come identificatore di CLIENTE

Un identificatore deve essere univoco, sempre presente e stabile nel tempo. Il codice fiscale non identifica CLIENTE: le aziende non ce l'hanno. È identificatore alternativo solo dentro PRIVATO, non del padre. Stesso discorso per la partita IVA.

7. Molteplicità, regole di lettura e cardinalità

Il primo valore dice se la partecipazione è opzionale (0) o obbligatoria (1); il secondo se l'istanza partecipa al più una volta (1) o più volte (N).

AssociazioneEntità(min,max)Perché
EFFETTUARECLIENTE(0,n)«molte prenotazioni, anche nessuna»
EFFETTUAPRENOTAZIONE(1,1)«effettuata da un solo cliente»: sempre uno
COMPRENDEREPRENOTAZIONE(1,n)«almeno una camera», anche due o tre
COMPRENDERECAMERA(0,n)«molte prenotazioni» oppure «in nessuna»
RICHIEDEREPRENOTAZIONE(0,n)«può non richiederne nessuno»
RICHIEDERESERVIZIO(0,n)«in molte prenotazioni»; un servizio nuovo può non averne (ipotesi 11)
GENERAREPRENOTAZIONE(0,1)«al massimo una fattura»
GENERAREFATTURA(1,1)«si riferisce a una sola prenotazione»
GeneralizzazioneCLIENTE(T,E)Totale: ogni cliente è privato o azienda. Esclusiva: mai entrambi

Regole di lettura

REGOLE DI LETTURA - VERIFICA
Si legge l'associazione in entrambi i versi con la formula: «Ogni A verbo da min a max B; ogni B verbo passivo da min a max A».EFFETTUARE: ogni cliente effettua da 0 a n prenotazioni; ogni prenotazione è effettuata da 1 e un solo cliente. COMPRENDERE: ogni prenotazione comprende da 1 a n camere; ogni camera è compresa in da 0 a n prenotazioni. RICHIEDERE: ogni prenotazione richiede da 0 a n servizi; ogni servizio è richiesto in da 0 a n prenotazioni. GENERARE: ogni prenotazione genera da 0 a 1 fattura; ogni fattura è generata da 1 e una sola prenotazione. Generalizzazione: ogni cliente è un privato oppure un'azienda (totale: almeno uno dei due; esclusiva: non entrambi).Se una lettura suona strana o contraddice la traccia, la molteplicità è sbagliata.

Cardinalità

La cardinalità si ricava dai soli valori massimi. Due N danno N:M, due 1 danno 1:1, un 1 e un N danno 1:N. Nell'1:N l'entità con massimo 1 è quella che compare «dal lato N»: ogni sua istanza è collegata a una sola istanza dell'altra entità.

AssociazioneMassimo lato AMassimo lato BCardinalitàEntità con massimo 1
EFFETTUARECLIENTE: nPRENOTAZIONE: 11:N (un cliente, molte prenotazioni)PRENOTAZIONE
COMPRENDEREPRENOTAZIONE: nCAMERA: nN:Mnessuna
RICHIEDEREPRENOTAZIONE: nSERVIZIO: nN:Mnessuna
GENERAREPRENOTAZIONE: 1FATTURA: 11:1entrambe
💬 Tip del docente - minimi e cardinalità

I valori minimi non cambiano la cardinalità: servono più avanti per decidere dove mettere la chiave esterna e se può essere nulla. Chi deduce la cardinalità dai minimi sbaglia sempre. Cardinalità = solo massimi. Minimi = obbligo e NULL. Due cose diverse, due momenti diversi.

8. Schema E/R finale

Come si disegna: le entità sono rettangoli; le associazioni rombi con il nome; accanto a ogni entità si scrive (min,max); gli attributi sono collegati all'entità o all'associazione; gli identificatori hanno terminale pieno; l'attributo composto ha le componenti collegate; il multivalore si indica con (1,N) sull'attributo; la generalizzazione è una freccia dai figli verso il padre con l'etichetta (T,E).

SCHEMA E/R
Schema E/R - Hotel Aurora
Schema E/R - Hotel Aurora
🎯 Cosa deve mostrare lo schema

TUTTE LE ENTITÀ rettangoli con nome all'interno, identificatori (cerchio pieno) + attributi (cerchio vuoto) collegati
TUTTE LE ASSOCIAZIONI rombi con nome, molteplicità (min,max) sul collegamento lato entità
GENERALIZZAZIONE (T,E) freccia dai figli verso il padre con etichetta (T,E)
ATTRIBUTI SPECIALI indirizzo composto con componenti collegate · telefono con (1,N) · prezzo_notte, numero_ospiti e quantita collegati alle associazioni

RIEPILOGO TESTUALE DELLO SCHEMA E/R
• CLIENTE (id_cliente, indirizzo (via, civico, cap, città), email, telefono (1,N)) con generalizzazione (T,E) verso PRIVATO (codice_fiscale, nome, cognome, data_nascita) e AZIENDA (partita_iva, ragione_sociale, codice_destinatario). • CLIENTE (0,N) — EFFETTUARE — (1,1) PRENOTAZIONE (codice_prenotazione, data_registrazione, data_arrivo, data_partenza). • PRENOTAZIONE (1,N) — COMPRENDERE [prezzo_notte, numero_ospiti] — (0,N) CAMERA (numero_camera, piano, tipologia, posti_letto). • PRENOTAZIONE (0,N) — RICHIEDERE [quantita] — (0,N) SERVIZIO (codice_servizio, descrizione, prezzo_unitario). • PRENOTAZIONE (0,1) — GENERARE — (1,1) FATTURA (anno, numero_fattura, data_emissione, importo_totale).

9. Modello logico: regole, derivazione passo passo, schema finale

9.1 Regole di derivazione

Costrutto dello schema E/RRegolaDove si applica
EntitàDiventa una relazione; l'identificatore diventa chiave primaria (PK)Tutte le entità
Attributo compostoSi sostituisce con un attributo per ogni componenteindirizzo
Attributo multivaloreNuova relazione con chiave esterna verso l'entità e il valore; PK formata da entrambitelefono
GeneralizzazioneTre opzioni: accorpare i figli nel padre, accorpare il padre nei figli, sostituire con associazioniCLIENTE
Associazione 1:NChiave esterna (FK) nella relazione dell'entità con massimo 1; NOT NULL se il minimo è 1EFFETTUARE
Associazione N:MNuova relazione con PK formata dalle FK verso le due entità; gli attributi dell'associazione vi entranoCOMPRENDERE, RICHIEDERE
Associazione 1:1FK nell'entità con partecipazione obbligatoria (minimo 1), con vincolo UNIQUEGENERARE
Identificatore composto o alternativoPK composta; gli alternativi diventano UNIQUEFATTURA; codice fiscale, partita IVA

9.2 Derivazione passo passo

Passo A: entità e generalizzazione. Si creano le relazioni CAMERA, SERVIZIO, PRENOTAZIONE, FATTURA e CLIENTE. Per la generalizzazione (T,E) si confrontano le tre opzioni:

OpzioneComeVantaggiSvantaggiQui
Figli accorpati nel padreUna sola relazione CLIENTE con un attributo tipo e tutti gli attributi dei figliUna tabella, nessun join; l'esclusività si controlla con un CHECK sul tipoSette colonne specifiche, molte nulleAccettabile se motivata
Padre accorpato nei figliDue relazioni PRIVATO e AZIENDA con anche gli attributi di CLIENTENessun join per leggere un clienteEFFETTUARE andrebbe duplicata: PRENOTAZIONE non può avere una FK verso due tabelleScartata
Sostituzione con associazioniCLIENTE, PRIVATO e AZIENDA; la PK dei figli è anche FK verso CLIENTEAttributi comuni e associazioni in un solo posto, nessun NULLJoin per ricostruire un cliente; totalità ed esclusività non esprimibili con le FKScelta
💬 Tip del docente - perché scelgo la terza opzione

Si sceglie la terza opzione perché i due figli hanno attributi molto diversi e l'associazione EFFETTUARE riguarda il padre. Se avessi accorpato il padre nei figli, PRENOTAZIONE dovrebbe puntare a due tabelle diverse: impossibile con una sola FK. Questo ragionamento vale più di tante tabelle giuste ma non motivate.

Passo B: attributi composti e multivalore. L'indirizzo si scompone in via, civico, cap, citta dentro CLIENTE. Il telefono, multivalore, diventa la relazione TELEFONO_CLIENTE con PK (id_cliente, numero) e FK id_cliente verso CLIENTE.

Passo C: associazioni.

  • EFFETTUARE (1:N): PRENOTAZIONE ha massimo 1, quindi riceve la FK id_cliente. Il minimo è 1, quindi la FK è NOT NULL.
  • COMPRENDERE (N:M): nuova relazione COMPRENDERE con PK (codice_prenotazione, numero_camera), entrambe FK, più prezzo_notte e numero_ospiti.
  • RICHIEDERE (N:M): nuova relazione RICHIEDERE con PK (codice_prenotazione, codice_servizio), entrambe FK, più quantita.
  • GENERARE (1:1): FATTURA ha partecipazione obbligatoria (1,1), quindi riceve la FK codice_prenotazione, NOT NULL e UNIQUE. Mettere la FK in PRENOTAZIONE darebbe valori nulli per le prenotazioni non fatturate e una FK composta (anno, numero).
⚠️ Errore comune - la FK in GENERA

Se metti la FK da entrambe le parti, o senza UNIQUE, hai sbagliato l' 1:1. Una sola FK, dal lato obbligatorio, con UNIQUE. E se la metti in PRENOTAZIONE, dovresti usare come FK la PK composta di FATTURA (anno, numero): due colonne, quasi sempre nulle. Brutto e sbagliato.

Passo D: ordine di creazione. Prima CLIENTE, CAMERA, SERVIZIO; poi PRIVATO, AZIENDA, TELEFONO_CLIENTE e PRENOTAZIONE; infine COMPRENDERE, RICHIEDERE e FATTURA. Ogni tabella si crea dopo quelle a cui fa riferimento.

9.3 Schema logico finale

📌 Legenda

Grassetto e sottolineato = chiave primaria; corsivo = chiave esterna; grassetto corsivo sottolineato = chiave primaria che è anche chiave esterna.

SCHEMA LOGICO - HOTEL AURORA
CLIENTE(id_cliente, via, civico, cap, citta, email) TELEFONO_CLIENTE(id_cliente, numero) PRIVATO(id_cliente, codice_fiscale, nome, cognome, data_nascita) AZIENDA(id_cliente, partita_iva, ragione_sociale, codice_destinatario) CAMERA(numero_camera, piano, tipologia, posti_letto) SERVIZIO(codice_servizio, descrizione, prezzo_unitario) PRENOTAZIONE(codice_prenotazione, data_registrazione, data_arrivo, data_partenza, id_cliente) COMPRENDERE(codice_prenotazione, numero_camera, prezzo_notte, numero_ospiti) RICHIEDERE(codice_prenotazione, codice_servizio, quantita) FATTURA(anno, numero_fattura, data_emissione, importo_totale, codice_prenotazione)

Nota tipografica: nel codice sopra, il grassetto indica la PK e il corsivo la FK. In TELEFONO_CLIENTE, PRIVATO e AZIENDA la PK è formata anche da FK: è il caso "chiave primaria che è anche chiave esterna". Nella versione stampata / a mano, sottolinea la PK e usa la freccia o il corsivo per la FK, come facciamo in classe.

Vincoli di integrità referenziale

Chiave esternaRiferisceNote
TELEFONO_CLIENTE.id_clienteCLIENTE.id_cliente
PRIVATO.id_clienteCLIENTE.id_cliente
AZIENDA.id_clienteCLIENTE.id_cliente
PRENOTAZIONE.id_clienteCLIENTE.id_clienteNOT NULL
COMPRENDERE.codice_prenotazionePRENOTAZIONE.codice_prenotazione
COMPRENDERE.numero_cameraCAMERA.numero_camera
RICHIEDERE.codice_prenotazionePRENOTAZIONE.codice_prenotazione
RICHIEDERE.codice_servizioSERVIZIO.codice_servizio
FATTURA.codice_prenotazionePRENOTAZIONE.codice_prenotazioneNOT NULL, UNIQUE
🎯 Altri vincoli esprimibili

UNIQUE su PRIVATO.codice_fiscale e AZIENDA.partita_iva; NOT NULL sugli attributi obbligatori; CHECK data_partenza > data_arrivo in PRENOTAZIONE; CHECK sulla tipologia (singola, doppia, suite); quantita e prezzo_notte maggiori di zero.

10. Vincoli che lo schema logico non riesce a esprimere

Questa è la consegna 4, e spesso è quella che fa la differenza tra un compito sufficiente e uno ottimo. Il logico con PK, FK, UNIQUE, NOT NULL e CHECK esprime molto, ma non tutto.

VincoloPerché il logico non lo esprimeCome si risolve
Totalità ed esclusività della generalizzazioneOgni cliente deve comparire in esattamente una tra PRIVATO e AZIENDA. Le FK non lo garantiscono.Trigger o controllo applicativo (oppure, scegliendo l'accorpamento nel padre, un attributo tipo con CHECK)
Minime a 1 sul lato dell'entità forteOgni prenotazione deve avere almeno una camera in COMPRENDERE e ogni cliente almeno un telefono. Le FK non impongono righe nelle tabelle collegate.Trigger / controllo in fase di inserimento (transazione)
Numero di ospitinumero_ospiti in COMPRENDE non deve superare posti_letto in CAMERA (vincolo tra due tabelle).Trigger o controllo applicativo con lettura di CAMERA
Camera doppiamente prenotataLa stessa camera non può comparire in due prenotazioni con periodi sovrapposti.Trigger / controllo applicativo su date di arrivo e partenza
Coerenza della fatturaimporto_totale dovrebbe corrispondere a notti, prezzi e servizi della prenotazione.Calcolo applicativo al momento dell'emissione; il valore resta storico
💬 Tip del docente - come valuto questa traccia

Questa traccia vale 10 se: 1) dichiari le ipotesi, in particolare la 7 su RICHIEDERE, 2) metti la generalizzazione (T,E) con le tre opzioni confrontate, 3) derivi COMPRENDERE e RICHIEDERE come tabelle ponte con PK sulle due FK, 4) metti la FK di GENERARE in FATTURA con UNIQUE, 5) elenchi i vincoli che il logico non esprime, soprattutto totalità/esclusività e camera doppiamente prenotata. Se manca anche solo uno, non è da 10. Allenatevi a consegnare tutto, non solo il disegnino.

11. Errori comuni, checklist e varianti

⚠️ I 7 errori che vedo ogni anno su questa traccia Aurora

1. Mettere prezzo_notte in CAMERA o quantita in SERVIZIO invece che nell'associazione.
2. Scambiare minimo e massimo, o dedurre la cardinalità dai minimi.
3. Mettere la chiave esterna da entrambe le parti in un'associazione 1:1, o senza UNIQUE.
4. Aggiungere una chiave surrogata alle relazioni N:M invece di usare le FK come PK.
5. Dimenticare che le sottoentità hanno PK uguale alla FK verso il padre.
6. Trasformare la tipologia della camera in un'entità senza motivo.
7. Usare il codice fiscale come identificatore di CLIENTE.

CheckDomandaSe NO, cosa fare
GeneralizzazioneCLIENTE ha (T,E) e PRIVATO / AZIENDA hanno PK = FK verso CLIENTE?Aggiungi etichetta (T,E) e correggi le PK dei figli
N:MCOMPRENDERE e RICHIEDERE hanno PK sulle due FK, senza surrogata?Togli la surrogata, PK = (FK1, FK2)
1:1FATTURA ha FK codice_prenotazione NOT NULL + UNIQUE?Sposta la FK in FATTURA e aggiungi UNIQUE
MultivaloreTELEFONO_CLIENTE esiste come tabella a parte?Crea la tabella, non una colonna telefono in CLIENTE
LetturaRiesco a leggere ad alta voce?Se inciampi, rifai associazioni
VincoliHo elencato i vincoli non esprimibili?Aggiungi totalità, minime a 1, ospiti, sovrapposizione, fattura

Varianti per differenziare

  • Più strutture: aggiungere l'entità HOTEL, e CAMERA diventa entità debole identificata da (hotel, numero).
  • Servizi con data di erogazione: RICHIEDERE diventa un'entità con identificatore proprio.
  • Associazione ternaria: ogni camera di una prenotazione è assegnata a un addetto alla reception, con dipendente come terza entità.
🎯 Prova a fare da solo

Copri lo schema logico e prova a ridisegnarlo solo dalla traccia. Poi confronta: hai messo TELEFONO_CLIENTE? Hai scelto la terza opzione per la generalizzazione e l'hai motivata? Hai messo UNIQUE su FATTURA.codice_prenotazione? Se sì a tutte e tre, sei a posto.

✓Generalizzazione (T,E): ogni cliente è esattamente un privato oppure un'azienda, mai entrambi, mai nessuno
✓Attributi speciali: indirizzo composto → 4 colonne; telefono multivalore → tabella TELEFONO_CLIENTE; prezzo_notte, numero_ospiti e quantita sulle associazioni
✓N:M → tabella ponte: COMPRENDERE e RICHIEDERE con PK sulle due FK, senza surrogata
✓1:1 → FK UNIQUE: FATTURA riceve codice_prenotazione NOT NULL + UNIQUE
✓Vincoli non esprimibili: totalità/esclusività, minime a 1, ospiti ≤ posti letto, camera doppiamente prenotata, coerenza fattura
✦ Trasparenza AI: uso strumenti AI per bozze, schemi e immagini. Ogni contenuto lo revisiono, testo i comandi in laboratorio e lo riscrivo con la mia esperienza in classe prima di pubblicarlo. La responsabilità di quello che leggi è mia.
Mario Giagnotti
AUTORE
Mario Giagnotti
Ingegnere Elettronico e docente di Informatica.