Come si modella la realtà con lo schema E/R - Esempio noleggio e-bike e monopattini | Prof. Giagnotti
Basi di Dati · Anno 3 · Modulo E/R · Guida pratica
✍ Autore: profgiagnotti · Materia: Sistemi e Reti / Informatica

Come si modella la realtà con lo schema E/R - Esempio noleggio e-bike e monopattini

Dal testo discorsivo allo schema concettuale: gestiamo mezzi elettrici, clienti privati e aziende, fornitori unici per modello, noleggi come eventi storici e listino tariffe con validità temporale.

⏱ 30 min lettura 🎯 Livello: 5° Superiore / ITS 🧩 Focus: Generalizzazione + Storico + 1:N mascherato 💡 Metodo: 8 passi
🎯 Cosa imparerai in questa guida
✓Trasformare un regolamento di noleggio in entità, associazioni e vincoli senza inventare nulla
✓Gestire specializzazione CLIENTE in PRIVATO e AZIENDA, storico tariffe e fornitore unico per modello
✓Capire quando NOLEGGIO e TARIFFA sono entità e non semplici associazioni o attributi
✓Scrivere molteplicità (min,max) e regole di lettura come richiesto in verifica scritta
✓Evitare i 5 errori classici: tariffa in MEZZO, noleggio N:M, fornitore N:M, doppie associazioni cliente

1. Lo scenario: cosa ci chiede il problema

📌 Traccia originale - da non perdere

Progettare un DB per gestione noleggio e-bike e monopattini elettrici: ogni mezzo ha codice univoco, modello, marca, elettrico sì/no, pieghevole sì/no, categoria {City, Cargo, Mountain}, clienti (codice cliente, privati con nome+cognome+indirizzo+patente, aziende con p.iva+ragione sociale+indirizzo+referente), fornitori (codice, nome, p.iva, indirizzo, fornisce più modelli ma stesso modello sempre dallo stesso fornitore), noleggi (data inizio, data fine prevista ed effettiva, km percorsi, mezzo noleggiato), listino tariffe storico per modello con validità.

L'obiettivo è allenarti a riconoscere pattern, non a memorizzare entità.

💬 Tip del docente

Sottolinea subito con 3 colori: BLU i sostantivi che diventano entità, GIALLO gli aggettivi che diventano attributi, VERDE i verbi che diventano associazioni. Se un verbo ha attributi tipo data, km, importo -> è entità evento. Te lo chiedo sempre.

2. Analisi preliminare: i 5 aspetti da gestire

Prima di disegnare, scriviamo le 5 aree funzionali:

01 · CATALOGO

Mezzi elettrici

modello, marca, codice, caratteristiche stabili tipo pieghevole

02 · ANAGRAFICHE

Clienti + Fornitori

Privato vs Azienda, specializzazione totale/esclusiva

03 · MOVIMENTI

Noleggi

Evento storico: cliente + mezzo + date + km + importo

04 · STORICO

Tariffe

Listino variabile nel tempo, non attributo di MEZZO

05 · TRASVERSALE

Stabili vs variabili

Codici stabili, tariffe variabili: servono entità diverse

06 · METODO

8 passi concettuali

Entità → Associazioni → Attributi → Molteplicità → Verifica

🎯 Esempio in classe

Pensa al negozio di e-bike: ha la bici esposta (MEZZO), chi te la vende (FORNITORE), te che la noleggi per il weekend (CLIENTE), il contratto (NOLEGGIO) e il cartellino prezzo giornaliero che cambia in estate (TARIFFA). Se lo racconti a voce, lo sai modellare.

3. Individuazione dei vincoli + ipotesi aggiuntive

A. Vincoli mezzo

  • Codice mezzo univoco identificativo
  • Marca + modello obbligatori
  • elettrico boolean, pieghevole boolean
  • categoria: {City, Cargo, Mountain} - ipotesi: ogni mezzo ha UNA sola categoria
⚠️ Errore comune n.1

Mettere "city" e "mountain" come due booleani separati. Così un mezzo potrebbe essere City E Mountain E né City né Mountain. Usa attributo singolo categoria con dominio {City, Cargo, Mountain}.

B. Vincoli clienti

  • Codice cliente univoco, comune a privati e aziende
  • PRIVATO: nome, cognome, indirizzo, numero patente
  • AZIENDA: ragione sociale, indirizzo, p.iva, nominativo referente
💬 Tip del docente

