最近做项目要搞数据库看到范式那一节头脑发晕,概念都忘了,于是从网上搜罗并整理一下;
函数依赖部分参考:https://blog.csdn.net/jsj13263690918/article/details/79796275
主码:主关键字(主键,primary key)是被挑选出来,作表的行的唯一标识的候选关键字(也称为候选键)。一个表只有一个主关键字。主关键字又可以称为主键。 主键可以由一个字段(注释1),也可以由多个字段组成,分别称为单字段主键或多字段主键。又称主码。并且它可以唯一确定表中的一行数据,或者可以唯一确定一个实体。
- 注释1:字段是逻辑设计中的数据描述,对应E-R图中的属性;也就是说主键可以由一个属性组成也可以由多个属性组成;
主属性:在一个关系中,如果一个属性是构成某一个候选关键字 (候选码的属性集中的一个属性,则称它为主属性(Prime attribute)。
候选键:(自己的理解)比方说 成绩表S(课程号,学号,成绩);此时课程号、学号就是候选键,能够唯一确定成绩,反之,其中任何一个主键,比如课程号或者是学号都不能确定成绩;
非主属性:表中的属性除了主属性就是非主属性;
超键:超键包含候选键并且还有其他非主属性;
函数依赖:
我们可以这么理解(但并不是特别严格的定义):若在一张表中,在属性(或属性组)X的值确定的情况下,必定能确定属性Y的值,那么就可以说Y函数依赖于X,写作 X → Y。也就是说,在数据表中,不存在任意两条记录,它们在X属性(或属性组)上的值相同,而在Y属性上的值不同。这也就是“函数依赖”名字的由来,类似于函数关系 y = f(x),在x的值确定的情况下,y的值一定是确定的。
例如,对于表3中的数据,找不到任何一条记录,它们的学号相同而对应的姓名不同。所以我们可以说姓名函数依赖于学号,写作 学号 → 姓名。但是反过来,因为可能出现同名的学生,所以有可能不同的两条学生记录,它们在姓名上的值相同,但对应的学号不同,所以我们不能说学号函数依赖于姓名。表中其他的函数依赖关系还有如:
系名 → 系主任
学号 → 系主任
(学号,课名) → 分数
但以下函数依赖关系则不成立:
学号 → 课名
学号 → 分数
课名 → 系主任
(学号,课名) → 姓名
从“函数依赖”这个概念展开,还会有三个概念:
完全函数依赖
在一张表中,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X ’ → Y 不成立,那么我们称 Y 对于 X 完全函数依赖,记作 X F→ Y。(那个F应该写在箭头的正上方,没办法打出来……,正确的写法如图1)
图1
例如:
学号 F→ 姓名
(学号,课名) F→ 分数 (注:因为同一个的学号对应的分数不确定,同一个课名对应的分数也不确定)
部分函数依赖
假如 Y 函数依赖于 X,但同时 Y 并不完全函数依赖于 X,那么我们就称 Y 部分函数依赖于 X,记作 X P→ Y,如图2。
图2
例如:
(学号,课名) P→ 姓名
传递函数依赖
假如 Z 函数依赖于 Y,且 Y 函数依赖于 X (感谢@百达指出的错误,这里改为:『Y 不包含于 X,且 X 不函数依赖于 Y』这个前提),那么我们就称 Z 传递函数依赖于 X ,记作 X T→ Z,如图3。
图3