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


    数据库的三范式及BC范式

    • 依赖
    • 三范式
      • 第一范式(1NF):唯一性,数据列不可再分割
      • 第二范式(2NF):唯一性,消除非主键元素/列对组合主键中部分元素/列的依赖
      • 第三范式(3NF):独立性,消除传递依赖即是非主键元素/列不能依赖其他非主键元素/列
      • 三个范式一句话总结
    • BC范式(BCNF):在关系模式中每一个决定因素都包含候选键,也就是说,只要属性或属性组A能够决定任何一个属性B,则A的子集中必须有候选键(或者说A必须为超键)。

    依赖

    如果一个值/元素A,可以确定另一个值/元素B,则称B依赖于A。例:

    函数 y =  x²
    
    • 1

    就有,y依赖于x。

    同理,在数据库表中: 如果表中一个字段/元素Column1能够确定另一个字段/元素Column2,那么就可称 Column2依赖于Column1。

    三范式

    第一范式(1NF):唯一性,数据列不可再分割

    错误示范:

    教师备注
    张三,高级职称
    这里的教师列,不但存储了姓名,还存储了职称,违反了第一范式的原子性。

    正确示范:

    教师职称备注
    张三,高级

    第二范式(2NF):唯一性,消除非主键元素/列对组合主键中部分元素/列的依赖

    • 所有的非主键元素/列都会依赖于主键(这是主键的定义)
    • 如果主键不是组合形式,只是单个元素/列的话,则不会存在违反第二范式。

    错误示例

    学号课程号课程名得分
    SN001CN_a毛选80
    SN001CN_b邓理85
    SN002CN_c江三90

    上表中联合主键为: 学号 + 课程号
    但是,非主键元素/列 课程名依赖于组合主键中的 课程号, 所以违反了第二范式。

    正确示例
    拆成两张表, 将课程单独设计为一张表

    学号课程号得分
    SN001CN_a80
    SN001CN_b85
    SN002CN_a90
    课程号课程名
    CN_a毛选
    CN_b邓理
    CN_c江三

    第三范式(3NF):独立性,消除传递依赖即是非主键元素/列不能依赖其他非主键元素/列

    错误示例

    学号班级班级人数
    SN0011班80
    SN0012班85
    SN0023班90

    上表中, 主键为 学号。非主键列班级人数依赖了班级列,违反了第三范式。

    正确示例:
    将班级单独设计为一个表

    班级人数
    1班80
    2班85
    3班90
    学号班级
    SN0011班
    SN0022班
    SN0033班

    三个范式一句话总结

    每个列都不能再拆分,非主键列只能依赖于主键。

    注:当主键为组合主键时,非主键列必须依赖整个组合主键,而不是组合主键中的某一列,否则就违反了第二范式。

    BC范式(BCNF):在关系模式中每一个决定因素都包含候选键,也就是说,只要属性或属性组A能够决定任何一个属性B,则A的子集中必须有候选键(或者说A必须为超键)。

    要满足BC范式,需要先满足第三范式。

    解释:

    属性A决定(确定)属性B,
    即是 A ----> B , 表示 B依赖于A
    那么, A(或A的子集)一定要有候选关键字

    错误示例:

    学号课题课题编号课题学分
    CN001课题1CN_a5.0
    CN001课题1CN_a5.0
    CN002课题2CN_b4.0
    CN002课题2CN_b4.0

    如上表,将 学号 + 课题 设计为组合主键
    由于课题编号可以确定课程,所以要满足BC范式,那么课程编号必须为候选关键字,由表可知课程编号并不是候选关键字,所以违反了 BC范式。

    正确示例

    学号课程编号课程学分
    CN001CN_a5.0
    CN001CN_a5.0
    CN002CN_b4.0
    CN002CN_b4.0
    课程编号课程
    CN_a课题1
    CN_b课题2

    一般原则:

    • 通过增加列或者表来满足更多/更高级别的范式
    • 要满足更高的范式得保证满足了前面低级别的范式
    • 遵循三范式有利于减少数据冗余、消除插入异常、更新异常、删除异常
    • 实际设计时,有时适当的冗余也是允许的(其他方面综合权衡考虑,如效率等)

    参考:https://blog.csdn.net/A_art_xiang/article/details/113880638

  • 相关阅读:
    【图解 HTTP】 Web及网络基础
    从积木式到装配式云原生安全
    SpringCloud微服之Nacos的学习
    探索ABP基础架构
    基于攻防博弈的网络防御决策方法研究综述
    基于ubuntu20.04安装ros系统搭配使用工业相机
    读阿里P8大佬15W字的Spring文档,面试犹如开了挂,成了Offer收割机
    【项目测试报告】博客系统 + 在线聊天室
    Java Process:另一个程序正在使用此文件,进程无法访问
    Java利用AOP切面编程实现数据分页
  • 原文地址:https://blog.csdn.net/qq_29025955/article/details/126301315
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号