包含外键作为主键的弱实体

时间:2010-07-14 06:53:59

标签: sql

我创建了一个名为STUDENT的表格,其中包含唯一ID作为PRIMARY KEY以及其他相关属性,例如NameAddrGender等...

由于我不想增加STUDENT的表格大小,我创建了一个名为ACADEMIC RECORDS的弱实体,它存储了学生以前的学术记录。但是在这张表中我只有创建了一个PRIMARY KEY Unique ID,它引用了学生的Unique ID。并且在弱实体Unique ID表中没有与ACADEMIC RECORD一起使用的其他属性。

当我看到一个弱的实体的定义时,它将主键定义为弱实体的属性和所有者的表的主键(在这种情况下为STUDENT

的组合

我的方法是创建外键作为表ACADEMIC RECORD中唯一的主键吗?

STUDENT Table  
**UID**  NAME  GENDER  ADDRESS  PHNO.

ACADEMIC RECORD Table  
**UID**  HighschoolMarks  GradSchoolMarks

2 个答案:

答案 0 :(得分:5)

拥有一个完全是外键的主键并没有什么不妥。这是实现类似“基类”的常用方法,其中实体在基表中有一行,而可能在一个或多个扩展表中有一行(一对一或零关系)。

我不确定这是你所做的最合适的架构。如果学术记录和学生之间确实存在一对一的关系,那么看起来它们对我来说就是同一个实体的一部分。

在这种情况下,从标准化的角度来看,记录列应该是主学生表的一部分。 也许有一个效率减法的理由,但“我不想增加表格大小”通常不是充分的理由。数据库可以应对大表。

答案 1 :(得分:1)

我不清楚你在问什么,但听起来你使用的是正确的方法。

您的STUDENT表需要一个主键才能为每一行提供唯一的引用。

您的ACADEMIC_RECORD表还需要一个主键,以便为每一行提供唯一的引用。

每个学生可能拥有零个或多个学术记录,并且您想要识别每个学术记录所属的学生。您可以通过在ACADEMIC_RECORD表格中添加一个包含学生id(主键)的列来执行此操作:

STUDENT      ACADEMIC_RECORD
             id
id <-------> student_id
name         high_school_marks
gender       grade_school_marks
address
phone_no

假设你有三个学生:Alice,Bob和Dave。爱丽丝和戴夫有三个学术记录,鲍勃有两个。你的表看起来像这样(我省略了一些列以使事情更清楚):

STUDENT
id    name
1     Alice
2     Bob
3     Dave

ACADEMIC_RECORD
id    student_id
1     1
2     1
3     1
4     2
5     2
6     3
7     3
8     3