• mysql -数据库设计三范式


    数据库设计三范式

    一、概念:

    如何设计数据库

    二、内容:

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

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

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

    面试常用

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

    三、第一范式

    最核心,最重要的范式,所有表的设计都需要满足

    必须有主键,并且没一个字段都是原子性不可以再分

    如:

    未处理A表
    学生编号 学生姓名 联系方式
    1001 张三 zs@gmail.com,1355
    1002 李四 ls@gmail.com,1234
    1001 王五 ww@gmail.com,1475
    • 缺少主键 ,字段可分离

    遵循第一范式进行修改,添加主键,分离联系方式

    学生编号(primary key) 学生姓名 邮箱 联系电话
    1001 张三 zs@gmail.com 1355
    1002 李四 ls@gmail.com 1234
    1003 王五 ww@gmail.com 1475

    四、第二范式

    建立在第一范式的基础上,要求主键字段必须完全依赖主键,不要产生部分依赖

    多对多组合

    学生编号 学生姓名 教师编号 教师姓名
    1001 张三 001 王老师
    1002 李四 002 赵老师
    1003 王五 001 王老师
    1001 张三 002 赵老师
    • 不满足第一范式:缺乏主键
    • 典型的多对多的关系

    修改后,使得学生编号与教师编号联合做主键,符合主键(primary key:学生编号+教师编号)满足第一范式

    但是张三依赖1001,老师依赖001,存在部分依赖,导致数据冗余,空间冗余

    (如:张三、王老师、赵老师分别重复出现)

    学生编号 教师编号 学生姓名 教师姓名
    1001 001 张三 王老师
    1002 002 李四 赵老师
    1003 001 王五 王老师
    1001 002 张三 赵老师

    为了让上表满足第二范式,需要设计学生表、教师表、学生教师关系表

    学生表
    学生编号(primary key) 学生姓名
    1001 张三
    1002 李四
    1003 王五
    教师表
    教师编号(primary key) 教师姓名
    001 王老师
    002 赵老师
    学生教师关系表
    id 学生编号 教师编号
    1 1001 001
    2 1001 002
    3 1002 002
    4 1003 001

    总结:

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

    五、第三范式

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

    一对多

    学生编号(primary key) 学生姓名 班级编号 班级名称
    1001 张三 01 一年级一班
    1002 李四 02 一年级二班
    1003 王五 03 一年级三班
    1004 赵六 03 一年级三班
    • 满足第一范式
    • 满足第二范式:主键不是复合主键,没有产生部分依赖,主键是单一主键
    • 不满足第三范式:
      • 一年级一班依赖班级编号01,01又依赖学生编号1001,产生了传递依赖
      • 产生了相应的数据冗余

    拆分为学生表、班级表

    学生编号(primary key) 学生姓名 班级编号
    1001 张三 01
    1002 李四 02
    1003 王五 03
    1004 赵六 03
    班级表 班级名称
    01 一年级一班
    02 一年级二班
    03 一年级三班

    总结:

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

    六、总结表的设计:

    一对多:

    ​ 一对多,两张表,多的表加外键!!!!!

    多对多:

    ​ 多对多,三张表,关系表两个外键!!!

    一对一:

    ​ 一对一,外键唯一

    ​ 数据庞大拆成两张表

    一对一拆分的补充:

    未拆分时的一张表
    id login_name login_pwd real_name email addresss
    1 zhangsan 123 张三 zhansgan@xxxx 上海
    2 lisi 123 李四 lisi@xxx 江苏
    3 zhaoliu 123 赵六 zhaoliu@xxx 山东

    通过fk+unique 可以参看F外键

    登录信息表
    id login _name login_Pwd
    1 zhangsan 123
    2 lisi 123

    七、综述

    数据库设计三范式是理论上的

    实践和理论有的时候有偏差

    最终目的都是为了满足客户的需求,有的时候会拿冗余换执行速度

    由于在sql 当中,表和表之间连接次数越多,效率越低(笛卡尔积)

    有时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的,并且对开发人员来说,sql语句的编写难度也会降低

  • 相关阅读:
    优先队列总结
    CodeForces 567D One-Dimensional Battle Ships
    CodeForces 567D One-Dimensional Battle Ships
    codeforces 1016B. Segment Occurrences
    codeforces 1016B. Segment Occurrences
    poj3249(求最长路)
    poj3249(求最长路)
    poj 2186
    2017年第八蓝桥杯C/C++ A组国赛 —— 第二题:生命游戏
    Fence Repair POJ
  • 原文地址:https://www.cnblogs.com/yescarf/p/14110059.html
Copyright © 2020-2023  润新知