我对学校信息系统有以下数据库结构:
使用这个数据库结构,我必须为每个学年输入所有级别的主题(class1,class2等)。在大多数学年中,1级学科将保持不变(例如:2010年,2011年,1类科目相同)。因此,即使主题保持不变,数据录入个人也会发现每个学年每个级别的科目都很麻烦。
课程可能会在某个时间间隔内针对每个级别进行更改,并且不同级别的科目可能会发生变化。
我如何构建我的数据库,使得数据输入个人不必每学年输入科目,如果课程没有改变,并且当科目改变一定水平时做出必要的改变? 例如:2013年的1级科目没有变化,因此数据录入个人不必再次输入科目。 2013年2级科目发生变化,数据录入个人进入科目。
还建议目前的结构是否适合。
答案 0 :(得分:2)
如果我理解正确,那么第一个想法就是:
:选择:强>
之后,如果您需要选择实际信息 - 您只需从关系表中选择 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,则在给定时间点在给定级别上授课。