学校信息系统的数据库结构如下:
使用这种数据库结构,我必须为每个学年输入所有级别(class1、class2 等)的科目。在大多数学年中,1 类科目将保持不变(例如:2010、2011、2012 年的 1 类科目将相同)。因此,即使科目保持不变,数据录入人员也会发现为每个学年的每个级别输入科目很麻烦。
每个级别的类(class)可能会在某个时间间隔发生变化,并且各个级别的科目可能会发生变化。
我如何构建我的数据库,使数据录入人员不必每学年都输入科目,并且如果类(class)不更改并在科目更改某个级别时进行必要的更改? 例如:1 类科目在 2013 年没有变化,因此数据输入人员不必再次输入科目。 2013 年第 2 类科目发生变化,数据输入个人输入科目。
还建议当前结构是否最适合。
最佳答案
如果我理解正确那么第一个想法是:
- 删除表tbl_academic_years;
- 为主题创建新表tbl_subjects;
- 创建新表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/