数据库设计三范式

    科技2022-07-13  146

    1、数据库设计三范式,设计数据库表的时候所依据的规范,共三范式

    第一范式:要求有主键,并且要求每一个字段原子性不可再分

    第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。 下面的示例就不符合第一范式。

    学习编号学习姓名联系方式1001张三13888888888,zhangsan@163.com1002李四13666666666 ,lisi@163.com1001王五13999999999,wangwu@163.com

    1、存在的问题,最后一条记录和第一条记录重复(不唯一、没有主键) 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六六03

    1、班级信息表

    班级编号(pk)班级名称01一年一班02一年二班02一年三班

    以上的设计是一种典型的一对多(分两张表存储)设计,存储在一张表中,多存储在一张表中,在多的那张表中添加外键,这个字段引用一的一方中的主键字段。

    2、几个比较典型的设计:

    一对一:1、分两张表存储,共享主键。2、分两张表存储,外键唯一

    一对多:(分两张表存储)在多的那张表中添加外键,这个字段引用一的一方中的主键字段。

    多对多:分三张表存储,在学生表中存储学生信息,在课程表中存储课程信息,在学生选课表中存储学生和课程的关系信息

    3、实际开发中是怎么样的?

    数据库设计尽量遵循三范式但是还是要根据实际情况进行取舍有时候可能会拿冗余换速度最终目的要满足客户要求
    Processed: 0.010, SQL: 8