数据库的几个范式

1. 1NF

   实体的属性是不可再分的数据项。

2. 2NF

   满足1NF且每一个非主属性完全依赖于码。

   比如说:
 
   学生(学号,所在系, 住址,课程号,成绩),约定为每个系的学生住同一个地方。

   这里码为(学号, 课程号),函数依赖有:
  
   (学号, 课程号) --> 成绩 【完全依赖】
   (学号) --> 所在系, (学号, 课程号) --> 所在系 【部分依赖】
   (学号) --> 住址,   (学号, 课程号) --> 住址   【部分依赖】

   这个关系部属于2NF,就会产生以下几个问题:
   (1) 插入异常。假如插入一个学生:学号=001, 所在系="计算机, 住址="成都",但该学生还没选课,
即这个学生没有课程号,所以无法插入数据库。因为码值是(学号,课程号),课程号为空,所以学生
固有信息无法插入。

   (2) 删除异常。如果删除一门课程,学生的固有信息也被删除了,造成删除异常。

   (3) 修改复杂。 如果学生从计算机系转入到数学系,则除了修改所在系信息,还要修改住处。因为
对该关系来说,学生转系时住处也会相应改变。另外,如果学生选修了k门课程,则该学生系和
住址重复存储了k次,造成修改的复杂化。

   所以,该关系要重新拆分,拆分如下:
   (学号,课程号,成绩)
   (学号,所在系,住址)

3. 3NF

   满足2NF且每一个非主属性既不部门依赖于码也不传递依赖于码。
  
   比如:在(学号,所在系,住址)关系中:
   学号->所在系
   学号->住址
   所在系->住址 (因为约定每个系的学生住同一个地方)

   所以该关系有传递依赖。所以要重新拆分:
   (学号,所在系)
   (所在系,住址)

4. BCNF
  
  满足3NF且每一个决定因素都包含码。有三层意思
  (1) 所有的非主属性对每一个码都是完全函数依赖。
  (2) 所有的主属性对每一个不包含它的码,也是完全函数依赖。
  (3) 没有任何属性会完全依赖于非码的任何一组属性。

  比如:
  S(学号,姓名,所在系,年龄)
  假定姓名也具有唯一性,那么S就有两个码,这两个码由单个属性组成,彼此不相交。其他属性不存在对码的部分依赖于传递依赖,
所以属于3NF,同时,S中除学号外,姓名并没有其他决定因素,所以S也属于BCNF。

  在比如:
  C(课程号,课程名称,课时)
  C只有一个码,且课程号是唯一的决定因素,没有任何属性对课程号部分依赖或传递依赖,所以C属于BCNF。
  


  

  
 
  

你可能感兴趣的:(C++,c,C#)