我想为学校设计一个数据库,对学生的分数进行评分。 但我目前的设计陷入了困境,我想插入学生分数。 我当前的数据库设计在更广泛的层面上是这样的:
------------------- ------------------- ------------------
STUDENTINFO | | EXAMS | | taught_in |
------------------- ------------------- ------------------
reg_id | | examID | | t_cisId |
cis_Id | | examname | | subjectcode |
$otherAttributes | | | | t_id(auto-inc)|
__________________| |_________________| |________________|
------------------- ----------------- ------------------
|ClassInSchool | | Subjects | |Result |
------------------- ----------------- ------------------
| classes | | subjectcode | | regId |
| section | | subjectname | | examID |
| cis_id | |_______________| | t_id |
|_________________| |__scoredmarks___|
现在的问题是: 在结果表中,我只想将那些满足以下条件的记录插入表中:
- 学生应该是注册学生(满足 regId 要求)。
- 应为有效(现有)考试插入分数(由 examId 满足)。
- 学生在类(class)中学习特定科目,则应仅为这些科目插入分数。这就是我所在的地方 面临问题。
例如,7 年级 A 课教授英语。那么对于学习 7A 的学生,只能插入英语分数。
在我的设计中,如果在 7 节课的 B 节中教授数学,那么我可以为在 7 A
学习的学生插入数学
的分数>.
我只想在数据库级别处理此行为,否则我必须在 Java 端处理此行为。
注意:regId、examID、t_id 均为 F.K.我在这里为 F.K 使用了类似的名称,以便形象地理解。
最佳答案
我希望我正确理解了这个问题。
看来你的设计可能需要一些改进。
在当前的设计中,没有什么可以阻止学生参加两次考试。
考试没有主题,因此一次考试可能会导致多个科目......等等
(如果我错了请纠正我)
顺便说一句,当前设计中问题的根源在于您使用代理键标识符作为关联表的主键。
这是side effect of using surrogate key , more info
顺便说一句,下面的设计草案可能会派上用场:
请注意:
taught_in PK = subjectPK + ClassInScholePK
STUDENTINFO Pk = subjectPK + ClassInScholePK + studentpk
Exam pk = sequence + subjectPK
result pk = (STUDENTINFO Pk) + (Exam pk) =
(subjectPK_1 + ClassInScholePK + studentpk_1) + (sequence + subjectPK_2)
对 student_PK + 序列 + subjectPK
进行唯一约束将导致每次考试的学生成绩不重复。
对 subjectPK_1 = subjectPK_2
进行检查约束将产生特定于主题的结果。
关于sql - 数据库设计中的插入异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22424037/