Esempio pratico completo e realistico di automazione del sistema di gestione e prenotazione online di campi sportivi, comprensivo di:
- analisi del problema
- progettazione database
- creazione tabelle SQL
- inserimento dati di esempio
- query operative reali
Lo schema è compatibile con MySQL / PostgreSQL.
Sistema di gestione e prenotazione campi sportivi.
1. Scenario reale
Un centro sportivo gestisce diversi campi:
- calcio a 5
- tennis
- padel
- basket
Gli utenti devono poter:
- registrarsi
- consultare disponibilità campi
- prenotare fasce orarie
- pagare il noleggio
Il centro sportivo deve:
- gestire campi e tariffe
- controllare prenotazioni
- gestire manutenzioni
- generare report utilizzo
2. Funzionalità del sistema.
– Registrazione utenti
– Visualizzazione disponibilità campi
– Prenotazione online
– Gestione orari
– Storico prenotazioni
– Controllo sovrapposizioni prenotazioni
3. Progettazione Database.
Tabelle principali
- UTENTI
- TIPI_CAMPO
- CAMPI
- 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 NOT NULL, — È un vincolo (constraint) che garantisce che ogni valore inserito nella colonna email sia unico in tutta la tabella. Non possono esistere due righe con lo stesso indirizzo email.
telefono VARCHAR(20)
);
Tabella TIPI_CAMPO
CREATE TABLE TipiCampo (
idTipoCampo INT PRIMARY KEY AUTO_INCREMENT,
descrizione VARCHAR(50),
tariffaOraria DECIMAL(6,2)
);
Tabella CAMPI
CREATE TABLE Campi (
idCampo INT PRIMARY KEY AUTO_INCREMENT,
nomeCampo VARCHAR(50),
idTipoCampo INT,
stato VARCHAR(30) DEFAULT ‘Disponibile’,
FOREIGN KEY (idTipoCampo) REFERENCES TipiCampo(idTipoCampo)
);
Tabella PRENOTAZIONI
CREATE TABLE Prenotazioni (
idPrenotazione INT PRIMARY KEY AUTO_INCREMENT,
idUtente INT,
idCampo INT,
dataPrenotazione DATE,
oraInizio TIME,
oraFine TIME,
costoTotale DECIMAL(6,2),
stato VARCHAR(30),
FOREIGN KEY (idUtente) REFERENCES Utenti(idUtente),
FOREIGN KEY (idCampo) REFERENCES Campi(idCampo)
);
Tabella PAGAMENTI
CREATE TABLE Pagamenti (
idPagamento INT PRIMARY KEY AUTO_INCREMENT,
idPrenotazione INT,
dataPagamento DATETIME,
metodoPagamento VARCHAR(50),
statoPagamento VARCHAR(30),
FOREIGN KEY (idPrenotazione) REFERENCES Prenotazioni(idPrenotazione)
);
5. Inserimento dati di esempio.
Inserimento utenti
INSERT INTO Utenti (nome, cognome, email, telefono)
VALUES
(‘Marco’, ‘Ferrari’, ‘marco@email.it’, ‘333111111’),
(‘Luca’, ‘Rossi’, ‘luca@email.it’, ‘333222222’);
Inserimento tipi campo
INSERT INTO TipiCampo (descrizione, tariffaOraria)
VALUES
(‘Calcio a 5’, 60.00),
(‘Tennis’, 25.00),
(‘Padel’, 40.00);
Inserimento campi
INSERT INTO Campi (nomeCampo, idTipoCampo)
VALUES
(‘Campo Calcio 1’, 1),
(‘Campo Tennis 1’, 2),
(‘Campo Padel 1’, 3);
6. Inserimento prenotazione.
Esempio di prenotazione con costo calcolato manualmente.
INSERT INTO Prenotazioni
(idUtente, idCampo, dataPrenotazione, oraInizio, oraFine, costoTotale, stato)
VALUES
(1, 1, ‘2026-02-20′, ’18:00′, ’19:00’, 60.00, ‘Confermata’);
Inserimento pagamento
INSERT INTO Pagamenti
(idPrenotazione, dataPagamento, metodoPagamento, statoPagamento)
VALUES
(1, NOW(), ‘Carta di credito’, ‘Pagato’);
7. Query SQL operative.
Visualizzare disponibilità campi in una certa data
SELECT C.nomeCampo
FROM Campi C
WHERE C.idCampo NOT IN (
SELECT idCampo
FROM Prenotazioni
WHERE dataPrenotazione = ‘2026-02-20’
);
Visualizzare prenotazioni di un utente
SELECT P.idPrenotazione, C.nomeCampo, P.dataPrenotazione, P.oraInizio, P.oraFine
FROM Prenotazioni P
JOIN Campi C ON P.idCampo = C.idCampo
WHERE P.idUtente = 1;
Visualizzare calendario prenotazioni di un campo
SELECT dataPrenotazione, oraInizio, oraFine
FROM Prenotazioni
WHERE idCampo = 1
ORDER BY dataPrenotazione, oraInizio;
Calcolare incassi totali
SELECT SUM(costoTotale) AS TotaleIncassi
FROM Prenotazioni
WHERE stato = ‘Confermata’;
Prenotazioni pagate
SELECT P.idPrenotazione, U.nome, C.nomeCampo
FROM Pagamenti PA
JOIN Prenotazioni P ON PA.idPrenotazione = P.idPrenotazione
JOIN Utenti U ON P.idUtente = U.idUtente
JOIN Campi C ON P.idCampo = C.idCampo
WHERE PA.statoPagamento = ‘Pagato’;
8. Controllo sovrapposizione prenotazioni
Query per verificare se un campo è già prenotato in una fascia oraria:
SELECT *
FROM Prenotazioni
WHERE idCampo = 1
AND dataPrenotazione = ‘2026-02-20’
AND (
(’18:30′ BETWEEN oraInizio AND oraFine)
OR
(’19:30′ BETWEEN oraInizio AND oraFine)
);
9. Automazioni possibili.
– Calcolo automatico costo prenotazione
– Invio email conferma
– Promemoria partita
– Blocco campo per manutenzione
– Dashboard utilizzo campi
– Gestione tornei
10. Estensioni avanzate.
- Prenotazioni ricorrenti
- Abbonamenti clienti
- Check-in tramite QR Code
- Integrazione app mobile
- Statistiche utilizzo campi
Benefici del sistema
- Riduzione errori gestione manuale
- Prenotazioni sempre aggiornate
- Miglior gestione disponibilità
- Maggiore soddisfazione utenti
