大家好,问题的背景是:
会议室分布在不同楼层(如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,这样在比较时会简单点?
第二种就是专门再开一张表,记录一个月内可用的时间点,然后定了哪个时间点就相应的给删除那条记录,不过要不断维护这个表不知大家有什么看法?

解决方案 »

  1.   

    你的表设计是可以的,用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
      

  2.   

    为什么start_time>'当天最早的时间 九点'这样做可以更有效的利用索引呢?
      

  3.   

    对于btree索引来说, 搜索的键值区域越小, 能用到这个索引的可能性越大.
    最佳的用法是 =
    其次 是> 且 <如果仅仅一个<, 假如小于这个值的记录占整表的比例很大, 还是要顺序扫描, 建这个索引等于白建