酒店预订的数据库设计问题
Problem with database design for Hotel Booking
我目前正在设计(作为大学课程的作业)一个用于在线预订全球酒店的数据库,但我遇到了一个问题。
在描述它之前,这里是关系模型的table:
来宾
guest_ID varchar PK
电子邮件 varchar
guest_password varchar
first_name varchar
last_name varchar
mobile_num 变量
member_status varchar
pref_language varchar
pref_currency_code varchar
酒店
hotel_ID varchar PK
hotel_name varchar
ratings_avg 整数
phone_num varchar
电子邮件 varchar
currency_code varchar
street_name varchar
street_num 变量
zip_code varchar
城市 varchar
国家 varchar
房间
room_ID varchar PK
hotel_ID varchar FK 到酒店
room_name varchar
low_season_rate 数字
high_season_rate 数字
max_persons 整数
预订
guest_ID varchar FK 给客人
room_ID varchar FK 到房间
check_in日期
check_out日期
(组合前4为PK)
persons_num 整数
付款
guest_ID varchar FK 给客人
room_ID varchar FK 到房间
date_paid时间戳
数量数字
评估
guest_ID varchar FK 给客人
hotel_ID varchar FK 到酒店
eval_date日期
(组合前3为PK)
评分整数
guest_comment文字
我想出了这样的设计思路:
客人会预订属于酒店的房间,支付房间费用,然后,如果他们愿意,在入住后对酒店进行评价。
所以我认为预订和付款是客人和房间之间的关系,评价是客人和酒店之间的关系。
此设计似乎存在的问题是付款和评估与预订完全分离,因此即使没有预先存在的预订,它们的 table 也可以填充。
而我现在看到的方式是,客人为房间的住宿(=预订)付款并评估酒店的住宿(=预订),所以我认为这些 table 应该指的是预订table.
但是预订是一种关系,我可以在一个实体和另一个关系之间形成一个关系吗?还是我缺少其他解决方案?
我欢迎任何关于这个主题的想法。
首先,您的付款和评价并非来自 Booking "cut off"。您可以建立不止一个连接的关系。其次,请记住在数据库之上有一个应用程序会强制执行一些逻辑,例如没有客人就不能预订,没有预订就不能接待客人。
如果由于某种原因您的要求要求您使用键、约束和触发器严格执行数据库中的所有内容,您将需要对您的模式进行一些处理。我有以下几点建议:
我喜欢 table 上的身份键,这样数据库就不必强制执行组合键关系,我在应用程序层这样做(它让我更自由地对模式进行意外更改稍后再申请)。
您可能希望将房价从 ROOM table 中扣除。如果更新,它们将不再适用于同一酒店和房间的先前预订。
付款和评价只需要和一个BOOKING有直接关系即可。如果没有实际入住,您将无法拥有任何一个。
imo 一个唯一的预订是日期范围内的酒店和房间,所以预订应该有一个 fk 到酒店和房间。
您如何处理与 BOOKING 相关的 GUEST 有点棘手。 GUESTs 能够有多个 BOOKING 是预期的 (imo),所以你可以在 BOOKING 上给 GUEST 一个 fk,这样 BOOKING 现在对于 HOTEL、ROOM、GUEST 和日期范围是唯一的。
但是,如果一个 BOOKING 可以有超过 1 个 GUEST,则您需要进行关系查找。仅 GUESTid 和 BOOKINGid,因此您可以拥有一个 many::many 并且仍将 GUEST 关联到 BOOKING
只要您可以通过联接在所有 table 之间建立关系连接,它们就不需要全部与其他所有直接相关。
我目前正在设计(作为大学课程的作业)一个用于在线预订全球酒店的数据库,但我遇到了一个问题。
在描述它之前,这里是关系模型的table:
来宾
guest_ID varchar PK
电子邮件 varchar
guest_password varchar
first_name varchar
last_name varchar
mobile_num 变量
member_status varchar
pref_language varchar
pref_currency_code varchar
酒店
hotel_ID varchar PK
hotel_name varchar
ratings_avg 整数
phone_num varchar
电子邮件 varchar
currency_code varchar
street_name varchar
street_num 变量
zip_code varchar
城市 varchar
国家 varchar
房间
room_ID varchar PK
hotel_ID varchar FK 到酒店
room_name varchar
low_season_rate 数字
high_season_rate 数字
max_persons 整数
预订
guest_ID varchar FK 给客人
room_ID varchar FK 到房间
check_in日期
check_out日期
(组合前4为PK)
persons_num 整数
付款
guest_ID varchar FK 给客人
room_ID varchar FK 到房间
date_paid时间戳
数量数字
评估
guest_ID varchar FK 给客人
hotel_ID varchar FK 到酒店
eval_date日期
(组合前3为PK)
评分整数
guest_comment文字
我想出了这样的设计思路: 客人会预订属于酒店的房间,支付房间费用,然后,如果他们愿意,在入住后对酒店进行评价。
所以我认为预订和付款是客人和房间之间的关系,评价是客人和酒店之间的关系。
此设计似乎存在的问题是付款和评估与预订完全分离,因此即使没有预先存在的预订,它们的 table 也可以填充。 而我现在看到的方式是,客人为房间的住宿(=预订)付款并评估酒店的住宿(=预订),所以我认为这些 table 应该指的是预订table.
但是预订是一种关系,我可以在一个实体和另一个关系之间形成一个关系吗?还是我缺少其他解决方案?
我欢迎任何关于这个主题的想法。
首先,您的付款和评价并非来自 Booking "cut off"。您可以建立不止一个连接的关系。其次,请记住在数据库之上有一个应用程序会强制执行一些逻辑,例如没有客人就不能预订,没有预订就不能接待客人。
如果由于某种原因您的要求要求您使用键、约束和触发器严格执行数据库中的所有内容,您将需要对您的模式进行一些处理。我有以下几点建议:
我喜欢 table 上的身份键,这样数据库就不必强制执行组合键关系,我在应用程序层这样做(它让我更自由地对模式进行意外更改稍后再申请)。
您可能希望将房价从 ROOM table 中扣除。如果更新,它们将不再适用于同一酒店和房间的先前预订。
付款和评价只需要和一个BOOKING有直接关系即可。如果没有实际入住,您将无法拥有任何一个。
imo 一个唯一的预订是日期范围内的酒店和房间,所以预订应该有一个 fk 到酒店和房间。
您如何处理与 BOOKING 相关的 GUEST 有点棘手。 GUESTs 能够有多个 BOOKING 是预期的 (imo),所以你可以在 BOOKING 上给 GUEST 一个 fk,这样 BOOKING 现在对于 HOTEL、ROOM、GUEST 和日期范围是唯一的。
但是,如果一个 BOOKING 可以有超过 1 个 GUEST,则您需要进行关系查找。仅 GUESTid 和 BOOKINGid,因此您可以拥有一个 many::many 并且仍将 GUEST 关联到 BOOKING
只要您可以通过联接在所有 table 之间建立关系连接,它们就不需要全部与其他所有直接相关。