CLIENTE come generalizzazione totale ed esclusiva: ogni cliente DEVE essere privato O azienda, non può essere entrambi, non può essere nessuno. Scrivi sempre "T,E" vicino al cerchio. Se lo ometti, modello incompleto.

C. Vincoli fornitori - il vincolo chiave

📌 Vincolo più importante della traccia

"Lo stesso modello è fornito sempre dallo stesso fornitore" → significa FORNITORE (0,n) --- (1,1) MODELLO. È un 1:N, NON N:M. Se sbagli questo, sbagli tutto.

D. Noleggi

Ogni noleggio: un cliente, un mezzo, data inizio, data fine prevista, data fine effettiva (nullable), km percorsi, importo applicato.

E. Listino tariffe

Tariffa giornaliera NON in MEZZO. Serve entità TARIFFA con data_inizio, data_fine (nullable), importo giornaliero, tipo {giornaliera, oraria}.

Ipotesi aggiuntive (dichiarate!)

IpotesiPerché la introducoAlternativa
codice_noleggio in NOLEGGIOCliente+data+mezzo non è chiave: stesso cliente può noleggiare stesso mezzo 2 volte lo stesso giornoChiave composta rischiosa e non stabile
importo_applicato in NOLEGGIOPer storicizzare prezzo reale se tariffa cambia dopo restituzioneNon obbligatorio ma consigliato
codice_tariffa in TARIFFAIdentifica versioni temporali della tariffaAlternativa: (codice_mezzo, data_inizio) come chiave
nome, indirizzo in CLIENTEAttributi comuni a privati e aziende, evitano duplicazioneMettere tutto nei sottotipi = ridondanza
🎯 Vincoli di integrità da rispettare

Univocità: codici unici
Esistenza: noleggio → cliente e mezzo esistenti
Coerenza temporale: data_fine_prevista ≥ data_inizio, data_fine_effettiva ≥ data_inizio
No sovrapposizioni: per stesso mezzo non due tariffe valide nello stesso periodo
Coerenza sottotipo: un cliente = un solo sottotipo
km ≥0, importo >0

4. Le entità: perché Noleggio e Tariffa sono entità

Schema finale: 5 entità principali + 2 sottotipi:

ENTITÀ 01

MEZZO

Esempi: E-Bike City 250W, Monopattino Pro. Attributi identificativi + booleani + categoria

ENTITÀ 02

CLIENTE (gen.)

Generalizzazione. Partecipa a EFFETTUA. Totale Esclusiva → PRIVATO, AZIENDA

ENTITÀ 03

FORNITORE

Codice, ragione sociale, p.iva, indirizzo. Fornisce N modelli.

ENTITÀ 04

NOLEGGIO

Perché è entità? Ha attributi propri (date, km, importo) ed è evento storico. Se fosse solo associazione tra CLIENTE e MEZZO non potresti avere stesso cliente+mezzo in date diverse.

ENTITÀ 05

TARIFFA

Perché è entità? Un attributo prezzo in MEZZO terrebbe solo prezzo corrente. Qui: City 25€ dal 1/6 al 31/8, 18€ resto anno... storico.

SOTTOTIPI

PRIVATO / AZIENDA

Ereditano codice_cliente. PRIVATO aggiunge patente, AZIENDA aggiunge p.iva e referente. Non creare associazioni separate per noleggi.

💬 Tip del docente - domanda trabocchetto

"Prof, NOLEGGIO non è un'associazione?" Risposta che voglio: "No, perché ha attributi propri e deve esistere come oggetto storico distinguibile, con identificatore proprio. Altrimenti non potrei registrare due noleggi identici in giorni diversi." Scrivetelo così.

5. Associazioni e specializzazione

Quattro associazioni + una specializzazione:

E/R · ASSOCIAZIONI
1. FORNIRE: FORNITORE -- MEZZO 2. EFFETTUARE: CLIENTE -- NOLEGGIO 3. RIGUARDARE: NOLEGGIO -- MEZZO 4. APPARTENERE: MEZZO -- TARIFFA 5. IS-A: CLIENTE -> PRIVATO / AZIENDA (Totale, Esclusiva)
⚠️ Errore comune n.2 - N:M fantasma

Molti disegnano FORNITORE - MEZZO come N:M "perché un fornitore fornisce più mezzi e un mezzo può essere fornito da più fornitori". Ma la traccia dice ESPLICITAMENTE il contrario: stesso modello SEMPRE dallo stesso fornitore. È 1:N. Leggete il vincolo.

6. Attributi: cosa mettere dove (e cosa NON duplicare)

MEZZO

