web-dev-qa-db-ja.com

ホテル予約データベースの設計問題

私は現在(大学のコースの課題として)世界中のホテルをオンライン予約するためのデータベースを設計していますが、問題に遭遇しました。

これが概念設計です。

enter image description here

以下は、これまでのリレーショナルレイアウトの表です。

[〜#〜]ゲスト[〜#〜]
guest_ID varchar PK
メールvarchar
guest_password varchar
first_name varchar
last_name varchar
mobile_num varchar
member_status varchar
pref_language varchar
pref_currency_code varchar

[〜#〜]ホテル[〜#〜]
hotel_ID varchar PK
hotel_name varchar
ratings_avg int
phone_num varchar
メールvarchar
currency_code varchar
street_name varchar
street_num varchar
Zip_code varchar
都市varchar
国varchar

[〜#〜]部屋[〜#〜]
room_ID varchar PK
hotel_ID varchar FK to Hotel
room_name varchar
low_season_rate数値
high_season_rate数値
max_persons int

[〜#〜]ブッキング[〜#〜]
guest_ID varchar FK to Guest
room_ID varchar FK to Room
チェックイン日
チェックアウト日
(PKとして最初の4つの組み合わせ)
persons_num int

[〜#〜]支払い[〜#〜]
guest_ID varchar FK to Guest
room_ID varchar FK to Room
date_paid timestamp
金額

[〜#〜]評価[〜#〜]
guest_ID varchar FK to Guest
hotel_ID varchar FK to Hotel
eval_dateの日付
(PKとしての最初の3つの組み合わせ)
評価整数
guest_comment text

私はこのデザイン思考を次のように思い付きました:ゲストはホテルに属する部屋を予約し、部屋の料金を支払い、必要に応じて滞在後にホテルを評価します。

したがって、私は予約と支払いをゲストと部屋の関係、評価をゲストとホテルの関係と見なしました。

この設計にあると思われる問題は、支払いと評価が予約から完全に切り離されているため、既存の予約が行われていなくても、テーブルがいっぱいになる可能性があることです。

そして私が今見る方法では、ゲストは部屋での滞在(=予約)に対して支払い、ホテルでの滞在(=予約)を評価するので、これらのテーブルは予約テーブルを参照する必要があると考えています。

しかし、予約は関係です。エンティティと別の関係の間に関係を形成できますか?それともエンティティと見なすことができますか?

私はその件についてどんな考えでも歓迎します。

1
Georgy90

私は予約について言及している支払いに何の問題もないと思います。 BOOKINGから始めて、なぜPKのcheck_out部分なのですか?チェックインのために部屋を何回チェックアウトできるかわかりません。与えられた:

CREATE TABLE BOOKING
( guest_ID varchar NOT NULL --  FK to Guest
, room_ID varchar NOT NULL -- FK to Room
, check_in date NOT NULL
,   PRIMARY KEY (guest_ID, room_ID, check_in)
, ... );

PAYMENTの場合、関連する予約を識別する必要があるため、check_inを含めることは理にかなっています。

CREATE TABLE PAYMENT
( guest_ID varchar NOT NULL
, room_ID varchar NOT NULL
, check_in date NOT NULL
,     FOREIGN KEY (guest_ID, room_ID, check_in) REFERENCES BOOKING (...)
, date_paid timestamp NOT NULL
--    , amount numeric NOT NULL 
);

私は故意にP.K.を省略しました。 PAYMENTの場合、全額支払いが必要な場合、最初の3列で十分ですが、部分的な支払いが可能な場合は、date_paidを含めることができます。

その他の考慮事項、予約の合意価格はいくらですか?部屋の価格は、季節、キャンペーンなどによって異なる場合があります。価格が何らかの形で予約に属していると想定した場合、支払額は、部分的な支払いの場合にのみ必要です。それ以外の場合は、料金が支払われるかどうか

評価のために、部屋の代わりにホテルを含める理由はありますか?部屋からホテルを推定することができます。これにより、支払いと同様に、評価を予約に関連付けることも可能になります。

1
Lennart