范式:模式分解,一范式分解成二范式、三范式

模式分解

第一范式:关系模式R中的每个关系rd的属性值都是不可再分的原子值。
第二范式:关系模式R是1NF,不存在局部依赖,那么称R是2NF。
第三范式:关系模式R是2NF,不存在传递依赖,那么称R是3NF
此处只讲模式分解的具体方法,讲解参考施伯乐《数据库系统教程》4.4节关系模式的范式。
给定1NF如下:
(学号,姓名,系名,系主任,课程名,分数)

一、1NF与2NF的转换

方法定义(引自施伯乐书籍):

设关系模式R(U),主键是W,R上还存在FD X—>Z,并且Z是非主属性和X∈W,那么W—>Z就是一个局部依赖。此时应把R分解成两个模式:
R1(XZ),主键是X;
R2(Y),Y=U-Z,主键仍是XZ,外键X(参照R1)。
利用外键和主键的链接,可以重新得到R。
如果R1和R2还不是2NF,重复上述过程,一直到每一个关系模式都是2NF为止。

看上去有点绕,其实很简单:

  1. 确定模式R的主键W(此处为学号,课程名
  2. 看主键X的真子集是否存在FD(函数依赖)X->Z,其中X是W的真子集,Z是非主属性。如果存在函数依赖X–>Z,则模式R可以进行分解;否则就不能分解,结束
  3. RI就为(X,Z)
  4. R2为(U-Z)
  5. 继续对R1和R2重复上述步骤

给定(学号,姓名,系名,系主任,课程名,分数)为例,进行模式分解:
U=(学号,姓名,系名,系主任,课程名,分数)

  1. 确定主键X=(学号,课程名)
  2. 确定存在依赖,学号->(姓名,系名,系主任),即X=学号,Z=(姓名,系名,系主任)
  3. R1(学号,姓名,系名,系主任),即XZ=(学号,姓名,系名,系主任)
  4. R2(学号,课程名,分数),即Y=U-Z=(学号,课程名,分数)
  5. 再次判断是否有局部依赖

分解后得到2NF:
R1(学号,姓名,系名,系主任)
R2(学号,课程名,分数)

二、2NF与3NF转换

方法定义:

设关系模式R(U),主键是W,R上还存在FD X—>Z,并且Z是非主属性,Z∉X,X不是候选键,这样W—>Z就是一个传递依赖。此时应把R分解成两个模式:
R1(XZ),主键是X
R2(Y),其中Y=U-Z,主键仍是W,外键是X(参照R1)。
利用外键和主键匹配机制,可以得到R
如果R1和R2还不是3NF,重复上述过程,一直到每一个关系模式都是3NF为止。

对上面分解后的2NF进行分解
R1(学号,姓名,系名,系主任)
R2(学号,课程名,分数)
模式分解:
1.先判断R1,主键是学号,即W=学号;
2.存在传递依赖,学号—>系名—>系主任,即X=系名,Z=系主任;如不存在依赖则结束
3.得到R11(系名,系主任),即XZ=(系名,系主任);
4.得到R12(学号,姓名,系名),即Y=U-Z=(学号,姓名,系名);
5.对R2同样进行上述判断;
6.对分解后模式重复上述步骤

分解后得到3NF:
R11(系名,系主任)
R12(学号,姓名,系名)
R2(学号,课程名,分数)

你可能感兴趣的:(mysql)