数据库 table 在每天的时间范围内为 'availability' 设计
Database table design for 'availability' within time ranges per day
我正在安排会议 web-app,其中一个人可以在一天中的特定时间范围内分享他们的可用性。
例如一天内有 3 time-ranges 个用户可用,从 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
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 值将使实施(主要围绕可用性检查)保持简单。
可用性 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
我正在安排会议 web-app,其中一个人可以在一天中的特定时间范围内分享他们的可用性。
例如一天内有 3 time-ranges 个用户可用,从 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
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 值将使实施(主要围绕可用性检查)保持简单。
可用性 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