第一范式(1NF) (必须有主键,列不可分) 数据库表中的任何字段都是单一属性的,不可再分 create table aa(id int,NameAge varchar(100)) 第二范式(2NF) 数据库表中非关键字段对任一候选关键字段的 都 不存在部分函数依赖 (当一个表是复合主键时,非主键的字段不依赖于部分主键(即必须依赖于全部的主键字段)) create table sci( sno int(32),cno int(32),grade int(32),credit int(32), primary key sno,cno ) 课程(cno)1---1学分(credit) 学生(sno)n---n课程(cno) 学生+课程--->分数(grade) sci sno cno grade credit 1 1 60 80 2 1 90 80 3 1 70 80 . . . . . . . . . . . . 如此以来,学分被大量重复存储,数据冗余 如要某课程学分,则要大量重复操作 如要加新课程,由于sno和cno共同做为主键,则在加入新课程时,必须有人选该课 如某学生某课程结业,则该学生其它课程信息也同时被删除了 总之 这种设计不太好吧,非关键字属性credit仅函数依赖于cno,也就是credit部分依赖组合关键字(sno,cno)而不是完全依赖 解决 分成两个关系模式 sc1(sno,cno,grade),c2(cno,credit)。新关系包括两个关系模式,它们之间通过sc1中的外关键字cno相联系,需要时再进行自然联接,恢复了原来的关系 第三范式(3NF) 关系模式R(U,F)中的所有非主属性对任何候选关键字都不存在传递依赖 例----S1(SNO,SNAME,DNO, DNAME, LOCATION) 学号 姓名 所在系 系名称 系地址 鲍依斯-科得范式(BCNF) 在3NF的基础上,库表中任何字段对任一候选关键字段的传递函数依赖都不存在 仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且管理员1---1仓库;仓库1---n物品。这个数据库表中存在如下决定关系: 解决: 把仓库管理关系表分解为二个关系表: |