• 【DataBase】排课设计思路


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

    看看知乎又是扯一堆算法

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

    我们理解的,看到的都是已经排好的结果,是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

  • 相关阅读:
    探索需求14
    周总结5
    周总结4
    探索需求13
    Java——迭代器
    Java——Collection集合
    Java——包装类
    Java——Arrays
    Java——BigInteger、BigDecimal
    Java——System
  • 原文地址:https://www.cnblogs.com/mindzone/p/14811553.html
Copyright © 2020-2023  润新知