如何在数据库中存储每周时间可用性?

时间:2013-02-19 00:16:31

标签: c# asp.net sql-server-2008

我正在为医生办公室编制预约系统。我需要每周存储医生。这样的事情: -

        DoctorID | 10AM | 11AM |     12AM  | 1PM | 2PM |    3PM    | 4PM | 
        ------------------------------------------------------------------
 [MON]  5477J    |  1   |  0   | AppointID |   1 |   1 | AppointID | 0   |
        ------------------------------------------------------------------
 [TUE]  5477J    |  0   |  1   | AppointID |   1 |   1 | AppointID | 0   | 
        ------------------------------------------------------------------

我将时区存储为numeric 1 implies **avaialble** 0 implies **will not be in office**,如果预约了预约,则时间段将被AppointmentID替换。

每天的可用性会有所不同。我的问题是如何存储每天的可用性?我应该每周安排5行。有人能指出一些简单的架构,或者有更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:3)

我过去使用的一个模型是这样的:

TABLE [AppointmentBlock]
  - [DoctorID] INT
  - [StartTime] DATETIME
  - [EndTime] DATETIME
  - [IsAvailable] BIT
  - [IsRecurring] BIT
  - [AppointmentID] INT

如果[IsRecurring] = 1,这将表示每周在同一时间重复出现的块,您应该假设开始/结束时间是从一周开始计算的偏移量。

如果[IsRecurring] = 0,这只是一次性发生,开始/结束时间是绝对的。

因此,医生日程表中的每个区块都会被计算在内,即使它不是每小时都没有。需要在此基础上分层一些严格的业务逻辑,以确保不会创建重叠(除非出于某种原因,您希望允许这样做)。

为了使您的示例适合此模型,您将拥有以下内容:

DoctorID | Start    | End      | IsAvailable | IsRecurring | AppointmentId | 
----------------------------------------------------------------------------
5477J    | 10AM Mon | 11AM Mon |           1 |           1 |          NULL |
5477J    | 11AM Mon | 12PM Mon |           0 |           1 |          NULL |
5477J    | 12PM Mon |  1PM Mon |           0 |           1 |     AppointID |
5477J    |  1PM Mon |  3PM Mon |           1 |           1 |          NULL |
5477J    |  3PM Mon |  4PM Mon |           0 |           1 |     AppointID |
5477J    |  4PM Mon |  5PM Mon |           0 |           1 |          NULL |
5477J    | 10AM Tue | 11AM Tue |           0 |           1 |          NULL |
5477J    | 11AM Tue | 12PM Tue |           1 |           1 |          NULL |
5477J    | 12PM Tue |  1PM Tue |           0 |           1 |     AppointID |
5477J    |  1PM Tue |  3PM Tue |           1 |           1 |          NULL |
5477J    |  3PM Tue |  4PM Tue |           0 |           1 |     AppointID |
5477J    |  4PM Tue |  5PM Tue |           0 |           1 |          NULL |