2010-07-13 62 views
3

我有三个表学生,部门和大学数据库中的课程... 学生有一个UID作为主键 - >这是学生的唯一ID DEPARTMENT Dept_id作为主键 - >这是部门编号 课程的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 

回答

5

你应该尽可能避免在数据库中的数据复制:

UID Dept_id C_id marks 
1 CS  CS01 98 
    ^^  ^^ 

,你可以:

  • 变化的过程中ID为两列键(部门,课程编号),例如('CS','01')。

或:

  • 保持课程名称,因为它是,但把部门ID字段中course表,并从marks表忽略它。如果您需要计算特定部门的总分数,您仍然可以通过向查询添加JOIN来轻松完成此操作。

你最后的建议似乎是一个坏主意。您需要在表格中为每门课程设置一列,而大多数值将为NULL。

+1

除了业务层应该确保数据操作员无法选择该部门的无效课程。 你不妨映射数据库中的这种关系。 – BenW 2010-07-13 13:45:36

+0

谢谢你的建议。我想我会使用你的想法并将其修改为在课程表中包含Dept_id。 – 2010-07-14 05:00:40

2

我不确定为什么你需要本表中的部门,如果该课程表明部门。因此,为什么你的桌子不是:

UID C_id marks 
1 CS01 98 
1 CS02 96 
1 ME01 88 
1 ME02 90 

这张表缺少的是一些时间的迹象。例如,如果学生第一次失败,则可以选择同一课程两次。因此,您需要额外的专栏来指示学期和年份。

0

您可以将外键约束添加到表中,以确保为学生ID,课程ID和部门ID输入了有效值。您还可以为表添加唯一的约束,以确保无意创建重复项。但最后你不能阻止插入不正确的数据;如果你知道这是不正确的,你不需要问它。

例如:1957年2月29日不可能是我的生日; 2025年7月15日不可能是我的生日; 1974年9月27日不是我的生日。

+0

。我正在设计它,并将其交给DBA谁将插入它不是我..所以我很害怕,如果他插入错误! – 2010-07-14 11:05:24

1

你的建议将是一个噩梦来维护。每次将新课程添加到课程时,您都必须添加新列。大部分时间查询也很难。

如果你想确保每门课程是适当的部门,你可以做,在触发器(确保处理多个记录插入或更新),或在应用程序中。这仍然不能阻止所有的数据输入错误(这是可能搭载CS89当你CS98的意思),但它会减少误差量。在这种情况下,这是不可能的数据将来自比其他应用程序的任何地方,所以我可能会选择执行应用程序的规则。他们选择部门的下拉式列表,只有该部门的课程才会显示出来。

+0

连我觉得我最后的建议是错误的,但同样是进退两难是否要为这样的替代品。 – 2010-07-14 05:03:24