AUTOMATIZZARE IL SISTEMA DI GESTIONE E PRENOTAZIONE ONLINE DI CAMPI SPORTIVI: analisi+SQL.

Anatomia SQL
Anatomia SQL

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
** 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.