4

現在、ホテル予約サイトに似たモデルのアプリケーションを構築しています。

空室検索の対応方法を検討中。

私のモデルは次のようになります。

Hotel
_id
名前
説明
star_rating
住所
lat
lon

次に、次のような可用性コレクションを用意することを考えました。

空室状況
hotel_id (空室状況が独自のコレクションの場合)
date
room_type
room_max_occupancy
price

date は部屋が利用可能だった 1 日を保存します
room_type は「ツイン」「ダブル」のようなものになります<br> room_max_occupancy は 2、3 などになります...

クエリの例:
6 月 1 日から 8 日までの 2 人用の部屋。

「検索結果」については、hotel.name、hotel.description、hotel.star_rating を返す必要があります。

上記のタイプのクエリでこのデータを保存する最も効率的な方法を探していますか?

空室状況コレクションは、それ自体のコレクションにする必要がありますか、それともホテルのサブドキュメントにする必要がありますか?

それが独自のコレクションである場合、検索をより効率的にするために、lat lon を (hotel_id とともに) 空室状況に追加する必要がありますか?

4

1 に答える 1

10

クエリから始めて、逆方向に作業してみましょう。ご希望ののは、さまざまな日付で利用可能な部屋のリストです。将来の日付のために「予約されていない」として部屋を保存することは不可能であるため、予約情報のコレクションがあります。クエリは次のようになります。

db.booking.find({date: {$gte: from_date, $lt: to_date}});

これにより、部屋IDのリストが表示される可能性があります。

コレクション:booking フィールド:room_id, date

次のクエリは、制約に適合するルームIDのリストを取得するクエリです。何かのようなもの:

db.rooms.find({room_type: "Double", room_max_occupancy: 2});

部屋が予約された日付を除いて、私たちは空室状況を取得することができます。ホテルあたりの平均部屋数が多い場合、ホテル情報を複製するために使用するスペースの価値はありません。代わりに、各部屋にホテルIDを設定する必要があります。次に、重複するクエリを回避するために、ホテルの一意のリストを集約する必要があります

コレクション:roomsフィールド:room_type, room_max_occupancy, price, hotel_id

最後のクエリは、ホテルに関する情報を取得するためのものです。

db.hotels.find({id: <ID>}, {'name': 1, 'description': 1, 'star_rating': 1});

コレクション:hotelsフィールド:name, description, star_rating, address, lat, lon

空室情報に直接アクセスする必要がある場合は、予約を許可する期限(たとえば、6か月後)を決定する必要があります。毎日、スクリプトを実行して、新しい日の(空白の)可用性情報をデータベースに追加する必要があります。予約コレクションは次のように変更できます。

コレクション:bookingフィールド:(room_id, date, is_available, hotel_id予約プロセスの詳細を保持するフィールドとともに)

これで、クエリに追加の制約が追加されます。

db.booking.find({is_available: true, date: {$gte: from_date, $lt: to_date}});

部屋IDとホテルID(追加のクエリをスキップするための冗長性)にアクセスでき、そこからホテルの表示の詳細を取得できます。

于 2012-06-10T18:06:31.613 に答える