Supponiamo che tu abbia una tabella Table
(principale) e una tabella Bookings
(dettaglio). Le prenotazioni hanno alcuni attributi come
- BookingID
- TableID
- StartDateTime
- data_ora_fine
- Nome del booker ecc.
Supponiamo inoltre che le prenotazioni possano essere raggruppate "di giorno" (il ristorante avrà probabilmente orari di chiusura regolari, e le prenotazioni non saranno consentite quando si sovrappongono a tali orari di chiusura).
Quindi organizza le tue transazioni in modo che tutte le modifiche al set di record di prenotazione per una tabella specifica e un giorno specifico vengano eseguite in una transazione , che
Se subisci una collisione, hai bisogno di una strategia per gestirla, come "prima arriva prima" o qualcosa del genere, ma non dovresti mai imbatterti in una situazione in cui ci sono prenotazioni sovrapposte nel database.
Una variazione di tale strategia potrebbe funzionare anche quando il ristorante non ha orari di chiusura. Caricare sempre tutte le prenotazioni di un tavolo e modificarle contemporaneamente, in un'unica transazione, in teoria potrebbe risolvere il problema, ma questo diventa rapidamente poco pratico se si devono sempre scrivere tutte le prenotazioni degli ultimi 5 anni per un tavolo, per ogni lieve cambiamento al programma. Tuttavia, limitando le modifiche solo alle prenotazioni future e proibendo qualsiasi modifica alle prenotazioni precedenti, questa diventa una strategia di lettura, modifica e commit dell'intero programma futuro in una sola volta. Questo dovrebbe funzionare, anche se il set di prenotazioni di un tavolo non può essere facilmente tagliato in sottoinsiemi indipendenti di giorno.