9

最近有人问我一个关于假设的基于 Web 的预订系统的面试问题,以及我将如何设计数据库模式以最大限度地减少重复并最大限度地提高灵活性。

用例是管理员将属性的可用性输入系统。可以设置多个时间段。例如,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);

然后,您能否轻松地构建一个网页,显示一个可用日历,其中包含已预订的时段。从这个数据库模式构建报告会很容易吗?是否像看起来那么容易?

4

1 回答 1

14

对于可用性和预订,使用单个表可能更容易,粒度为 1 天:

property_date (property_id, date, status);

列状态将(至少)具有以下两个值:

  • 可用的
  • 已预订

输入可用时间段,例如 4 月 1 日至 14 日,将需要(应用程序)在 property_date 中插入 14 行,每行的状态为“可用”。(对用户来说,它应该是一个单一的动作)。

在 4 月 3 日至 11 日期间预订该物业需要检查每天是否存在“可用”行,并将状态更改为“已预订”。

这个模型可能看起来有点“冗长”,但它有一些优点:

  1. 检查任何日期的可用性很容易
  2. 添加预订会自动更新可用性,没有单独的可用性表来保持同步。
  3. 在网页中显示可用性将非常简单
  4. 添加新状态以记录不同类型的不可用性很容易 - 例如,为维护而关闭。

NB 如果“可用”是属性的最常见状态,最好颠倒逻辑,以便出现“不可用”状态,并且日期没有行意味着它可用。

于 2008-12-11T14:38:06.747 回答