Esempio pratico completo e realistico per l’automazione del sistema di gestione e prenotazione online del noleggio biciclette cittadine, con:
- analisi del sistema
- progettazione database
- creazione tabelle SQL
- inserimento dati di esempio
- query SQL operative
- controlli disponibilità
Compatibile con MySQL / PostgreSQL.
Sistema di prenotazione online per affitto biciclette cittadine.
1. Scenario reale.
Un servizio di bike sharing permette agli utenti di:
- registrarsi alla piattaforma
- consultare le aree/stazioni disponibili
- prenotare biciclette
- ritirare e restituire bici
- pagare il servizio
L’azienda deve:
– monitorare disponibilità bici
– gestire prenotazioni
– controllare manutenzioni
– tracciare utilizzo mezzi
2. Funzionalità principali.
Cliente.
- Registrazione e login
- Ricerca stazioni
- Prenotazione bici
- Visualizzazione storico noleggi
Operatore.
- Inserimento biciclette
- Gestione stazioni
- Monitoraggio noleggi
3. Progettazione Database.
Tabelle principali
- UTENTI
- AREE_CITTA
- STAZIONI
- BICICLETTE
- PRENOTAZIONI
- PAGAMENTI
4. Creazione Tabelle SQL.
Tabella UTENTI
CREATE TABLE Utenti (
idUtente INT PRIMARY KEY AUTO_INCREMENT,
nome VARCHAR(50),
cognome VARCHAR(50),
email VARCHAR(100) UNIQUE[1] NOT NULL,
telefono VARCHAR(20)
);
Tabella AREE_CITTA
CREATE TABLE AreeCitta (
idArea INT PRIMARY KEY AUTO_INCREMENT,
nomeArea VARCHAR(50),
descrizione VARCHAR(150)
);
Tabella STAZIONI
CREATE TABLE Stazioni (
idStazione INT PRIMARY KEY AUTO_INCREMENT,
nomeStazione VARCHAR(100),
idArea INT,
postiTotali INT,
FOREIGN KEY (idArea) REFERENCES AreeCitta(idArea)
);
Tabella BICICLETTE
CREATE TABLE Biciclette (
idBici INT PRIMARY KEY AUTO_INCREMENT,
tipo VARCHAR(50),
stato VARCHAR(30) DEFAULT ‘Disponibile’,
idStazione INT,
FOREIGN KEY (idStazione) REFERENCES Stazioni(idStazione)
);
Tabella PRENOTAZIONI
CREATE TABLE Prenotazioni (
idPrenotazione INT PRIMARY KEY AUTO_INCREMENT,
idUtente INT,
idBici INT,
dataInizio DATETIME,
dataFine DATETIME,
costoTotale DECIMAL(6,2),
stato VARCHAR(30),
FOREIGN KEY (idUtente) REFERENCES Utenti(idUtente),
FOREIGN KEY (idBici) REFERENCES Biciclette(idBici)
);
Tabella PAGAMENTI
CREATE TABLE Pagamenti (
idPagamento INT PRIMARY KEY AUTO_INCREMENT,
idPrenotazione INT,
dataPagamento DATETIME,
metodo VARCHAR(50),
statoPagamento VARCHAR(30),
FOREIGN KEY (idPrenotazione) REFERENCES Prenotazioni(idPrenotazione)
);
5. Inserimento dati di esempio.
Inserimento aree città.
INSERT INTO AreeCitta (nomeArea, descrizione)
VALUES
(‘Centro Storico’, ‘Zona turistica centrale’),
(‘Zona Universitaria’, ‘Area università’);
Inserimento stazioni.
INSERT INTO Stazioni (nomeStazione, idArea, postiTotali)
VALUES
(‘Stazione Piazza Roma’, 1, 20),
(‘Stazione Università’, 2, 15);
Inserimento biciclette.
INSERT INTO Biciclette (tipo, idStazione)
VALUES
(‘Tradizionale’, 1),
(‘Elettrica’, 1),
(‘Tradizionale’, 2);
Inserimento utente.
INSERT INTO Utenti (nome, cognome, email)
VALUES (‘Marco’, ‘Rossi’, ‘marco@email.it’);
6. Inserimento prenotazione.
INSERT INTO Prenotazioni
(idUtente, idBici, dataInizio, dataFine, costoTotale, stato)
VALUES
(1, 1, ‘2026-03-01 10:00’, ‘2026-03-01 12:00’, 10.00, ‘Attiva’);
Registrazione pagamento.
INSERT INTO Pagamenti
(idPrenotazione, dataPagamento, metodo, statoPagamento)
VALUES
(1, NOW(), ‘Carta credito’, ‘Pagato’);
7. Query SQL operative.
Visualizzare biciclette disponibili in una stazione.
SELECT *
FROM Biciclette
WHERE idStazione = 1
AND stato = ‘Disponibile’;
Verificare disponibilità bici in un intervallo orario.
SELECT *
FROM Biciclette B
WHERE B.idStazione = 1
AND B.idBici NOT IN (
SELECT idBici
FROM Prenotazioni
WHERE ‘2026-03-01 11:00’ BETWEEN dataInizio AND dataFine
);
Visualizzare prenotazioni di un utente.
SELECT P.idPrenotazione, B.tipo, P.dataInizio, P.dataFine
FROM Prenotazioni P
JOIN Biciclette B ON P.idBici = B.idBici
WHERE P.idUtente = 1;
Visualizzare biciclette per area città.
SELECT B.idBici, S.nomeStazione, A.nomeArea
FROM Biciclette B
JOIN Stazioni S ON B.idStazione = S.idStazione
JOIN AreeCitta A ON S.idArea = A.idArea;
Calcolo incassi totali.
SELECT SUM(costoTotale) AS TotaleIncassi
FROM Prenotazioni
WHERE stato = ‘Attiva’;
Storico utilizzo bicicletta.
SELECT dataInizio, dataFine
FROM Prenotazioni
WHERE idBici = 1;
8. Aggiornamento stato bicicletta.
Quando una bici viene noleggiata:
UPDATE Biciclette
SET stato = ‘Noleggiata’
WHERE idBici = 1;
9. Automazioni possibili.
– Aggiornamento disponibilità in tempo reale
– Invio email conferma prenotazione
– Promemoria restituzione bici
– Gestione manutenzioni automatiche
– Dashboard utilizzo stazioni
– Statistiche traffico urbano
10. Estensioni avanzate.
- Sblocco bici tramite QR Code
- Integrazione GPS
- Tariffe dinamiche
- Abbonamenti mensili
- App mobile utenti
Benefici del sistema.
- Ottimizzazione utilizzo biciclette
- Riduzione gestione manuale
- Miglior servizio utenti
- Monitoraggio traffico urbano
[1] Il vincolo UNIQUE in SQL è una regola applicata a una o più colonne di una tabella per garantire che tutti i valori in tali colonne siano distinti tra loro, prevenendo la duplicazione dei dati. A differenza della PRIMARY KEY, un vincolo UNIQUE può accettare valori NULL (a meno che non sia definito diversamente) e una tabella può avere più vincoli UNIQUE.
