AUTOMATIZZARE IL SISTEMA DI GESTIONE DELLE PRENOTAZIONI ONLINE PER L’AFFITTO DI BICICLETTE PER LA CIRCOLAZIONE IN VARIE AREE DELLA CITTA’: analisi+SQL

Anatomia SQL
Anatomia SQL

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.

** Se puoi sostenere il mio lavoro, comprami un libro | Buy me a book! **
** ISCRIVITI ALLA NEWSLETTER ! **

About the Author

Sergio Mauri
Blogger, autore. Perito in Sistemi Informativi Aziendali, musicista e compositore, Laurea in Discipline storiche e filosofiche e in Filosofia. Premio speciale al Concorso Claudia Ruggeri nel 2007; terzo posto al Premio Igor Slavich nel 2020. Ha pubblicato con Terra d'Ulivi nel 2007 e nel 2011, con Hammerle Editori nel 2013 e 2014, con PGreco nel 2015 con Historica Edizioni e Alcova Letteraria nel 2022 con Silele Edizioni (La Tela Nera) nel 2023 e con Amazon Kdp nel 2024 e 2025.