第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。 下面的示例就不符合第一范式。
学习编号学习姓名联系方式1001张三13888888888,zhangsan@163.com1002李四13666666666 ,lisi@163.com1001王五13999999999,wangwu@163.com1、存在的问题,最后一条记录和第一条记录重复(不唯一、没有主键) 2、联系方式字段可以再分、不是原子性的
正确的应该是:
学习编号(pk)学习姓名email联系方式1001张三zhangsan@163.com138888888881002李四lisi@163.com136666666661003王五wangwu@163.com13999999999第一范式,第一行必须唯一、也就是每一个表必须有主键,这是我们数据库设计的最基本要求,主要通常是采用数值型和定长字符串表示,关于列不可以再分,应根据具体情况决定、如联系方式上,为了开发方便可能就采用一个字段了。
第二范式是建立在第一范式的基础上的,另外要求所有非主键字段完全依赖主键,不能产生部分依赖 下面示例:
学习编号学习姓名教师编号教师姓名1001张三001王老师1002李四 002陈老师1003王五001王老师1001王五002陈老师确定示例:
学习编号(pk)教师编号(pk)学习姓名教师姓名1001001张三王老师1002002李四陈老师1003001王五王老师1001002王五陈老师以上虽然确定了主键,但此表会出现大量的冗余字段为"学生姓名"和“教师姓名”,出现冗余的原因在于,学生姓名部分依赖了主键一个字段学生编号,而且没有依赖教师编号,而教师姓名依赖了主键的一个字段教师编号,这就是第二范式部分依赖。 解决方案: 1、学生信息表:
学习编号(pk)学习姓名1001张三1002李四1003王五2、教师信息表:
教师编号(pk)教师姓名001王老师002陈老师3、学生和教师关系表:
学生编号(pk) fk=>学生表的学生编号教师编号(pk) fk=>教师表的教师编号1001001100200210030011001002如果一个表是单一主键,那么它就是复合第二范式,部分依赖和主键的关系
以上是一种典型的 多对多,(分三张表存储)的设计,
建立在第二范式的基础上的,非主键字段不能传递依赖于主键字段(不要产生传递依赖)
学习编号(pk)学习姓名班级编号班级名称1001张三01一年一班1002李四02一年二班1003王五03一年三班1004六六03一年三班从上面的表中可以看出,班级姓名字段存在冗余,国为班级名称字段直接依赖于主键,班级名称字段依赖于班级编号,班级编号依赖于学生编号,那么这就是传递依赖。
解决方案就是冗余字段单独拿出来建立表如
1、学生信息表
学习编号(pk)学习姓名班级编号(FK)1001张三011002李四021003王五031004六六031、班级信息表
班级编号(pk)班级名称01一年一班02一年二班02一年三班以上的设计是一种典型的一对多(分两张表存储)设计,存储在一张表中,多存储在一张表中,在多的那张表中添加外键,这个字段引用一的一方中的主键字段。