在学校管理系统中对学科管理进行正确的数据库结

时间:2013-12-10 15:29:27

标签: sql database database-design relational-database

我对学校信息系统有以下数据库结构:

enter image description here

使用这个数据库结构,我必须为每个学年输入所有级别的主题(class1,class2等)。在大多数学年中,1级学科将保持不变(例如:2010年,2011年,1类科目相同)。因此,即使主题保持不变,数据录入个人也会发现每个学年每个级别的科目都很麻烦。

课程可能会在某个时间间隔内针对每个级别进行更改,并且不同级别的科目可能会发生变化。

我如何构建我的数据库,使得数据输入个人不必每学年输入科目,如果课程没有改变,并且当科目改变一定水平时做出必要的改变? 例如:2013年的1级科目没有变化,因此数据录入个人不必再次输入科目。 2013年2级科目发生变化,数据录入个人进入科目。

还建议目前的结构是否适合。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,那么第一个想法就是:

  1. 删除表 tbl_academic_years ;
  2. 为主题创建新表 tbl_subjects ;
  3. 创建新表 tbl_relations
  4. :选择:

    之后,如果您需要选择实际信息 - 您只需从关系表中选择 deleted = 0

    SELECT
        l.name,
        s.name
    FROM
        tbl_relations r
        INNER JOIN tbl_levels l
        ON r.level_id = l.id
        INNER JOIN tbl_subjects s
        ON r.subject_id = s.id
    WHERE
        r.deleted = 0
    

    添加

    如果您需要为级别添加新主题,首先将新主题添加到 tbl_subjects ,然后添加包含 tbl_relations 的新ID的记录。

    删除:

    如果您需要删除关卡的主题 - 将值 0 设置为字段已删除或删除 tbl_relations 中的行。

    如果受试者没有改变 - 什么都不做。

    我认为数据库的最佳结构将是mysql中生成的下一个脚本:

    CREATE TABLE `tbl_levels` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(255),
        PRIMARY KEY (`id`)
    );
    
    CREATE TABLE `tbl_subjects` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `name` varchar(255),
        PRIMARY KEY (`id`)
    );
    
    CREATE TABLE `tbl_relations` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `level_id` int(11),
        `subject_id` int(11),
        `deleted` tinyint(1) DEFAULT '0',
        PRIMARY KEY (`id`),
        KEY `level_id` (`level_id`),
        KEY `subject_id` (`subject_id`),
        CONSTRAINT `tbl_relations_ibfk_1` FOREIGN KEY (`level_id`) REFERENCES `tbl_levels` (`id`),
        CONSTRAINT `tbl_relations_ibfk_2` FOREIGN KEY (`subject_id`) REFERENCES `tbl_subjects` (`id`)
    );
    

答案 1 :(得分:1)

逻辑结构的正确性应优先于使用方便性。由于您的数据库设计符合软件正常运行的逻辑业务要求,因此可以通过易于使用的GUI来处理数据输入的便利性,其中公共信息作为用户批准或更新的默认提供(而不是从刮擦)或通过运行部分配置过程的安装程序。

在您的特定情况下,此过程不是日常工作。它可能是在开始使用或首次使用该软件时执行的,因此我建议您不要更改数据库设计,如果它对您的业务是正确的。

答案 2 :(得分:0)

最简单的解决方案是将表tbl_subjects更改为“from_year”和“to_year”列。如果记录中“from_year”小于date,并且“to_year”大于日期,或者“to_year”为null,则在给定时间点在给定级别上授课。