La mia esperienza DBA non va molto oltre la semplice memorizzazione + il recupero di dati in stile CMS - quindi questa potrebbe essere una domanda sciocca, non lo so!
Ho un problema per cui devo cercare o calcolare i prezzi delle vacanze per una determinata dimensione del gruppo e un certo numero di giorni in un determinato periodo di tempo. Per esempio:
Quanto costa una camera d'albergo per 2 persone per 4 notti in qualsiasi momento a gennaio?
Ho dei dati su prezzi e disponibilità per, per esempio, 5000 hotel archiviati in questo modo:
Hotel ID | Date | Spaces | Price PP
-----------------------------------
123 | Jan1 | 5 | 100
123 | Jan2 | 7 | 100
123 | Jan3 | 5 | 100
123 | Jan4 | 3 | 100
123 | Jan5 | 5 | 100
123 | Jan6 | 7 | 110
456 | Jan1 | 5 | 120
456 | Jan2 | 1 | 120
456 | Jan3 | 4 | 130
456 | Jan4 | 3 | 110
456 | Jan5 | 5 | 100
456 | Jan6 | 7 | 90
Con questa tabella, posso fare una query in questo modo:
SELECT hotel_id, sum(price_pp)
FROM hotel_data
WHERE
date >= Jan1 and date <= Jan4
and spaces >= 2
GROUP BY hotel_id
HAVING count(*) = 4;
risultati
hotel_id | sum
----------------
123 | 400
La HAVING
clausola qui si assicura che ci sia una voce per ogni singolo giorno tra le mie date desiderate che ha gli spazi disponibili. vale a dire. Hotel 456 aveva 1 spazio disponibile su Jan2, la clausola HAVING restituiva 3, quindi non otteniamo un risultato per hotel 456.
Fin qui tutto bene.
Tuttavia, c'è un modo per scoprire tutti i periodi di 4 notti a gennaio dove c'è spazio disponibile? Potremmo ripetere la query 27 volte - incrementando le date ogni volta, il che sembra un po 'imbarazzante. O un altro modo potrebbe essere quello di memorizzare tutte le possibili combinazioni in una tabella di ricerca in questo modo:
Hotel ID | total price pp | num_people | num_nights | start_date
----------------------------------------------------------------
123 | 400 | 2 | 4 | Jan1
123 | 400 | 2 | 4 | Jan2
123 | 400 | 2 | 4 | Jan3
123 | 400 | 3 | 4 | Jan1
123 | 400 | 3 | 4 | Jan2
123 | 400 | 3 | 4 | Jan3
E così via. Dovremmo limitare il numero massimo di notti e il numero massimo di persone che cercheremmo, ad esempio numero massimo di notti = 28, numero massimo di persone = 10 (limitato al numero di spazi disponibili per quel determinato periodo a partire da quella data).
Per un hotel, questo potrebbe darci 28 * 10 * 365 = 102000 risultati all'anno. 5000 hotel = 500 milioni di risultati!
Ma avremmo una domanda molto semplice per trovare il soggiorno di 4 notti più economico a Jan per 2 persone:
SELECT
hotel_id, start_date, price
from hotel_lookup
where num_people=2
and num_nights=4
and start_date >= Jan1
and start_date <= Jan27
order by price
limit 1;
Esiste un modo per eseguire questa query sulla tabella iniziale senza dover generare la tabella di ricerca delle righe da 500 m !? ad esempio, generare i 27 possibili risultati in una tabella temporanea o in qualche altra magia interiore simile?
Al momento tutti i dati sono conservati in un DB Postgres - se necessario per questo scopo, possiamo trasferirli in qualcos'altro più adatto? Non sono sicuro se questo tipo di query si adatta alla mappa / riduce i modelli per i DB di stile NoSQL ...