数据库 table 在每天的时间范围内为 'availability' 设计

Database table design for 'availability' within time ranges per day

我正在安排会议 web-app,其中一个人可以在一天中的特定时间范围内分享他们的可用性。

例如一天内有 3 time-ranges 个用户可用,从 09:10 to 10:0013:00 to 14:0016:30 to 17:15

每周可以进行 6 天,从周一到周六。

我想到了什么:

Users:
- uuid
- sername

Days:
- pk
- name (eg. Monday)
- slug

Availability (mapping table):
- user_uuid
- day_id
- timerange

Schedule:
- pk
- schedule_id
- day_id
- user_id
- meeting_id
- time_from
- time_to
- status

但我不知道如何在时间范围之间查询并获取当时可用的所有用户,如果我搜索 16:30 to 16:50 可用的用户,我不太确定如何这样做。

我正在使用 PostgreSQL

Availability:

user_uuid   |   day_id   |  timerange
-------------------------------------------
b1b14b30    |   3        |  '09:15 - 10:00'
a7f611ea    |   1        |  '13:05 - 14:05'
a7f611ea    |   1        |  '16:30 - 16:45'
Scheduled meeting (2 users having a meeting):

schedule_id   |   user_uuid   |   day_id   |  timerange
-------------------------------------------------------------
1             |   b1b14b30    |   3        |  '09:15 - 10:00'
2             |   a7f611ea    |   1        |  '09:15 - 10:00'

使用范围类型当然是适合您的用例的解决方案。但是,您可以考虑以纪元格式(主要是 bigInt 数据类型)存储时间戳(range_start 和 range_end)。 PostgreSQL 提供了将纪元转换为可读时间戳的方法,反之亦然。

Epoch 值将使实施(主要围绕可用性检查)保持简单。

https://www.epochconverter.com/

可用性 table 应该这样定义:

可用性(映射table):

  • user_uuid
  • day_id
  • timerange_start 输入 TIME with time zone
  • timerange_stop 输入 TIME with time zone

然后找到当天可用的所有用户是 运行

select * from Availability where day_id = YOUR_DAY_ID and 
timerange_start < YOUR_TIME_START and 
timerange_stop > YOUR_TIME_STOP 

我觉得一周不够,所以你应该保存完整的日期。您需要标记某人已分配给会议,以便从 Availability 中删除该行或添加状态字段。祝你好运!

我建议您首先设置一个时间范围 table,它将时间范围保持在 5 分钟的间隔内,如下所示。您不应将 time_range 保留为文本字段。将它们保留在 time 数据类型中。

时间大师

+----------------+------------+
| TimeIntervalId | Timevalue  |
+----------------+------------+
|              1 |    00:00   |
|              2 |    00:05   |
|              . | .          |
|              . | .          |
|            288 |  23:55     |
+----------------+------------+

每个区间表示都要利用这个时间主table。这样一来,你就可以轻松的进行所有时间的计算了。

Users:
- uuid
- sername

Days:
- pk
- name (eg. Monday)
- slug

Availability (mapping table):
- AvailabilityId, PK
- user_uuid
- day_id
- Start_timeIntervalId
- End_timeIntervalId

Schedule:
- schedule_id, Pk
- day_id
- user_id
- meeting_id
- meetingstart_timeIntervalId
- meetingend_timeIntervalId
- status