码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 数据库设计三范式


    目录

    数据库设计三范式

    1. 什么是数据库设计范式?

    2. 数据库设计范式共有3个

    3. 第一范式

    以上学生表满足第一范式吗?

    以下学生表则满足第一范式

    4. 第二范式

    4.1 分析以上的表是否满足第一范式?

    4.2 怎么修改则满足第一范式呢?

    4.3 经过修改之后,以上的表满足了第一范式。但是满足第二范式吗?

    4.4 产生部分依赖有什么缺点?

    4.5 为了让以上的表满足第二范式,你需要这样设计

    ​编辑4.6 多对多关系怎么设计?

    5. 第三范式

    5.1 分析以上表是否满足第一范式?

    5.2 分析以上表是否满足第二范式?

    5.3 分析以上表是否满足第三范式?

    5.4 那么应该怎么设计一对多呢?


    数据库设计三范式

    1. 什么是数据库设计范式?

    • 数据库表的设计依据。教你怎么进行数据库表的设计。

    2. 数据库设计范式共有3个

    • 第一范式:要求任何一张表必须要有主键,每一个字段原子性不可再分。
    • 第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部分依赖。
    • 第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。

    声明:三范式是面试官经常问的,所以一定要熟记在心!

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

    3. 第一范式

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

    以上学生表满足第一范式吗?

    • 不满足,第一:没有主键。第二:联系方式可以分为邮箱地址和电话

    以下学生表则满足第一范式

    4. 第二范式

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

    这张表描述了学生和老师的关系:1个学生可能有多个老师,1个老师有多个学生。这是非常典型的:多对多关系!

    4.1 分析以上的表是否满足第一范式?

    • 该表中没有主键,所以不满足第一范式。

    4.2 怎么修改则满足第一范式呢?

    学生编号和教师编号这两个字段联合做主键,复合主键(PK: 学生编号+教师编号)

    4.3 经过修改之后,以上的表满足了第一范式。但是满足第二范式吗?

    • 不满足,“张三”依赖1001,“王老师”依赖001,显然产生了部分依赖。

    4.4 产生部分依赖有什么缺点?

    • 数据冗余了。空间浪费了。“张三”重复了,“王老师”重复了。

    4.5 为了让以上的表满足第二范式,你需要这样设计

    • 使用三张表来表示多对多的关系!!!!

    学生表

    教师表 

    学生教师关系表


    4.6 多对多关系怎么设计?

    • 背口诀:多对多,三张表,关系表两个外键!!!!!!!



    5. 第三范式

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

    •  以上表的设计是描述班级和学生的关系。很显然是1对多关系! 一个班级中有多个学生。

    5.1 分析以上表是否满足第一范式?

    • 满足第一范式,有主键。

    5.2 分析以上表是否满足第二范式?

    • 满足第二范式,因为主键不是复合主键,没有产生部分依赖。主键是单一主键。

    5.3 分析以上表是否满足第三范式?

    • 第三范式要求:不要产生传递依赖!
    • 一年一班依赖01,01依赖1001,产生了传递依赖。
    • 不符合第三范式的要求。产生了数据的冗余。

    5.4 那么应该怎么设计一对多呢?

    班级表:一

    学生表:多 

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

  • 相关阅读:
    Vue3-Ref Reactive toRef toRefs对比学习、标签ref与组件ref
    (※)力扣刷题-栈和队列-用队列实现栈
    Android控件全解手册 - 万字说出EditText的全部
    Java进阶篇--死锁
    vue2.6 和 2.7对可选链的不同支持导致构建失败
    前端页面根据后端返回的文本将换行符(“↵”)进行换行展示
    Java入门7-面向对象基础
    多线程调用外部接口
    关于需求管理之我见
    internship:svn的使用
  • 原文地址:https://blog.csdn.net/weixin_52385232/article/details/126124383
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号