sql—在每天的时间范围内为“可用性”设计数据库表

oug3syen  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(271)

请容忍我,我是个数据库初学者。我正在开发一个会议安排web应用程序,在这个应用程序中,一个人可以共享一天中特定时间段的可用性。
e、 g.一个用户在一天内有3个时间范围,从 09:10 to 10:00 , 13:00 to 14:00 以及 16: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
编辑#1:提供一些数据

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'
py49o6xq

py49o6xq1#

对于您的用例,使用范围类型无疑是一个很好的解决方案。但是,您可以考虑以epoch格式(主要是bigint数据类型)存储时间戳(range\u start和range\u end)。postgresql提供了将epoch转换为可读时间戳的方法,反之亦然。
epoch值将使实现(主要围绕可用性检查)保持简单。
https://www.epochconverter.com/

rmbxnbpk

rmbxnbpk2#

可用性表的定义如下:
可用性(Map表):
用户ID
日id
时间范围\开始类型 TIME with time zone 时间范围\停止类型 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

我觉得一个星期不够,所以你应该把完整的日期留着。您需要标记某人已分配到会议,以便从可用性中删除该行或添加状态字段。祝你好运!

jtoj6r0c

jtoj6r0c3#

我建议你首先有一个时间范围表,它将时间范围保持在5分钟的间隔,如下所示。不应将时间范围保留为文本字段。把它们放在箱子里 time 数据类型。
计时器

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

每个间隔表示都应该使用这个时间主表。这样,您就可以轻松地进行所有时间的计算。

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

相关问题