会议室预定系统表设计问题

jianpx 2009-04-04 04:12:45
大家好,问题的背景是:
会议室分布在不同楼层(如5-8楼),对每个会议室,可用时间是早上九点到晚上九点,使用时间的间隔为半小时的整数倍,也就是说我只能定10:00-10:30或者10:00-11:00,而不能10:00-10:20等,然后我想设计一张表来记录每个用户的预定记录,我的表设计如下:
table_name:bookings

字段如下:
record_id:int型,表示记录的id
user_id:int,用户的id
room_id:int,会议室的id
start_time:datetime,会议室开始使用时间
end_time: datetime, 会议室结束使用的时间

------------------
我的问题是当我去查询这张表,想查出哪些会议室符合用户的时间要求(时间不与其他已经预定的会议室时间冲突)的时候,假设用户指定时间为(t1,t2),而我要先拿出room表的id,然后对每个id循环比较这个表里面的所有时间段是否和(t1,t2)冲突,如果没有冲突,那么对应的room id就入选,但是比较起来因为datetime类型比较麻烦,而且感觉效率不高!

请问是不是我的表字段设计有问题?还是我的思路有问题?请大家指教

然后我也想过用别的方法,其中一是用unix_time的这个时间戳来表示start_time和end_time,这样在比较时会简单点?
第二种就是专门再开一张表,记录一个月内可用的时间点,然后定了哪个时间点就相应的给删除那条记录,不过要不断维护这个表

不知大家有什么看法?
...全文
686 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
trainee 2009-04-25
  • 打赏
  • 举报
回复
对于btree索引来说, 搜索的键值区域越小, 能用到这个索引的可能性越大.
最佳的用法是 =
其次 是> 且 <

如果仅仅一个<, 假如小于这个值的记录占整表的比例很大, 还是要顺序扫描, 建这个索引等于白建

jianpx 2009-04-25
  • 打赏
  • 举报
回复
为什么start_time>'当天最早的时间 九点'这样做可以更有效的利用索引呢?
trainee 2009-04-04
  • 打赏
  • 举报
回复
你的表设计是可以的,用select语句就可以了
找出时间有交叉的预订
select * from bookings where start_time<t2 and end_time>t1
排除这些房间就可以了。

可以在start_time建立索引,为了能更有效的利用索引,再加个比较项(假如会议不会跨天的情况下)
select * from bookings where start_time<t2 and start_time>'当天最早的时间 九点' AND end_time>t1


56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