sql - 学校管理系统中科目管理的正确数据库结构

标签 sql database database-design relational-database

学校信息系统的数据库结构如下:

enter image description here

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

每个级别的类(class)可能会在某个时间间隔发生变化,并且各个级别的科目可能会发生变化。

我如何构建我的数据库,使数据录入人员不必每学年都输入科目,并且如果类(class)不更改并在科目更改某个级别时进行必要的更改? 例如:1 类科目在 2013 年没有变化,因此数据输入人员不必再次输入科目。 2013 年第 2 类科目发生变化,数据输入个人输入科目。

还建议当前结构是否最适合。

最佳答案

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

  1. 删除表tbl_academic_years
  2. 为主题创建新表tbl_subjects
  3. 创建新表tbl_relations

选择:

之后,如果您需要选择实际信息 - 您只需从关系表中选择 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,然后将具有新 id 的记录添加到 tbl_relations

删除:

如果您需要删除级别的主题 - 将值 0 设置为 deleted 字段或删除 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`)
);

关于sql - 学校管理系统中科目管理的正确数据库结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20498435/

相关文章:

java - 将 Java 域对象映射到表的良好设计(使用 Hibernate)

c# - 在 mvc3 中处理图像的不同方法

sql - 数据库中的邮政编码到城市/州,反之亦然?

mysql - 从具有类别的表中选择最小值和最大值

javascript - foreach 在 laravel 中使用 javascript 循环

mongodb - Mongodump 和 mongorestore;未找到字段

mysql - 如何使用jdbc连接器/J 8.0.11最新2018连接mysql?

mysql - 查询以选择用户未注册的所有研讨会

sql - Postgresql 中不可预测的查询性能

mysql - RDBMS、外键合并还是单独表?