私のDBAの経験は、単純なストレージ+ CMSスタイルのデータの取得よりもはるかに進んでいないため、これはばかげた質問かもしれませんが、わかりません!
特定のグループサイズと特定の期間内の特定の日数の休日価格を検索または計算する必要があるという問題があります。例えば:
1月のいつでも2人で4泊できるホテルの部屋はいくらですか。
たとえば、5000のホテルの料金と空き状況のデータは次のように保存されています。
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
このテーブルを使用すると、次のようなクエリを実行できます。
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;
結果
hotel_id | sum
----------------
123 | 400
HAVING
ここの条項により、希望する日付の間に毎日のエントリがあり、利用可能なスペースがあります。すなわち。ホテル456にはJan2に1つのスペースがあり、HAVING句は3を返すため、ホテル456の結果は得られません。
ここまでは順調ですね。
しかし、利用できるスペースがある1月の4泊すべてを調べる方法はありますか?クエリを27回繰り返すことができます-毎回日付をインクリメントしますが、これは少し厄介に思えます。または、別の方法として、考えられるすべての組み合わせをルックアップテーブルに格納することもできます。
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
等々。最大宿泊日数と検索する最大人数を制限する必要があります。たとえば、最大宿泊日数= 28、最大人数= 10(その日から始まるその設定された期間に利用可能なスペースの数に制限されます)。
1つのホテルの場合、これにより年間28 * 10 * 365 = 102000の結果が得られます。5000ホテル= 5億成果!
しかし、2人で1月に最も安い4泊を見つけるための非常に単純なクエリがあります。
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;
500mの行ルックアップテーブルを生成せずに、このクエリを初期テーブルで実行する方法はありますか?たとえば、27の可能な結果を一時テーブルまたはその他の内部クエリマジックで生成しますか?
現在、すべてのデータはPostgres DBに保持されています。この目的のために必要な場合、データを他のより適切なものに移動できますか?このタイプのクエリがNoSQLスタイルのDBのmap / reduceパターンに適合するかどうかは不明です...