数据库表设计三范式

1、数据库表设计范式:就是数据库表的设计依据,教你怎么进行数据库表的设计。

2、数据库表设计三范式:

       第一范式:要求任何一张表必须有主键,每个字段原子性不可再分。

       第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。

       第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。

        设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。

3、第一范式:

       最核心、最重要的范式,所有表的设计都需要满足,必须有主键,并且每一个字段都是原子性不可再分。

        举例:

        学生编号        姓名                  联系方式

        ----------------------------------------------------------------

        1001              张三      [email protected],1359999****

        1002              李四       [email protected],1348888****

        1001               王五      [email protected],1337777****

        以上学生表满足第一范式吗?不满足: 第一没有主键,第二联系方式应该分为邮箱和电话,具体如下:

        学生编号(PK)      姓名      邮箱地址               电话

        ---------------------------------------------------------------------------     

               1001                 张三      [email protected]     1359999****

               1002                 李四      [email protected]      1348888****

               1003                 王五      [email protected]    1337777****

4、第二范式:建立在第一范式基础之上,要求所有非主键字段必须完全依赖主键,不要产生部分依赖。

       下面这张表描述了学生和老师的关系(典型的多对多的关系)

        学生编号    学生姓名     教师编号      教师姓名

        ---------------------------------------------------------------

          1001            张三            001          王老师

          1002            李四            002          赵老师

          1003            王五            001          王老师

          1001            张三            002          赵老师

        分析上面的表是否满足第一范式?(不满足    需要进行如下修改)

        学生编号+教师编号(PK)    学生姓名           教师姓名

        ------------------------------------------------------------------------

                 1001001                      张三              王老师

                 1002002                      李四              赵老师

                 1003001                      王五              王老师

                 1001002                      张三              赵老师

        经过修改(学生编号和教师编号两个字段联合做主键,也就是复合主键)满足了第一范式,但是满足第二范式吗?(回答:不满足,因为张三依赖1001,王老师依赖001,显然产生了部分依赖,产生部分依赖的缺点是:数据冗余,空间浪费。张三重复了,王老师也重复了)

        为了满足第二范式,需要设计三张表来表示多对多的关系

        学生表

        学生编号(PK)       学生姓名

        --------------------------------------

            1001                   张三

            1002                  李四

            1003                  王五

   教师表

   教师编号(PK)     教师姓名

  ------------------------------------

            001             王老师

            002             赵老师

   学生和教师关系表

   id(PK)    学生编号(FK)       教师编号(FK)

   ----------------------------------------------------

          1          1001                   001

          2          1002                   002

          3          1003                   001

          4          1001                   002

        口诀:多对多,三张表,关系表两外键

5、第三范式:建立在第二范式基础之上,要求所有非主键字段必须直接依赖主键,不要产生传递依赖

        学生编号(PK)    学生姓名     班级编号      班级名称

       ------------------------------------------------------------------------

             1001               张三                01          一年一班

             1002               李四                02          一年二班

             1003               王五                03          一年三班

             1004               赵六                03          一年三班

       上表是描述班级和学生的关系,显然是一对多的关系!一个教室有多个学生。

       分析上表是否满足第一范式 (回答:满足第一范式,有主键)

       分析上表是否满足第二范式 (回答:满足第二范式,没有产生部分依赖,主键是单一主键)

       分析上表是否满足第三范式 (回答:不满足第三范式,一年一班依赖01,01依赖1001,产生了传递依赖出现了数据的冗余。)

       修改对上表的设计(拆分成两张表)

       班级表

       班级编号(PK)    班级名称

       -----------------------------------

             01               一年一班

             02               一年二班

             03               一年三班      

       学生表

       学生编号(PK)    学生姓名     班级编号(FK)

       ---------------------------------------------------------

           1001                张三                01

           1002                李四                02

           1003                王五                03

           1004                 赵六               03

       口诀:一对多,两张表,多的表加外键

     6、总结表的设计:

        一对多:两张表,多的表加外键

        多对多:三张表,关系表两外键

        一对一:如果一张表字段太多,可以分成两张表,主键共享(两张表的主键一样)或外键唯一(也就是外键加unique约束)

     【大总结】:数据库表设计三范式是理论上的,实践与理论有时有偏差,以满足客户需求为主,有时会拿冗余换取执行速度,也是合理的。在sql当中,表与表之间连接次数越多,效率越低(笛卡尔积),对于开发者来说SQL语句的编写难度也会增加。

你可能感兴趣的:(学习笔记,MySQL,数据库,java,sql)