【问题标题】:Database design for sports centers - Manage reservations体育中心的数据库设计 - 管理预订
【发布时间】:2015-05-06 02:11:04
【问题描述】:

我需要设计一个数据库来管理具有多个体育中心的系统中的设施预订。中心有不同的设施,如游泳池、网球场、篮球场等。一个中心可能有多个游泳池或网球场等。他们可以有不同的可用性。例如,“中心 1”中的“游泳池 1”和“游泳池 2”在周一、周三和周五的 9:00 至 10:00 和 12:00 至 13:00 开放。 “游泳池 2”也在周二和周四的 08:00 至 09:00 和 09:00 至 10:00 开放。我还可以添加排除日期(如假期),例如 2015 年 12 月 25 日星期五和 2016 年 1 月 1 日星期五。然后会员可以预订和安装(如果仍然可用)。

现在我有以下表格:

CENTER
Id  |   Name
----|-----------
1   |   Center 1
2   |   Center 2
3   |   Center 3

INSTALLATION TYPE
Id  |   Description
----|----------------
1   |   Swimming
2   |   Tennis
3   |   Basketball

INSTALLATION
Id_center   |   Id_installation |   Name            |   Id_type
------------|-------------------|-------------------|-----------
1           |   1               |   Swimming pool 1 |   1
1           |   2               |   Swimming pool 2 |   1
2           |   1               |   Tennis court 1  |   2

MEMBER
Id_center   |   Id_member   |   Name
------------|---------------|-------------
1           |   1           |   John Doe
2           |   1           |   Sarah Bole

我正在考虑以下几点:

SCHEDULE
Id_center   |   Id_installation |   Day_week    |   Time_begin  |   Time_end
------------|-------------------|---------------|---------------|------------
1           |   1               |   1           |   09:00       |   10:00
1           |   1               |   1           |   12:00       |   13:00
1           |   2               |   1           |   09:00       |   10:00
1           |   2               |   1           |   12:00       |   13:00
1           |   2               |   2           |   08:00       |   09:00
1           |   2               |   2           |   09:00       |   10:00

EXCLUDING DAYS
Id_center   |   Id_installation |   Date
------------|-------------------|-------------
1           |   1               |   06/10/2015
1           |   1               |   12/25/2015
1           |   2               |   12/25/2015

RESERVATION
Id_center   |   Id_installation |   Id_member   |   Date        |   Time_begin  |   Time_end
------------|-------------------|---------------|---------------|---------------|------------
1           |   2               |   2           |   05/28/2015  |   08:00       |   09:00
1           |   2               |   2           |   05/28/2015  |   09:00       |   10:00
1           |   1               |   1           |   05/25/2015  |   09:00       |   10:00

你会添加或修改什么?

谢谢。

【问题讨论】:

    标签: database-design


    【解决方案1】:

    乍一看,您似乎是在一小时内发出预订。如果是这样,请考虑取消 Time_End 列。

    这里有一个想法:

    create table Reservations(
        CenterID...,
        InstallationID...,
        MemberID ...,
        Date ...,
        Time_Begin ...
    );
    

    例如,如果您最多提前 6 个月进行预订,那么您可以在每个可用日期超过该 6 个月阈值时为每个可用日期进行一个条目。它具有日期、该日期可用的最早时间(来自 Schedule 表)和 MemberID 的 nullnull 表示它可用。由于没有其他条目,因此可以全天使用。当会员进行预订时,插入该时间的记录或更新当时的null 记录并插入另一条带有预订结束时间的null 记录——如果该时间还没有另一个预订。

    像这样。每一天都是这样开始的:

    Center Install Member StartTime
    ====== ======= ====== ================
         1       1   null 05/28/2015 08:00
    

    会员 14 从早上 8 点开始预订一小时。

    Center Install Member StartTime
    ====== ======= ====== ================
         1       1     14 05/28/2015 08:00
         1       1   null 05/28/2015 09:00
    

    会员 27 在中午预订一小时:

    Center Install Member StartTime
    ====== ======= ====== ================
         1       1     14 05/28/2015 08:00
         1       1   null 05/28/2015 09:00
         1       1     27 05/28/2015 12:00
         1       1   null 05/28/2015 13:00
    

    这表示会员 1 从 08-09 预订,从 09-12 可用,会员 27 从 12-13 预订,从 13 开始可用。

    当成员 42 想要保留上午 11 点的槽时,只需要插入一个,因为该槽的结束,中午,已经有一条记录。

    Center Install Member StartTime
    ====== ======= ====== ================
         1       1     14 05/28/2015 08:00
         1       1   null 05/28/2015 09:00
         1       1     42 05/28/2015 11:00
         1       1     27 05/28/2015 12:00
         1       1   null 05/28/2015 13:00
    

    可以这样解读:

    select  r.*, r1.StartTime as EndTime
    from    Reservations r
    left join Reservations r1
        on  r1.Center  = r.Center
        and r1.Install = r.Install
        and r1.StartTime =(
            select  Min( StartTime )
            from    Installation
            where   Center  = r.Center
                and Install = r.Install
                and trunc( StartTime ) = trunc( r.StartTime )
                and StartTime > r1.StartTime )
    where   r.Center = :Center
        and r.Install = :Install
        and r.StartTime between :DayOfInterest and :DayOfInterest + 1;
    

    这会显示特定日期的所有条目。其中Member 为空,时间可用。如果EndTime 为空,则该预订或可用性将在预定日期结束时进行。所以只需添加到过滤器中:

        and r.Member is [not] null
    

    仅显示可用性或仅显示预订。

    查询乍一看可能有点吓人,但它遵循读取版本化表的一致模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-07
      • 2013-09-25
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      • 2012-03-06
      相关资源
      最近更新 更多