You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在数据库中存储用户日程?预约系统数据模型优化问询

优化预约系统的数据库设计方案

嘿,这个问题我做类似预约系统时也碰到过,你的初始思路其实能跑通,但确实可以通过调整存储逻辑来大幅减少冗余,我给你几个更简洁的实现方向:

方案一:用「范围+规则」存储可用块,动态计算时段

不用把每个20分钟的slot拆成单独记录,而是在available表中直接存储用户设置的整小时可用块范围,字段可以设计成:

  • user_id(关联用户的外键)
  • start_datetime(可用块的起始时间,比如2024-05-20 09:00:00)
  • end_datetime(可用块的结束时间,比如2024-05-20 12:00:00)
  • slot_duration(固定为20分钟,也可以做成常量写死在代码里)

预约时,reservation表只存储具体被预约的时段:

  • user_id(被预约者ID)
  • booker_id(预约者ID)
  • slot_start(该20分钟时段的起始时间,比如2024-05-20 09:20:00)

核心逻辑

查询可用时段时,先从available表中取出用户的所有可用范围,然后通过代码或SQL生成该范围内所有20分钟的slot,再排除reservation表中已被预约的slot即可。

这个方案的好处是:

  • 存储量直接减少2/3,用户设置N小时的可用块,只存1条记录而非3N条
  • 扩展性强,如果以后需要调整slot时长(比如改成30分钟),不用修改历史数据,只需要调整生成逻辑

方案二:贴合「整小时块」需求的精简存储

既然你明确提到用户是设置不同日期的整小时可用块,可以针对性设计表结构:

available表字段:

  • user_id(外键)
  • available_date(可用的日期,比如2024-05-20)
  • available_hour(可用的小时数,比如9代表当天9:00-10:00)

reservation表字段:

  • user_id(被预约者ID)
  • booker_id(预约者ID)
  • reserve_date(预约日期)
  • reserve_hour(预约的小时段)
  • slot_index(0/1/2,分别对应该小时内的第1/2/3个20分钟时段)

核心逻辑

比如用户设置5月20日9点到11点可用,available表只需插入2条记录(日期2024-05-20,小时9和10)。查询可用时段时,先查available中用户的可用日期和小时,再对应检查reservation中该日期小时下的slot_index哪些已被占用,剩下的就是可预约的。

这个方案更贴合你的当前需求,实现起来更简单,存储冗余也能大幅降低。

关于你初始方案的补充

你的原始思路其实也有优势:查询可用时段时不用额外计算,直接查available表就能拿到结果,适合小体量的系统。但如果用户量、预约量上来,3倍的冗余记录会增加数据库存储压力和查询开销,这时候上面的优化方案就更合适。

内容的提问来源于stack exchange,提问作者Joff

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:07:58