我正在尝试设计一个用于创建学校教学大纲的数据库。简而言之,所有课室可由上午八时至下午十八时开放十小时。如何创建数据库来回答以下问题?
让我在周一的A101课堂上有空闲的时间?
我在下面写了这个问题,但它不够好,无法有效地回答这个问题|:http://i51.tinypic.com/110drgk.png
发布于 2011-05-20 06:30:43
我只涉猎过数据库,但这个问题对我来说似乎很有趣。
从我得到的信息来看,您似乎对如何编写查询比如何存储数据更感兴趣。根据您的解释,您需要的是一个输出类似于以下内容的查询:
classroom openStart openEnd day session
A101 9:00 10:00 mo spring
A101 14:00 16:00 mo spring假设模式测试,表类。类包含startTime和endTime值。这里将忽略将对其执行过滤的其他值,以便只关注您感兴趣的逻辑。此查询是在MySQL上运行的。
-- 8 and 18 are added as the boundaries for the day.
Select * from (Select * from ((select endTime as a from test.class) union (select 8)) as t1
join ((select startTime as b from test.class) union (select 18 as startTime)) as t2
where a <= b group by a order by a, b) as t3 where a != b;三个子查询。
第一个方法创建所有结束时间(附加了当天的开始时间)与所有开始时间(附加了当天的结束时间)的叉积。这为您提供了一系列的行,表示每个可能打开的时间块。(排列为块开始/块结束)
然后,第二个方法通过筛选出块开始发生在块结束之后的值来比较第一个子查询的结果,然后按块开始、块结束对这些值进行排序。这使得当值通过block-start分组时,您可以获得一个很好的配对列表,这使得识别类连续的位置变得很容易。
然后,第三个查询过滤掉时间相同的值,只给出相关的时间块。假设第三个查询可以使用比较,以排除课程间隔也不到一个小时的情况。
我相信其他人可能会为你提供一些更简单的解决方案。
发布于 2011-05-20 05:05:42
在您的数据库图表中甚至没有教室。
如果你的主要关注点之一是阅读准备时间,我会提出如下建议:
一个timeSlot表,其中包含一天中时间块的列(因为这可以分解为一个相对较小的有限数字,比如每30分钟一个)。这样,classroom表将具有5个或7个in,对应于timeSlot表中的5个或7个条目
希望这能帮上忙
瑞安·泰勒
发布于 2011-05-20 18:12:55
支持泛型interval类型的DBMS让这一切变得非常简单:
使用和属性定义relvar。
然后只查询'X不匹配Y',其中:
X是提及适当的教室标识符和时间间隔08.00-18.00的关系文字,
Y是持有的relvar,
(不匹配是调用关系代数的SEMIMINUS运算符所需的关键字)。
例如,在SIRA_PRISE中,您可以有一个名为SCH的scheduledDuring:1999-01-02-09.30.00-1999-01-02-12.00.00}.,其中包含例如"scheduled_during“元组{classRoomID:"A101”relvar
关系文本可以是“关系{ scheduledDuring:1999-01-02-08.00.00-1999-01-02-18.00.00}}". {classRoomID:”A101“TUPLE
然后查询SEMIMINUS(RELATION{TUPLE{...}},SCH)将产生元组
scheduledDuring:1999-01-02-08.00.00-1999-01-02-09.30.00和scheduledDuring:1999-01-02-12.00.00-1999-01-02-18.00.00:“A101”scheduledDuring:1999-01-02-08.00.00-1999-01-02-09.30.00和classRoomID:"A101“classRoomID
编辑
PS不要被名为scheduledDuring的属性所混淆,该属性显示房间未被调度的时间段。值的含义在查询的“外部谓词”中,而不是在属性名称中。
https://stackoverflow.com/questions/6063984
复制相似问题