在学习数据库这门课程时,遇到了关于码的一些问题,接下来我将会通过几个例子来解释我对这几个概念的理解
在讲关于码的问题之前,首选要了解在关系中,属性和元组的概念
学号 | 姓名 | 专业 |
001 | 张三 | 计算机 |
002 | 李四 | 通信 |
003 | 王五 | 计算机 |
在上面的二维表(关系)中,每一列即为一个属性,每一行即为一个元组
注:上表中假设学生姓名不重复。
先给结论:主码∈候选码∈码。
码:
码是一个或多个属性的集合,唯一标识元组的属性集。
例如在上表中,由学号或姓名都可以唯一确定一个元组,所以学号可以为码,姓名也可以为码。
当同时知道学号和姓名的时候,也可以唯一确定一个元组,所以(学号,姓名)确定同样可以为码。
同理(学号,姓名,专业)也可以为码。
候选码:
候选码的概念:若某一关系中,某一属性(组)能唯一的标识一个一个元组,而其子集不能,则称该属性组为候选码。
候选码和码都可以唯一标识一个元组,但不同之处在于,若码为一个属性集,当去掉某一个属性时,仍有可能能够唯一确定一个元组,但候选码的子集不能标识出一个元组
例如上表中(学号,姓名)这个属性集可以唯一标识一个元组,但同时,他的子集(学号)同样可以唯一标识一个元组,所以(学号,姓名)不为候选码。
所以,上表中的候选码属性有(学号)(姓名)。
主码:
在理解候选码之后主码就很好理解了,在候选码中选择一个就可以作为主码了
同样是上面的表格,可以选择(学号)作为主码,也可以选择(姓名)作为主码。
但注意,主码只能是一个属性(集),不能同时选择学号和姓名作为主码。
注意:主码不能为空值!
再举一个例子:
学号 | 姓名 | 课程号 | 成绩 |
001 | 张三 | 1 | 98 |
001 | 张三 | 2 | 88 |
002 | 李四 | 1 | 77 |
003 | 李四 | 2 | 77 |
注:上表中假设学生姓名不重复。
在上述表格中,单独的学号不在可以唯一确定一个元组了,所以,(学号)并不是码了,而(学号,课程号)可以为码,(学号,姓名,课程号,成绩)同样也可以为码;
候选码可以为(学号,课程号)或者(姓名,课程号)。
主码一般都选择(学号,课程号)。
注意 这个例子中 因为(学号,课程号)为主码 所以 学号课程号都不能为空。
外码:
先看以下两个关系
学生(学号,姓名,性别,专业号,年龄)
学号 | 姓名 | 性别 | 专业号 | 年龄 |
001 | 张三 | 男 | 1001 | 19 |
002 | 李四 | 女 | 1002 | 18 |
003 | 王五 | 男 | 1001 | 17 |
专业(专业号,专业名)
专业号 | 专业名 |
1001 | 计算机 |
1002 | 通信 |
在学生(学号,姓名,性别,专业号,年龄)中,学号为主码,由于专业号并不可以确定具体是哪个元组,所以专业号在学生关系中并不是码,
在专业(专业号,专业名)中,专业号为主码,如果想要在学生表中确定学生的专业名字,需要通过专业号来确定,即学生关系引用了专业关系的主码“专业号”,此时“专业号“便是学生关系的外码。并且称学生关系为参照关系,专业关系为被参照关系。
教材上外码的定义太过拗口,给出我理解的定义:如果一个关系中的一个属性(该属性不能是候选码)是另外一个关系中的主码则这个属性为外码。
同时可以知道关于外码的一个知识点:参照关系的外码和被参照关系的主码的域(取值范围)必须相同。
另外一个例子:
学号 | 姓名 | 性别 | 专业号 | 年龄 | 班长 |
001 | 张三 | 男 | 1001 | 19 | |
002 | 李四 | 女 | 1002 | 18 | 001 |
003 | 王五 | 男 | 1001 | 17 | 001 |
在这个关系中学号仍然为主码,但是并不能直接知道这个学生的班长是谁,此时,通过班长这个属性,再次查看学生关系,就可以知道这个学生的班长是谁了,这也就引出额外的两个知识点:
外码可以为空,参照关系和被参照关系可以是同一个关系。
额外提一嘴,主码和主键,外码和外键,实际上都是一个意思,只不过叫法不同。
通过这几个例子,希望能对大家对数据库的学习起到一定的帮助,如果有任何疑问,或者笔者若有任何写的不对的地方,欢迎在评论区讨论指正。