Identificatore {PK}: codice_mezzo (non modello! Modello non è univoco). Altri: marca, modello, elettrico {Sì/No}, pieghevole {Sì/No}, categoria {City, Cargo, Mountain}

CLIENTE (soluzione compatta che preferisco)

Identificatore {PK}: codice_cliente, indirizzo → comuni. PRIVATO: nome, cognome, patente. AZIENDA: ragione_sociale, p.iva, referente. Così eviti duplicazione.

💬 Tip del docente

Variante ammessa: mettere indirizzo solo nei sottotipi. È corretta ma ridondante. Io premio la soluzione compatta perché dimostra che hai capito l'ereditarietà.

FORNITORE

Identificatore {PK}: codice_fornitore, nome, p.iva, indirizzo.

NOLEGGIO

Identificatore {PK}: codice_noleggio, data_inizio, data_fine_prevista, data_fine_effettiva, km_percorsi, importo_applicato. Non usare come chiave (cliente+data+mezzo): fallisce se noleggi due volte stesso mezzo lo stesso giorno.

⚠️ Errore comune n.3 - Due associazioni per clienti

Non creare NOLEGGIO_PRIVATO e NOLEGGIO_AZIENDA. I noleggi sono legati a CLIENTE generale. La specializzazione eredita già l'associazione. Doppia associazione = schema sporco.

TARIFFA

Identificatore {PK}: codice_tariffa, importo_giornaliero, data_inizio_validita, data_fine_validita (NULL se ancora valido), tipo_tariffa {Oraria, Giornaliera}.

🎯 Attributi di associazione? No.

Km NON è attributo di EFFETTUA, è di NOLEGGIO. Importo NON è attributo di APPARTENERE, è di TARIFFA.

7. Molteplicità e cardinalità con regole di lettura

Uso notazione (min,max): (0,1) facoltativo al max 1, (1,1) obbligatorio esattamente 1, (0,n) facoltativo n, (1,n) obbligatorio almeno 1.

AssociazioneMolteplicitàCardinalitàPerché min=0 o 1?
FORNIRE
FORNITORE-MEZZO
FORNITORE (0,n) — (1,1) MEZZO1:NFornitore (0,n): appena inserito può non avere mezzi. Mezzo (1,1): ogni mezzo deve avere fornitore.
EFFETTUARE
CLIENTE-NOLEGGIO
CLIENTE (0,n) — (1,1) NOLEGGIO1:NCliente può non aver ancora noleggiato. Noleggio non esiste senza cliente.
RIGUARDARE
NOLEGGIO-MEZZO
NOLEGGIO (1,1) — (0,n) MEZZON:1Noleggio riguarda 1 mezzo. Mezzo può non essere mai stato noleggiato.
APPARTENERE
MEZZO-TARIFFA
MEZZO (0,n) — (1,1) TARIFFA1:NMezzo inserito prima di avere tariffa. Tariffa deve appartenere a 1 mezzo.
📌 Specializzazione CLIENTE

Totale: ogni cliente è privato o azienda. Esclusiva: non può essere entrambi. Deriva da ipotesi che categorie siano alternative ed esaustive nel testo.

⚠️ Errore comune n.4 - N:M fantasma

Molti disegnano FORNITORE - MEZZO come N:M "perché un fornitore fornisce più mezzi e un mezzo può essere fornito da più fornitori". Ma la traccia dice ESPLICITAMENTE il contrario: stesso modello SEMPRE dallo stesso fornitore. È 1:N. Leggete il vincolo, non inventate.

Regole di lettura (le voglio così in verifica!)

VERIFICA · REGOLE DI LETTURA
FORNIRE: Un fornitore può fornire 0,1,N mezzi. Ogni mezzo è fornito da 1 e 1 solo fornitore. EFFETTUARE: Un cliente può effettuare 0,1,N noleggi. Ogni noleggio è effettuato da 1 solo cliente. RIGUARDARE: Ogni noleggio riguarda 1 solo mezzo. Un mezzo può essere oggetto di 0,1,N noleggi. APPARTENERE: Un mezzo può avere 0,1,N tariffe storiche. Ogni tariffa appartiene a 1 solo mezzo. IS-A: Ogni cliente è un privato oppure un'azienda. Un privato è un cliente. Un'azienda è un cliente. Nessun cliente è entrambi. Controllo extra: per stesso mezzo non devono esistere periodi tariffa sovrapposti -> vincolo non esprimibile con sole cardinalità, serve CHECK successivo.
💬 Tip del docente

