1

約 150 のホテルを扱う旅行代理店向けに、php と mysql を使用してホテル料金、割り当て、予約を管理するシステムを開発しました。ホテルの客室料金は日付によって異なりますので、テーブルのデザインはおおよそ次のとおりです。

hotel_tbl{
 hotel_id,
 hotel_name
}    

room_type_tbl{
 room_type_id,
 room_type_name,
 hotel_id 
}


room_rates_tbl{
  room_type_id,
  **from_date,
  **till_date,
  meal_basis,//(Breakfast,halfboard,fullboard) BB,HB,FB
  sleeps,//(Single,Double,Triple) SGL,DBL,TPL
  currency,
  room_rate
}

ホテルの料金は日付によって変動するため、複雑なツアー パッケージの計算 (複数のホテルを含む) のテーブルをクエリすると、パフォーマンスが予想よりも遅いことに気付きました。私の質問は、以下のような日付範囲 (私のシステムには約 150 のホテルが含まれています) を使用する代わりに、各日付のレート行を使用すると、パフォーマンスが向上すると思いますか?

room_rates_tbl { // A row for each day as opposed to using a date range
  room_type_id,
  **date,
  meal_basis,//(Breakfast,halfboard,fullboard) BB,HB,FB
  sleeps,//(Single,Double,Triple) SGL,DBL,TPL
  currency,
  room_rate}

質問が十分に明確であることを願っています...

より明確にするために質問を更新しました。部屋のタイプは、たとえば「スタンダード ルーム」、「デラックス ルーム」、または「ファミリー ルーム」です。睡眠には、シングル、ダブルなどのいずれかが含まれます。マーケット グループ向けであったため、関連性がないため、質問から market_type を削除しました。 (国など) 料金の対象です。私の質問は、料金テーブルのクエリに関しては、日付範囲を使用するよりも日付の料金を保存する方が効率的であるということでした。

4

2 に答える 2

1

クエリが、特定の 2 つの日付の間のすべてのホテルの特定のタイプの部屋に関するものであるとします。データベースから何を取得する必要がありますか? 私は提案します:

  1. 開始日のすべてのホテルのそのタイプの部屋の料金
  2. 終了日のすべてのホテルのそのタイプの部屋のレート

ユーザーへの応答が遅くなるため、テーブル スキャンは避けたいと考えています。そのため、ルックアップではインデックスを使用する必要があります。クエリは日付に基づいているため、日付フィールドにインデックスを付ける必要があります。したがって、ユーザーが 31/12/12 から 05/01/13 までの部屋を希望する場合、http: //dev.mysql.com/doc/refman/5.1/en/range で説明されているように、インデックスに対して範囲演算子を使用できます。 -optimization.html#range-access-single-part)。(日付値をタイムスタンプ値として保存すると、値のストレージ サイズが減るため、インデックスのパフォーマンスが向上します。) 元のテーブル スキーマを使用する場合は、開始日に 1 つ、合計 2 つのインデックスが必要になります。および終了日に1つ-ただし、提案する修正されたテーブルと比較して、テーブル内の行が少なくなります。これには、1つのインデックスが必要ですが、より多くのテーブル行(毎日1つなど)が必要です。

于 2012-05-16T09:24:11.483 に答える
0

日付と料金を別の表に分けた方がいいと思います。

room_tbl - room_id、 room_type_id 、 market_type_id 、その他の部屋情報

room_rate_tbl - room_id、from_date、til_date、currency、room_rate

このように、部屋の情報は独立しており、特定の room_id に対して部屋料金を簡単に追加、編集、削除できます。

于 2012-05-16T07:57:35.593 に答える