Trải nghiệm DBA của tôi không đi xa hơn việc lưu trữ đơn giản + truy xuất dữ liệu kiểu CMS - vì vậy đây có thể là một câu hỏi ngớ ngẩn, tôi không biết!
Tôi có một vấn đề trong đó tôi cần tra cứu hoặc tính giá kỳ nghỉ cho một quy mô nhóm nhất định và một số ngày nhất định trong một khoảng thời gian nhất định. Ví dụ:
Một phòng khách sạn cho 2 người trong 4 đêm vào tháng 1 là bao nhiêu?
Tôi có dữ liệu về giá cả và tính khả dụng cho 5000 khách sạn được lưu trữ như vậy:
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
Với bảng này, tôi có thể thực hiện một truy vấn như vậy:
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;
các kết quả
hotel_id | sum
----------------
123 | 400
Điều HAVING
khoản ở đây đảm bảo rằng có một mục nhập cho mỗi ngày giữa các ngày mong muốn của tôi có khoảng trống có sẵn. I E. Khách sạn 456 có 1 chỗ trống vào ngày 2 tháng 1, điều khoản HAVING sẽ trả lại 3, vì vậy chúng tôi không nhận được kết quả cho khách sạn 456.
Càng xa càng tốt.
Tuy nhiên, có cách nào để tìm hiểu tất cả 4 khoảng thời gian đêm vào tháng 1 khi có chỗ trống không? Chúng tôi có thể lặp lại truy vấn 27 lần - tăng ngày mỗi lần, điều này có vẻ hơi khó xử. Hoặc cách khác có thể là lưu trữ tất cả các kết hợp có thể có trong bảng tra cứu như vậy:
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
Và như thế. Chúng tôi phải giới hạn số đêm tối đa và số người tối đa chúng tôi sẽ tìm kiếm - ví dụ: tối đa đêm = 28, tối đa người = 10 (giới hạn số lượng không gian có sẵn cho khoảng thời gian đó bắt đầu từ ngày đó).
Đối với một khách sạn, điều này có thể mang lại cho chúng tôi 28 * 10 * 365 = 102000 kết quả mỗi năm. 5000 khách sạn = 500m kết quả!
Nhưng chúng tôi có một truy vấn rất đơn giản để tìm được 4 đêm rẻ nhất trong tháng 1 cho 2 người:
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;
Có cách nào để thực hiện truy vấn này trên bảng ban đầu mà không phải tạo bảng tra cứu hàng 500m không!? ví dụ: tạo ra 27 kết quả có thể có trong một bảng tạm thời hoặc một số phép thuật truy vấn bên trong khác?
Tại thời điểm này, tất cả dữ liệu được lưu trữ trong DB Postgres - nếu cần cho mục đích này, chúng ta có thể chuyển dữ liệu ra một thứ khác phù hợp hơn không? Không chắc chắn nếu loại truy vấn này phù hợp với các mẫu bản đồ / thu nhỏ cho DB kiểu NoQuery ...