Se in verifica scrivete solo "1:N" senza min e max, per me è incompleto. Voglio vedere (0,N) vs (1,1) con motivazione del minimo. Il minimo racconta se l'entità può esistere senza l'altra.

8. Schema E/R finale

SCHEMA E/R - NOLEGGIO E-BIKE E MONOPATTINI
FORNITORE • codice_fornitore {PK} • nome, p.iva, indirizzo FORNIRE (0,n) (1,1) MEZZO • codice_mezzo {PK} • marca, modello • elettrico, pieghevole • categoria {City,Cargo,Mount} APPARTIENE (0,n) (1,1) TARIFFA • codice_tariffa {PK} • importo_giornaliero • data_inizio • data_fine (NULL) • tipo {Oraria,Giorn} RIGUARDA (0,n) (1,1) NOLEGGIO • codice_noleggio {PK} • data_inizio • data_fine_prev/eff • km_percorsi • importo_applicato EFFETTUA (1,1) (0,n) CLIENTE • codice_cliente {PK} • indirizzo • telefono, email T,E PRIVATO • nome, cognome • patente Eredita da CLIENTE AZIENDA • ragione_sociale • p.iva • referente • telefono az. Eredita da CLIENTE LEGENDA: Rettangolo = Entità | Rombo = Associazione | Cerchio T,E = Specializzazione Totale Esclusiva FORNITORE (0,n) - (1,1) MEZZO | CLIENTE (0,n) - (1,1) NOLEGGIO | NOLEGGIO (1,1) - (0,n) MEZZO | MEZZO (0,n) - (1,1) TARIFFA Vincoli extra: no sovrapposizione tariffe, km ≥0, data_fine ≥ data_inizio
🎯 Cosa deve mostrare lo schema

TUTTE LE ENTITA' rettangoli con nome all'interno, {PK} con attributi collegati e nominati
TUTTE LE ASSOCIAZIONI rombi con molteplicità indicate sul collegamento ENTITA'-ASSOCIAZIONE lato entità
TUTTE LE SPECIALIZZAZIONI con doppio segmento verso cerchio all'interno del quale si indica T/E → specializzazione (rettangolo come entità) collegata al cerchio da un segmento

9. Errori comuni e checklist finale (da stampare)

⚠️ I 5 errori che vedo ogni anno

1. Tariffa in MEZZO → perdi storico
2. NOLEGGIO come associazione N:M tra CLIENTE e MEZZO → non puoi registrare 2 noleggi uguali in giorni diversi
3. FORNIRE N:M → viola vincolo "stesso modello sempre stesso fornitore"
4. Due entità PRIVATO e AZIENDA separate senza generalizzazione → duplichi associazioni
5. Km come attributo di CLIENTE o di MEZZO → non descrive l'evento noleggio

CheckDomandaSe NO, cosa fare
EntitàOgni entità ha identificatore?Aggiungi codice_noleggio, codice_tariffa
SpecializzazioneHo dichiarato T,E?Scrivi "Totale Esclusiva"
FornitoreMEZZO ha (1,1) verso FORNITORE?Correggi molteplicità
StoricoPosso avere più tariffe per stesso mezzo?Se no, hai messo tariffa in MEZZO
SovrapposizioniHo previsto vincolo no-overlap date tariffa?Annota nei vincoli di integrità
LetturaRiesco a leggere schema ad alta voce?Se inciampi, lo schema è sbagliato
💬 Tip del docente - come prendo il voto

In verifica non guardo solo il disegno. Voglio: 1) vincoli scritti, 2) ipotesi dichiarate, 3) molteplicità con min/max, 4) regole di lettura, 5) identificatori visibili. Se manca uno di questi, anche se il disegno è bello, non è da 10.

✓NOLEGGIO e TARIFFA sono entità perché hanno attributi propri e storicità, non sono semplici attributi o associazioni
✓FORNIRE è 1:N per vincolo testuale: stesso modello sempre stesso fornitore → (0,n) fornitore, (1,1) mezzo
✓CLIENTE è generalizzazione Totale Esclusiva in PRIVATO e AZIENDA: evita duplicazione e doppie associazioni
✓categoria singolo attributo {City, Cargo, Mountain} evita combinazioni inconsistenti, meglio di due booleani
✓Vincoli extra-min/max: no sovrapposizione tariffe, km>0, importo_applicato per audit storico
✓Metodo 8 passi: entità → associazioni → attributi → attributi associazioni → molteplicità → cardinalità → regole lettura → verifica