当前位置: 首页 > news >正文

【编程基础知识】数据库表设计三范式

关系型数据库中三范式(Normal Form)指的是表设计时遵循的三种规范化理论,旨在减少表数据的冗余及提高数据的完整性。

一、部分依赖、完全依赖、传递依赖

掌握三范式之前,需要首先弄明白描述表属性之间依赖关系的三个名词:部分依赖、完全依赖、传递依赖。
1、部分依赖:当一个非主属性部分依赖于联合主键的一个部分时,我们说它具有部分依赖。这意味着非主属性只依赖于联合主键中的一个属性,而不是整个联合主键。
2、完全依赖:当一个非主属性(即不是主键的属性)完全依赖于主键时,我们说它具有完全依赖。这意味着改变主键的值会导致非主属性的值发生改变。
3、传递依赖:当一个非主属性依赖于另一个非主属性。这种依赖不是直接依赖于主键,而是通过一个或多个中间非主属性的依赖关系。

二、第一范式

1NF:第一范式,表的每一列都具有原子性,不可再细分;
【反例】:订单表【订单id|地址(省市县乡镇街道小区单元房号)】 订单id为主键
【原因】:地址列可以细分
【优化】:将地址拆分为不可再分的更细粒度的多个列
【正例】:订单表【订单id|省|市|县|乡镇|街道|小区|单元号|房号】

三、第二范式

2NF:第二范式,在满足第一范式的基础上,非主键列必须完全依赖联合主键,即不存在部份依赖;
【反例】:订单表【订单id|商品id|商品名称】订单id+商品id为联合主键
【原因】:满足第一范式(列不可再分),不满足第二范式,因为商品名称列不是完全依赖主键列(订单id+商品id),而是部分依赖于商品id
【优化】:拆分为两张表:订单表和商品表,两张表之间通过商品id关联商品名称
【正例】:订单表【订单id|商品id】
商品表【商品id|商品名称】

四、第三范式

3NF:第三范式,在满足第二范式的基础上,非主属性直接依赖于主键,而非通过其他非主属性间接依赖于主键列,即非主键列之间不存在相互依赖,不存在传递依赖。
【反例】:订单表【订单id|商品id|商品名称】订单id为主键
【原因】:满足第一范式(列不可再分) 满足第二范式(非主属性均完全依赖于联合主键列,但此表无联合主键,故肯定满足),但不满足第三范式,因为商品名称依赖于商品id,商品id依赖于主键列订单id,商品名称通过商品id间接依赖于主键列,存在传递依赖
【优化】 1:拆分为两张表:订单表和商品表,两张表之间通过商品id关联商品名称
【正例】:订单表【订单id|商品id】
商品表【商品id|商品名称】

五、总结

遵循三范式有助于设计出结构良好,数据冗余少的关系型数据库。然而,在实际应用中,为了性能或其他考虑,有时会有意违反这些范式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Open3D(C++) 点云中的植被信息提取
  • 【四范式】浅谈NLP发展的四个范式
  • Java 21的Logging的笔记
  • 79.Options Object 模式
  • Knife4j:打造优雅的SpringBoot API文档
  • NAS远程下载,Docker部署qBittorrent、Transmission、贝锐花生壳
  • matlab处理函数2
  • 多维时序 | Matlab基于TCN-Transformer+LSTM双输入神经网络时间序列预测
  • 大模型——LLaVA和LLaMA的介绍和区别
  • element实现动态路由+面包屑
  • 量化交易backtrader实践(一)_数据获取篇(4)_通达信数据应用
  • 【吉利汽车安全应急响应中心-登录/注册安全分析报告-无验证方式导致安全隐患】
  • 探索端智能,加速大模型应用,火山引擎边缘智能 x 扣子技术沙龙等你来
  • MYSQL数据库——InnoDB存储引擎
  • Typescript 的类型断言
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 30天自制操作系统-2
  • Akka系列(七):Actor持久化之Akka persistence
  • HTTP那些事
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript服务器推送技术之 WebSocket
  • nfs客户端进程变D,延伸linux的lock
  • php的插入排序,通过双层for循环
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 读懂package.json -- 依赖管理
  • 坑!为什么View.startAnimation不起作用?
  • 你不可错过的前端面试题(一)
  • 前端面试总结(at, md)
  • 区块链技术特点之去中心化特性
  • 手机端车牌号码键盘的vue组件
  • -- 数据结构 顺序表 --Java
  • 用Visual Studio开发以太坊智能合约
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • $refs 、$nextTic、动态组件、name的使用
  • (33)STM32——485实验笔记
  • (9)目标检测_SSD的原理
  • (C#)一个最简单的链表类
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (补充)IDEA项目结构
  • (层次遍历)104. 二叉树的最大深度
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (回溯) LeetCode 77. 组合
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (十) 初识 Docker file
  • (四)React组件、useState、组件样式
  • (译)2019年前端性能优化清单 — 下篇
  • (转载)hibernate缓存