三个范式的定义与理解
考虑这样一个表:【联系人】(姓名,性别,电话)
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 1NF。要符合 1NF 我们只需把列(电话)拆分,即:【联系人】(姓名,性别,家庭电话,公司电话)。1NF 很好辨别,但是 2NF 和 3NF 就容易搞混淆。
◆ 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
考虑一个订单明细表:【OrderDetail】(OrderID,ProductID,UnitPrice,Discount,Quantity,ProductName)。
因为我们知道在一个订单中可以订购多种产品,所以单单一个 OrderID 是不足以成为主键的,主键应该是(OrderID,ProductID)。显而易见 Discount(折扣),Quantity(数量)完全依赖(取决)于主键(OderID,ProductID),而 UnitPrice,ProductName 只依赖于 ProductID。所以 OrderDetail 表不符合 2NF。不符合 2NF 的设计容易产生冗余数据。
可以把【OrderDetail】表拆分为【OrderDetail】(OrderID,ProductID,Discount,Quantity)和【Product】(ProductID,UnitPrice,ProductName)来消除原订单表中UnitPrice,ProductName多次重复的情况。
◆ 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。
考虑一个订单表【Order】(OrderID,OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity)主键是(OrderID)。
其中 OrderDate,CustomerID,CustomerName,CustomerAddr,CustomerCity 等非主键列都完全依赖于主键(OrderID),所以符合 2NF。不过问题是 CustomerName,CustomerAddr,CustomerCity 直接依赖的是 CustomerID(非主键列),而不是直接依赖于主键,它是通过传递才依赖于主键,所以不符合 3NF。
通过拆分【Order】为【Order】(OrderID,OrderDate,CustomerID)和【Customer】(CustomerID,CustomerName,CustomerAddr,CustomerCity)从而达到 3NF。
第二范式(2NF)和第三范式(3NF)的概念很容易混淆,区分它们的关键点在于,2NF:非主键列是否完全依赖于主键,还是依赖于主键的一部分;3NF:非主键列是直接依赖于主键,还是直接依赖于非主键列。
转载于:https://blog.51cto.com/wujeangwei/228549
三个范式的定义与理解相关推荐
- 数据库三范式通俗理解 -数据库三范式官方定义
数据库三范式 官方定义 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分. 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖 第三范式(3NF):在第二范式的 ...
- mysql三大范式 答案_数据库三大范式定义与理解
数据库三大范式定义与理解 发布时间:2018-06-04 10:24, 浏览次数:291 一.第一范式(1NF) 要求: 要求:每一个分量必须是不可分的数据项. 特点: 1)有主键,且主键不能为空. ...
- 【数据库】期末复习:SQL语句、关系代数的运算、范式的定义和判断、求最小函数依赖集、ER图转关系模式
文章目录 SQL语句 查询select 其他 视图 关系代数的运算 并.差.笛卡尔积.投影和选择 连接 自然连接 笛卡尔积 详细版(如果完全不了解就看这里) 范式的定义和判断 如何求候选码 一些例题 ...
- 群、环、域的概念,定义和理解.
群.环.域的概念,定义和理解. 以下链接很好的解释了群环域的概念. http://sparkandshine.net/algebraic-structure-primer-group-ring-fie ...
- 轻量级模型设计与部署总结(关键字定义/架构理解/高效CNN)
点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[模型部署]技术交流群 后台回复[模型部署工程]获取基于TensorRT的分类.检测任务 ...
- 数据库|第一范式、第二范式、第三范式、BC范式、第四范式简单理解
数据库|第一范式.第二范式.第三范式.BC范式.第四范式简单理解 在设计数据库的时候,虽说将我们要的数据正确完整导入数据库是很关键的,但是对于数据库的设计者来说,如何将大量数据合理有效正确地导入数据库 ...
- 关于机器学习的定义的理解
对机器学习定义的理解 Tom M.Mitcjell provided a widely quoted, more formal definition: "A computer progra ...
- Math.ceil(),Math.floor()与Math.round()三个函数的定义。
为什么80%的码农都做不了架构师?>>> JavaScript: The Definitive Guide, 4th Edition中对Math.ceil(),Math.flo ...
- static的三种用法,定义静态变量,静态函数,静态代码块!
static的三种用法,定义静态变量,静态函数,静态代码块! 1.定义静态变量 class PersonStatic { //静态变量的特点 //1.静态变量无需生成对象就可被调用,可以使用类名和对象 ...
最新文章
- iOS开发异常错误总结之——wait_fences: failed to receive reply: 10004003
- wxWidgets:wxBrush类用法
- html整个项目怎么导出来,怎样将jquery导入web项目中?
- CVPR 2019 | 西北工业大学开源拥挤人群数据集生成工具,大幅提升算法精度
- vmware esxi 4.0 上安装postfix,mailx发送邮件
- 大数据之Zookeeper
- 荣耀手机安装谷歌框架_华为荣耀9青春版安装谷歌框架 无需Root 华为荣耀手机安装谷歌框架...
- mp4视频解码生成图片
- uniapp使用uCharts区域图
- PartnerLink,PartnerLinkType详解
- redis 基本原理及安装
- Django相关操作(连续跳转和登录注册为例)
- 【C++代码】区间重叠问题
- 如何购买ssl证书?
- 2020.7.25T1挑竹签(jz暑假训练day10)
- ECharts-Javascript的图表库推荐
- Python中‘r‘,‘r+‘,‘w‘,‘w+‘,‘a‘,‘a+‘区别总结
- 微信企业号开发之地理位置获取
- MAC版Lightroom Classic 2022(Lrc2022)v11.5已发布,支持M1/M2和Intel三种系统,解决无法成功安装等问题
- 超短线地挂单买卖技巧