我最近被问到一个关于假设网络预订系统的面试问题,以及我如何设计数据库模式以最大限度地减少重复并最大限度地提高灵活性。
用例是管理员将输入属性的可用性到系统中。可能有多个时间段设置。例如,2009年4月1日至2009年4月14日以及2009年7月3日至2009年7月21日。
然后,用户只能在相同或更短时间段内提供预订。
您如何将此信息存储在数据库中?
你会使用简单(真正简化)的东西吗?
AVAILABILITY(property_id, start_date, end_date);
BOOKING(property_id, start_date, end_date);
然后,您是否可以轻松构建一个网页,其中显示可用日历,其中已预订的期间已消隐。从这个数据库模式构建报告会很容易吗?是否像看起来那么容易?
答案 0 :(得分:12)
对于可用性和预订,使用单个表可能更容易,粒度为1天:
property_date (property_id, date, status);
列状态将具有(至少)以下2个值:
输入一段可用时间,例如4月1日到14日需要(应用程序)在property_date中插入14行,每行的状态为“Available”。 (对于用户来说,它看起来应该只是一个动作)。
在4月3日至11日期间预订酒店将需要检查每天是否存在“可用”行,并将状态更改为“已预订”。
这个模型可能看起来有点“冗长”,但它有一些优点:
注意如果“可用”是属性的最常见状态,则最好反转逻辑以使状态为“不可用”,并且日期缺少行意味着它可用。 / p>