当前位置 博文首页 > Jqcode:数据库设计规范之三大范式

    Jqcode:数据库设计规范之三大范式

    作者:[db:作者] 时间:2021-09-16 10:34

    文章主要划分为两部分,第一部分官方难懂篇,第二部分白话易懂篇。

    数据库范式有6种,第一范式(1NF),第二范式(2NF),第三范式(3NF),巴斯-科德范式(BCNF),第四范式(4NF),第五范式(5NF,也称为完美范式)。

    本文只介绍前3大范式,因为数据库一般满足3大范式就可以了。

    什么是数据库范式?

    以设计符合业务需求、高性能的程序为出发点的思想对数据库设计的一种规范称为数据库范式,遵从数据库范式能设计出逻辑清晰且弹性较好的程序系统。

    三大范式的定义

    1NF:符合1NF的关系中每个属性不可再分

    2NF:在1NF的基础上消除了非主属性对码的部分函数依赖

    3NF:在2NF的基础上消除了非主属性对码的传递函数依赖

    三大范式的理解

    1NF:属性不可再细分为更小粒度的字段,有相似或者相近含义的字段可以合并为一个字段。

    假设有这样一个业务场景,我需要一批用户的基础信息(包括姓名,年龄,电话,详细地址等,并按地址分类用户)

    表A:

    表B:

    对比A、B两张表,很明显A表不足以满足业务需求,正确的表结构应该是表B。

    2NF:一行数据应该只与一列相关,不应该存在冗余的数据。

    假设有这样的业务场景,记录客户下单的酒店信息。

    这里用一张表就来存储,可以见到每一行的数据都是对于“张”这个用户来言的,这个name列值就非常冗余,我们可以根据2NF重新设计三张表来维护数据关系。(一张表用来存放用户信息,一张表用来存放酒店房间信息,第三张表用来关联用户与酒店房间信息)

    3NF:非主属性间不应该存在传递关系

    假如我设计了如下这张表

    这是张学生信息表,school代表学校名称,school_tel代表学校电话,但是从场景中分析可知,school_tel与school之间存在着传递关系,而且school_tel与id没有依赖关系,所以表结构设计不合理,正确的做法应该是设计3张表,另外一张存放学校信息,还有一张表用来关联学生与学校的关系。

    三大范式只是对设计数据库的建议,并不一定要完全遵循,主要还是要依赖于业务需求,良好的数据库结构不仅可以降低开发人员的工作量和难度也可以增加程序的弹性,为后面的维护打下基础。

    cs
    下一篇:没有了