想设计一个排课系统,看了网上文库的表结构设计弄的我是一点没看懂

看看知乎又是扯一堆算法

我想一个适用所有学校的排课程序是不现实的,需求是千变万化的

我们理解的,看到的都是已经排好的结果,是Excel把【课时】【教室】【班级】【老师】【课程】结合在一起形成的效果

学生看到的是这样的:

老师看到的是这样的:

首先一点,应该是所有人能够获得关于课程表的完整信息内容

那么应该反过来不断控制需求,想一个最稳定最简单的结构来进行设计:

固定周一到周五,满打满算1天8节课,40课节数,或者说课时量

班级固定一个教室,老师固定只教授一门课程

课时量从天数来算还是很难以被程序抽象计算,所以控制到最小的课节来确定

即课时也是可以被抽象成程序中的一条记录

创建一个时间表(课节表)

记录就是每一个课节 (1 - 1) 表示 周一的第一节

DROP TABLE IF EXISTS `temp_time`;
CREATE TABLE `temp_time` (
`TIMING_ID` int NOT NULL AUTO_INCREMENT,
`TIMING_NAME` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`TIMING_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ----------------------------
-- Records of temp_time
-- ----------------------------
INSERT INTO `temp_time` VALUES (1, '1 - 1');
INSERT INTO `temp_time` VALUES (2, '1 - 2');
INSERT INTO `temp_time` VALUES (3, '1 - 3');
INSERT INTO `temp_time` VALUES (4, '1 - 4');
INSERT INTO `temp_time` VALUES (5, '1 - 5');
INSERT INTO `temp_time` VALUES (6, '1 - 6');
INSERT INTO `temp_time` VALUES (7, '1 - 7');
INSERT INTO `temp_time` VALUES (8, '1 - 8');
INSERT INTO `temp_time` VALUES (9, '2 - 1');
INSERT INTO `temp_time` VALUES (10, '2 - 2');
INSERT INTO `temp_time` VALUES (11, '2 - 3');
INSERT INTO `temp_time` VALUES (12, '2 - 4');
INSERT INTO `temp_time` VALUES (13, '2 - 5');
INSERT INTO `temp_time` VALUES (14, '2 - 6');
INSERT INTO `temp_time` VALUES (15, '2 - 7');
INSERT INTO `temp_time` VALUES (16, '2 - 8');
INSERT INTO `temp_time` VALUES (17, '3 - 1');
INSERT INTO `temp_time` VALUES (18, '3 - 2');
INSERT INTO `temp_time` VALUES (19, '3 - 3');
INSERT INTO `temp_time` VALUES (20, '3 - 4');
INSERT INTO `temp_time` VALUES (21, '3 - 5');
INSERT INTO `temp_time` VALUES (22, '3 - 6');
INSERT INTO `temp_time` VALUES (23, '3 - 7');
INSERT INTO `temp_time` VALUES (24, '3 - 8');
INSERT INTO `temp_time` VALUES (25, '4 - 1');
INSERT INTO `temp_time` VALUES (26, '4 - 2');
INSERT INTO `temp_time` VALUES (27, '4 - 3');
INSERT INTO `temp_time` VALUES (28, '4 - 4');
INSERT INTO `temp_time` VALUES (29, '4 - 5');
INSERT INTO `temp_time` VALUES (30, '4 - 6');
INSERT INTO `temp_time` VALUES (31, '4 - 7');
INSERT INTO `temp_time` VALUES (32, '4 - 8');
INSERT INTO `temp_time` VALUES (33, '5 - 1');
INSERT INTO `temp_time` VALUES (34, '5 - 2');
INSERT INTO `temp_time` VALUES (35, '5 - 3');
INSERT INTO `temp_time` VALUES (36, '5 - 4');
INSERT INTO `temp_time` VALUES (37, '5 - 5');
INSERT INTO `temp_time` VALUES (38, '5 - 6');
INSERT INTO `temp_time` VALUES (39, '5 - 7');
INSERT INTO `temp_time` VALUES (40, '5 - 8');

这样课节数就能被程序描述出来时间的范围了

然后是班级和教室,这里为了控制复杂的变量,简单理想化成班级固定只在一个教室上课

DROP TABLE IF EXISTS `temp_class&classroom`;
CREATE TABLE `temp_class&classroom` (
`CCR_ID` int NOT NULL AUTO_INCREMENT,
`CCR_NAME` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`CCR_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ----------------------------
-- Records of temp_class&classroom
-- ----------------------------
INSERT INTO `temp_class&classroom` VALUES (1, '班级 教室 1');
INSERT INTO `temp_class&classroom` VALUES (2, '班级 教室 2');
INSERT INTO `temp_class&classroom` VALUES (3, '班级 教室 3');
INSERT INTO `temp_class&classroom` VALUES (4, '班级 教室 4');
INSERT INTO `temp_class&classroom` VALUES (5, '班级 教室 5');
INSERT INTO `temp_class&classroom` VALUES (6, '班级 教室 6');

同理老师也只上一门课程:

DROP TABLE IF EXISTS `temp_course&teacher`;
CREATE TABLE `temp_course&teacher` (
`CT_ID` int NOT NULL AUTO_INCREMENT,
`CT_NAME` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`CT_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; -- ----------------------------
-- Records of temp_course&teacher
-- ----------------------------
INSERT INTO `temp_course&teacher` VALUES (1, '课程 - 老师 1');
INSERT INTO `temp_course&teacher` VALUES (2, '课程 - 老师 2');
INSERT INTO `temp_course&teacher` VALUES (3, '课程 - 老师 3');
INSERT INTO `temp_course&teacher` VALUES (4, '课程 - 老师 4');
INSERT INTO `temp_course&teacher` VALUES (5, '课程 - 老师 5');
INSERT INTO `temp_course&teacher` VALUES (6, '课程 - 老师 6');
INSERT INTO `temp_course&teacher` VALUES (7, '课程 - 老师 7');
INSERT INTO `temp_course&teacher` VALUES (8, '课程 - 老师 8');
INSERT INTO `temp_course&teacher` VALUES (9, '课程 - 老师 9');

最后一张表,即结合三张表的记录

CREATE TABLE `temp_schedule` (
`SCH_ID` bigint NOT NULL AUTO_INCREMENT,
`TT_ID` int DEFAULT NULL,
`CC_ID` int DEFAULT NULL,
`CT_ID` int DEFAULT NULL,
`BUNDLE_NO` int DEFAULT NULL,
PRIMARY KEY (`SCH_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

按照现实生活的条件进行数据的记录,而记录的集合就是完整的一张课程表

例如:

1、老师不能在同一时间给多个班上课

2、第一节不能上体育课

3、xx教室不能用,xx老师请假了

如果排除掉这些条件,课程表就是一个笛卡尔积查询:

SELECT
A.TIMING_NAME,
B.CT_NAME,
C.CCR_NAME
FROM
`temp_time` A,
`temp_course&teacher` B,
`temp_class&classroom` C

【DataBase】排课设计思路的更多相关文章

  1. 毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行

    毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行 注意:该项目只展示部分功能,如需了解,评论区咨 ...

  2. 第三次作业——将排课Excel导入系统

    031302322 031302316 将教师排课表导入系统 使用powerdesigner设计数据库表格 设计概念模型 打开new -> Conceptual Data Model创建概念模型 ...

  3. 分享一个CQRS/ES架构中基于写文件的EventStore的设计思路

    最近打算用C#实现一个基于文件的EventStore. 什么是EventStore 关于什么是EventStore,如果还不清楚的朋友可以去了解下CQRS/Event Sourcing这种架构,我博客 ...

  4. OpenStack 通用设计思路 - 每天5分钟玩转 OpenStack(25)

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  5. .NetCore下B/S结构 初探基于遗传学算法的中学自动排课走班(二)

    分析下染色体基因 这里用 老师 课程 班级 教室 周天 上下晚 课时作为染色体编码我封装了如下类 /// <summary> /// NP 授课事件 由教室.课程.班级 时间片段构成 li ...

  6. OpenStack 通用设计思路

    API 前端服务 每个 OpenStack 组件可能包含若干子服务,其中必定有一个 API 服务负责接收客户请求. 以 Nova 为例,nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 ...

  7. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  8. ENode框架单台机器在处理Command时的设计思路

    设计目标 尽量快的处理命令和事件,保证吞吐量: 处理完一个命令后不需要等待命令产生的事件持久化完成就能处理下一个命令,从而保证领域内的业务逻辑处理不依赖于持久化IO,实现真正的in-memory: 保 ...

  9. WebGIS中快速整合管理多源矢量服务以及服务权限控制的一种设计思路

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在真实项目中,往往GIS服务数据源被其他多个信息中心或者第三方 ...

  10. Redis入门指南(第2版) Redis设计思路学习与总结

    https://www.qcloud.com/community/article/222 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术 ...

随机推荐

  1. C#.Net筑基-String字符串超全总结 [深度好文]

    字符串是日常编码中最常用的引用类型了,可能没有之一,加上字符串的不可变性.驻留性,很容易产生性能问题,因此必须全面了解一下. 01.字符与字符编码 1.1.字符Char 字符 char 表示为 Uni ...

  2. kettle从入门到精通 第三十九课 kettle 增量同步(日级)

    1.上一课我们学习了在数据量大的情况下的分页全量同步示例,本次我们一起学习下kettle 增量全量同步.有些业务场景不需要实时数据,比如统计t-1日的销售业绩情况等.   2.kettle增量全量同步 ...

  3. OOP第二阶段题集总结

    一.前言 知识点:考察继承和多态为多,其中还涉及迭代器的使用,在每个题集中都有一个综合性题目设计多方面知识点考试,有List类和HashMap的使用以及正则表达式的运用,并且注重考查设计,理解类与类之 ...

  4. JAVA RSA 私钥签名 公钥验证签名 公钥验签

    JAVA RSA 私钥签名 公钥验证签名 公钥验签 1.待签名字符串转为byte数组时,一般使用UTF8. 2.将私钥字符串(PKCS8格式)转为PKCS8EncodedKeySpec对象. 3.使用 ...

  5. C#/.NET/.NET Core拾遗补漏合集(24年6月更新)

    前言 在这个快速发展的技术世界中,时常会有一些重要的知识点.信息或细节被忽略或遗漏.<C#/.NET/.NET Core拾遗补漏>专栏我们将探讨一些可能被忽略或遗漏的重要知识点.信息或细节 ...

  6. 记录一下tomcat报错日志分析(去重分类)

    #!/usr/bin/env python # coding=utf-8 import os folder_path = 'E:\\Desktop' output_file = 'E:\\Deskto ...

  7. 洛谷 P4343 自动刷题机

    题目链接:自动刷题机 思路 二分典题,两个二分判断出可能的最大值和最小值.需要注意当删掉y行代码后,当前代码行数小于0时需要将代码行数重新赋值为0,然后需要注意二分的n最大值的边界,因为x[i]的最大 ...

  8. 如何应用 matrix3d 映射变幻

    如何应用 matrix3d 映射变幻 先上 demo 记得是在 2015 看到过的一个 html5 演示效果, 很惊艳 当时没明白如何实现,现在我会了,做一个类似的: 又弄了一个拖动的 demo 我数 ...

  9. python的requirements.txt_维护项目依赖包

    pycharm没有类似maven用于管理依赖包的工具,当一个项目在新的环境运行前,需要将对应依赖的包下载回来,如果一个个下载,会出现缺漏或版本号不对应的情况,这个时候可以用requirements.t ...

  10. LLDB辅助工具Chisel入门初探

    LLDB辅助工具Chisel入门初探 基础适用方法 使用场景 iOS开发的调试过程中,LLDB的使用难度较大等各种原因,所以更多的时间开发者们仅仅用于po.expr输出,实际上Facebook(现在该 ...