我在大学数据库中有三个表STUDENT,DEPARTMENT和COURSE ... 学生有一个UID作为主键 - >这是学生的唯一ID DEPARTMENT将Dept_id作为主键 - >这是部门号码 COURSE将C_id作为主键 - >这是课程/科目ID
我需要通过将每个课程中每个学生的学生,部门和课程的主键相关联来在表格中存储标记。
UID Dept_id C_id marks
1 CS CS01 98
1 CS CS02 96
1 ME ME01 88
1 ME ME02 90
问题是,如果我为标记创建这样的表格,那么我觉得数据运算符可能会插入错误的学生主键组合,例如
UID Dept_id C_id marks
1 CS CS01 98
1 CS CS02 96
1 ME CS01 88 //wrong C_id (course id) inputted by the DBA
1 ME ME02 90
在哪种情况下我怎么能阻止他这样做? 还有其他方法为每个学生存储标记吗?我的意思是:
UID Dept_id CS01 CS02
1 CS 98 96
3 CS 95 92
答案 0 :(得分:5)
如果可能,您应该避免在数据库中复制数据:
UID Dept_id C_id marks
1 CS CS01 98
^^ ^^
你可以:
或:
course
表格中,并从marks
表格中省略。如果您需要计算特定部门的总分数,您仍然可以通过在查询中添加JOIN来轻松完成此任务。你的最后一个建议似乎是一个坏主意。对于每个课程,您需要在表中使用一列,并且大多数值都为NULL。
答案 1 :(得分:2)
如果课程表明部门,我不确定为什么你需要这个部门的部门。因此,为什么你的桌子不是:
UID C_id marks
1 CS01 98
1 CS02 96
1 ME01 88
1 ME02 90
此表中缺少的是时间的一些指示。例如,如果第一次失败,学生可以两次参加相同的课程。因此,您需要额外的列来指示学期和年份。
答案 2 :(得分:1)
你的建议将是一场噩梦。每次将新课程添加到动作时,您都必须添加新列。在大多数情况下查询也会更难。
如果您想确保每个课程都适合该部门,您可以在触发器中执行此操作(确保处理多个记录插入或更新)或在应用程序中执行此操作。这仍然不会阻止所有数据输入错误(当你的意思是CS98时可以选择CS89),但它会减少错误的数量。在这种情况下,数据不太可能来自应用程序以外的任何地方,因此我可能会选择在应用程序中强制执行规则。一个下拉列表,他们选择了部门,只有该部门的课程显示可以解决问题。
答案 3 :(得分:0)
您可以向表中添加外键约束,以确保为学生ID,课程ID和部门ID输入有效值。您还可以向表中添加唯一约束,以确保不会创建无意的重复项。但最终你无法阻止插入不正确的数据;如果你知道它不正确,你就不需要它了。
例子:1957年2月29日不能成为我的生日; 2025年7月15日不是我的生日; 1974年9月27日不是我的生日。