码:码是数据系统中的基本概念。所谓码就是能唯一标识实体的属性,他是整个实体集的性质,而不是单个实体的性质。它包括候选码和主码。
主码:主码是一个能唯一标识一个元组的属性。在一个关系(表)中,主码不一定只有一个,但是一定要有的。在计算机中为了描述事物的唯一性,引入了主码的概念。书上说若一个关系有多个候选码,则选定其中一个为主码。那什么是候选码呢,我在后面会讲到。
外码:如果一个关系中的一个属性是另外一个关系中的主码则这个属性为外码。外码的值要嘛为空,要嘛要为其对应的主码中的一个值。
主码和外码是用来实现参照完整性的,外码的数据项需参照主码的数据项来操作。具体实现是在创建数据库时为表间创立关系。如:
三个关系:
学生信息表(学号、姓名、性别、出生年月、籍贯、所属学院) //学号 是主码
课程表(课程号,课程名称,学分) //课程号 是主码
成绩表(学号,课程号,成绩) //这里学号和课程号就是外码
“成绩表”(从表)的学号参照“学生信息表”(主表)的学号来录入。1、也就是主表里面没有的学号,从表里面不能有,外码参照主码录入;
2、级联操作,即当删除、修改某个主表里面的学号时,从表里面的那个学号会相应的自动删除、修改。外码参照主码操作。
这里来讲一下主码和候选码的区别(虽然老师没要求写)
首先找出它们的定义如下:
主码:主码是一个能唯一标识一个元组的属性。
候选码:如果关系中的某一属性组的值能唯一地标识一个元祖,而其子集不能,则称该属性组为候选码;
主码和候选码都是用来唯一标识关系的。
主属性:一个关系中可以有多个候选码,只需选其中之一作为主码,主码里包含的属性叫做主属性。
举个例子
学生表中:
属性:学号、姓名、性别、年龄、班级、系
一般学号就可以唯一的标识出一个同学的身份,我们可以设置学号为主码。是最简单的候选码。
那么这里的学号就成了主属性。
那么 学号+姓名当然也可以作为唯一标识,也可以用来作为候选码
同理,学号+姓名+性别也可以作为候选码
以此类推
最极端的情况是全表都用来做主码,这时的主码也叫全码。
主属性:候选码的诸属性称为主属性;
非主属性:不包含在任何候选码中的属性称为非主属性;
下面我通过关系模型为例来更好的理解几个概念:
学号 |
姓名 |
年龄 |
性别 |
系名 |
年级 |
20161985 |
王小波 |
19 |
男 |
软件 |
2016 |
20162003 |
李大同 |
18 |
女 |
法律 |
2016 |
20160804 |
章之飞 |
20 |
男 |
旅游 |
2016 |
关系模型的数据结构
元组:表中的一行即为一个元组。
分量:元组中的一个属性值。如:20161985。
域(domain):域是一组具有相同数据类型的值的集合。
模式(schema):也称为逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。
外模式(external schema):也称为子模式或用户模式,是数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。
内模式(internal schema):也称为存储模式,一个数据库只有一个内模式。是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式。
第一范式:指表中的属性都是原子属性,不能再拆分了。
第二范式:在第一范式的基础上,要求非主属性都完全函数依赖于主码。
第三范式:在第二范式的基础上,要求没有非主属性传递依赖于主码。
BC范式:在第三范式基础上,要求所有非主属性都必须依赖于主码。
第四范式:在BC范式基础上,要求表中存在的多值依赖都必须是对主码函数依赖。