插入异常在数据库设计中

时间:2014-03-15 12:52:29

标签: sql database database-design

我想为学校设计一个数据库,学生的分数将被评分。 但是当我想要插入学生标记时,我陷入了目前设计的困境。 我目前更广泛的数据库设计类似于:

-------------------       -------------------      ------------------
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___|

现在问题是: 在结果表中,我只希望将这些记录插入到表中,以满足以下条件:

  1. 学生应该是注册学生(由regId满意)。
  2. 应插入标记以进行有效(现有)考试(通过考试获得满意)。
  3. 在课堂上研究特定科目的学生,则应仅为这些科目插入标记。这就是我 面对问题。
  4. 例如,在第7课的A部分,教授英语。那么对于在7A学习的学生,只能插入英语分数。

    在我的设计中,如果在7课程的B部分,数学课程被教授,那么我可以为正在Maths学习的7 A的学生插入标记。 < / p>

    我只想在数据库级别处理此行为,否则我必须在Java端处理此问题。

    注意:regId,examID,t_id是F.K.我在这里使用类似的名字来表示F.K以图形方式理解。

3 个答案:

答案 0 :(得分:1)

描述静态对象的所有表都在那里。这些是查找表。要获得答案,需要一个从查找表中提取项目的事务表。该交易将描述特定班级中的特定学生。如果学生的课程总是只有一门考试,那么交易可能会包括他们注册的考试。

一旦描述班级中的学生的交易存在,你可以说我有一门课的考试 - 这是班上的学生。有很多方法可以将它们组合在一起。我假设你的学生信息表只是学生,虽然关键id提示可能需要拆分。一种方法可能是:

Registration Transaction                 Exam Assignment Transaction     Exam Result Transaction
registration id  unique                  exam assignmt id                result id
student id                               exam id                         student id
class id                                 class id                        exam assignmt id
registration date                        exam date                       scores, etc

如果学生在注册表中并且考试被分配到班级,请在结果表中创建一行

答案 1 :(得分:1)

我希望我能正确理解这个问题。

看来你的设计可能需要一些改进 在目前的设计中,没有什么能阻止学生参加考试两次 考试没有科目,所以考试可能导致多个科目...等 (如果我错了,请纠正我)

BTW当前设计中的问题来源是您使用代理键标识符作为关联表的主键。 这是side effect of using surrogate keymore info

BTW草案设计可能会派上用场:

enter image description here 请注意:

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 + sequence + subjectPK设置唯一约束将导致每次考试没有重复的学生成绩 在subjectPK_1 = subjectPK_2上设置检查约束将导致特定主题的结果。

答案 2 :(得分:1)

您需要使用识别关系,类似于所描述的内容herehereherehere。您可能也对surrogate and natural keys的相对利弊感兴趣。

我将这个案例的确切实现作为读者的练习;)