我目前正在设计(作为大学课程的一项任务)一个用于在线预订全球酒店的数据库,但我偶然发现了一个问题。
在描述它之前,这里是到目前为止的关系模型表:
来宾
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
rating_avg int
phone_num varchar
电子邮件varchar
currency_code varchar
street_name varchar
street_num varchar
邮政编码varchar
城市varchar
国家varchar
房间
room_ID varchar PK
hotel_ID varchar FK到酒店
room_name varchar
low_season_rate数值
high_season_rate数值
max_persons int
预订
guest_ID varchar FK到Guest
room_ID varchar FK到Room
入住日期
结帐日期
(前四个组合为PK)
person_num int
付款
guest_ID varchar FK到Guest
room_ID varchar FK到Room
date_paid时间戳
数字量
评估
guest_ID varchar FK到Guest
hotel_ID varchar FK到酒店
eval_date日期
(前三个组合为PK)
评级int
guest_comment文字
我想到了以下设计思路: 来宾将预订属于酒店的房间,并为这些房间付费,然后,如果他们想在住宿后评估酒店。
因此,我认为预订和付款是客人与房间之间的关系,而评估则是客人和酒店之间的关系。
此设计似乎存在的问题是,付款和评估已完全从预订中断开,因此即使没有预先存在的预订也可以填满他们的桌子。 按照我现在的观察方式,客人在一个房间中支付住宿(=预订)并评估在一个酒店中的住宿(=预订),所以我认为这些表应该参考预订表。
但是预订是一个关系,我可以在一个实体和另一个关系之间形成一个关系吗?还是我缺少其他解决方案?
我欢迎对这个问题有任何想法。
答案 0 :(得分:1)
首先,您的付款和评估未从预订中“切断”。您可以跨多个连接建立关系。其次,请记住,在数据库顶部有一个应用程序,该应用程序将强制执行一些逻辑,例如不请客人不进行预订和不请客人不进行预订。
如果出于某种原因您的要求要求您严格使用键,约束和触发器来强制执行数据库中的所有内容,则需要对模式进行一些操作。我对此有一些建议:
我喜欢表上的标识键,这样数据库就不必强制执行组合键关系,我在应用程序层中进行了此操作(它为我提供了更大的自由,以便以后可以对模式和应用程序进行意外更改)。 / p>
您可能要从ROOM表中取出费率。如果已更新,则它们不再适用于同一酒店和房间的以前的预订。
付款和评估只需要与预订直接相关。您不能在没有实际停留的情况下居住。
由于唯一的预订是日期范围内的酒店和客房,因此预订应该对酒店和客房有一个fk。
您如何处理与预订有关的访客有些棘手。来宾应该可以预订多个预订(imo),因此您可以对来宾进行预订,这样预订就可以成为酒店,客房,来宾和日期范围的唯一功能。
但是,如果预订可以包含1位以上的访客,则需要进行相关查找。只是GUESTid和BOOKINGid,所以您可以有很多:::很多,并且仍将GUESTs与BOOKINGs建立联系
只要您可以使用联接在所有表之间建立关系连接,它们就不必与所有其他表直接相关。