日程类JSON请求的数据库表设计方案咨询
1、针对该JSON请求可设计的数据库表数量
建议设计4张数据库表,完全覆盖JSON所有字段且满足数据库范式要求,各表对应存储内容如下:
event_basic(事件基础主表):存储JSON第一层的通用公共字段,包括standard、section、subject、type、startTime、allDayEvent、startTimezone、endTimezone、endTime,新增主键event_id作为所有关联表的外键关联依据event_recurrence_rule(重复规则表):存储repeat对象下除周重复多值字段外的所有规则字段,包括frequency、interval,以及月度、年度重复的专属字段:monthlydayOfMonth、monthlyIndex、monthlydayOfWeek、month、yearlydayOfMonth、yearlyIndex、yearlydayOfWeek,通过event_id关联主表event_recurrence_end(重复终止规则表):存储until对象下的所有字段,包括neverFlag、occurrence、endDate,通过event_id关联主表event_weekly_weekday(周重复星期映射表):专门存储多值的weeklydaysOfWeek字段,通过event_id关联主表
2、多值weeklydaysOfWeek字段的单独存储方案
weeklydaysOfWeek是典型的一对多关联字段,单个事件会对应多个星期值,所以单独用event_weekly_weekday映射表存储,设计逻辑如下:
- 表仅保留两个核心字段:关联主表的外键
event_id,以及存储单个星期值的weekday_value(比如用数字1-7对应周一到周日) - 用
event_id + weekday_value作为联合主键,避免同一个事件重复存储相同的星期值
举个实际场景例子:如果某个周重复事件需要每周一、周三、周五触发,那么该表会生成3条同event_id的记录,weekday_value分别为1、3、5。
3、基于until对象endDate字段返回内容的实现方案
分存储和查询返回两个环节实现:
存储环节
将endDate以DATETIME类型存入event_recurrence_end表的对应字段,没有传值时存NULL即可,每条endDate记录和对应事件的event_id绑定关联。
查询返回环节
- 过滤查询时如果需要按时间范围筛选事件,可直接加条件:
event_recurrence_end.endDate BETWEEN 【查询起始时间】 AND 【查询结束时间】,如果是neverFlag为true的永久重复事件,可根据业务需求决定是否返回全量符合规则的记录 - 接口组装返回值时,直接从
event_recurrence_end表取出对应event_id的endDate值,拼装到until对象的对应属性中返回即可
内容的提问来源于stack exchange,提问作者Teja sree
相关产品推荐
相关产品推荐

