In realtà ho lavorato alla progettazione e all'implementazione di un sistema di prenotazione alberghiera e posso offrire i seguenti consigli in base alla mia esperienza.
Consiglierei la tua seconda opzione di progettazione, memorizzando un record per ogni singola combinazione di data / hotel. Il motivo è che, sebbene ci siano periodi in cui la tariffa di un hotel è la stessa su più giorni, è più probabile che, a seconda della disponibilità, cambierà nel tempo e diverrà (gli hotel tendono ad aumentare la tariffa della camera man mano che la disponibilità diminuisce).
Inoltre ci sono altre informazioni importanti che dovranno essere archiviate specifiche per un determinato giorno:
- Dovrai gestire la disponibilità dell'hotel, ovvero il giorno x ci sono e camere disponibili. Questo quasi certamente varierà di giorno in giorno.
- Alcuni hotel hanno periodi di blackout in cui l'hotel non è disponibile per brevi periodi di tempo (in genere giorni specifici).
- Tempo di consegna:alcuni hotel consentono di prenotare le camere solo con un certo numero di giorni di anticipo, questo può variare tra i giorni della settimana e i fine settimana.
- Numero minimo di notti, sempre dati memorizzati per data individuale che dice che se arrivi in questo giorno devi rimanere x numero di notti (diciamo durante un fine settimana)
Considera anche una persona che prenota un soggiorno di una settimana, la query del database per restituire le tariffe e la disponibilità per ogni giorno di quel soggiorno è molto più concisa se hai un record dei prezzi per ciascuna data. Puoi semplicemente fare una query in cui la data della tariffa della camera è TRA la data di arrivo e quella di partenza per restituire un set di dati con un record per data del soggiorno.
Mi rendo conto che con questo approccio memorizzerai più record ma con tabelle ben indicizzate le prestazioni andranno bene e la gestione dei dati sarà molto più semplice. A giudicare dal tuo commento, stai parlando solo nella regione di 18000 record, che è un volume piuttosto piccolo (il sistema su cui ho lavorato ha diversi milioni e funziona bene).
Per illustrare la gestione dei dati extra se NON memorizza un record al giorno, immagina che un Hotel abbia una tariffa di 100 USD e 20 camere disponibili per tutto il mese di dicembre:
Inizierai con un record:
1-Dec to 31st Dec Rate 100 Availability 20
Poi vendi una stanza il 10 dic.
La tua logica aziendale ora deve creare tre record da quello sopra:
1-Dec to 9th Dec Rate 100 Availability 20
10-Dec to 10th Dec Rate 100 Availability 19
11-Dec to 31st Dec Rate 100 Availability 20
Quindi la tariffa cambia il 3 e il 25 dicembre a 110
La tua logica aziendale ora deve dividere nuovamente i dati:
1-Dec to 2-Dec Rate 100 Availability 20
3-Dec to 3-Dec Rate 110 Availability 20
4-Dec to 9-Dec Rate 100 Availability 20
10-Dec to 10-Dec Rate 100 Availability 19
11-Dec to 24-Dec Rate 100 Availability 20
25-Dec to 25-Dec Rate 110 Availability 20
26-Dec to 31-Dec Rate 100 Availability 20
Questa è più logica aziendale e più sovraccarico rispetto all'archiviazione di un record per data.
Posso garantirti che quando avrai finito il tuo sistema finirà comunque con una riga per data, quindi potresti anche progettarlo in questo modo dall'inizio e ottenere i vantaggi di una gestione dei dati più semplice e query più rapide al database.