2011-12-03 17 views
0

予約予約システムを構築中です。三つのモジュール予約データベーステーブル

  1. お客様
  2. 部屋
  3. 予約

顧客は、1つのまたは多くの部屋を予約し、様々な日付のことができますがあります。部屋を予約しながら、私は部屋が日付Aと日付B.

テーブル(可能性の高いソリューション) 顧客の間で計上されるために利用可能であるために検索したい(ID、名前、.....) 部屋(ID、roomNo、roomType、....) 予約(ID、room_id、fromDateから、toDateまで)

は現在、私はこの

CREATE TABLE IF NOT EXISTS `bookings` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `checkin` datetime NOT NULL, 
    `checkout` datetime NOT NULL, 
    `advance` int(11) NOT NULL, 
    `amount` int(11) NOT NULL, 
    `booking_details_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 


CREATE TABLE IF NOT EXISTS `bookings_rooms` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `booking_id` int(11) NOT NULL, 
    `room_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 


CREATE TABLE IF NOT EXISTS `customers` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `age` int(11) NOT NULL, 
    `address` varchar(255) NOT NULL, 
    `nationality_id` int(11) NOT NULL, 
    `mobile` int(20) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `rooms` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `number` int(4) NOT NULL, 
    `category_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

のようなテーブルがあるデータベースを設計するために助けが必要とこれはより良いアプローチです。

+1

ここに質問がありますか? –

+0

@Bobごめんなさい。私はテーブルを設計するのに助けが必要です –

答えて

4

これらのスキーマを使用すると、簡単に空室のリストを取得することができるように、あなたは少し異なった方法でそれを設計することができ(この構造から自由に部屋のリストを取得することができますが、パフォーマンスは壮観ではありません)構造はすでに2つの日付の間に無料の部屋を見つけることができます。

以下のクエリは、開始時間前に予約された部屋が開始時間より前に空いているかどうかをチェックします。また、予約された部屋については、チェックインしているかどうかを終了日以降にチェックします。

select * 
from rooms r 
where id not in (
     select room_id 
     from bookings_rooms br 
      join bookings b on (br.booking_id=b.id) 
     where (checkin < :dateA and checkout > :dateA) 
      or (checkin > :dateA and checkin < :dateB) 
    ) 
1
  1. 外部キーの名前に混乱があります - booking_idは、論理的には、各テーブルの重複キーを持っている

  2. bookings_idする必要があります - 彼らは、IDの役割を果たしているとして、あなたはすべてのbooking_details_idなどを削除することができますが

  3. のお客様は、いかなる方法

  4. あなたが部屋を実装する方法で参照されていない - それは大丈夫ですが、すべてはあなたが彼らと何をするかに依存します。おそらく

+0

booking_id命名規則はCakePHPフレームワークのbcosです。私が言及した最初のテーブルセットについて、あなたは何をしていますか? –

+1

まず、同じテーブルにidとbooking_idを持つ目的は何ですか?他のIDの情報は重複しています!それ以外にも、予約テーブルで何とか顧客を参照する必要があります。それ以外に、部屋のテーブルを設計する別の方法があります。それはあなたが部屋としたい典型的な操作に依存します。たとえば、日付とすべての部屋を持つテーブルを持つことができます。予約されているかどうかなどなどは、部屋と何をする必要があるかによって異なります。 –

+0

予約テーブルからのレコードが期限切れになって削除される場合は、その構造が最適です。 100,000人の顧客と1000個の部屋でさえ、そのデータベースは100 Mbの使用済みスペースを超えません。パフォーマンスはそれ以上のデータでも素晴らしいでしょう。 –