第一范式、第二范式、第三范式[通俗易懂]

第一范式、第二范式、第三范式[通俗易懂]范式:英文名称是NormalForm,它是英国人E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中

大家好,又见面了,我是你们的朋友全栈君。

范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出关系数据库模型后总结出来的,范式是关系数据库理论的基础,也是我们在设计数据库结构过程中所要遵循的规则和指导方法。目前有迹可寻的共有8种范式,依次是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,6NF。通常所用到的只是前三个范式,即:第一范式(1NF),第二范式(2NF),第三范式(3NF)。下面就简单介绍下这三个范式。
◆ 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 
考虑这样一个表:【联系人】(姓名,性别,电话) 
如果在实际场景中,一个联系人有家庭电话和公司电话,那么这种表结构设计就没有达到 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://javaforall.net/155296.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 汇编语言中各种移位指令的区别与联系

    汇编语言中各种移位指令的区别与联系本文转载自:https://blog.csdn.net/richerg85/article/details/27558005SHL、SHR、SAL、SAR:移位指令;SHL(ShiftLeft):   逻辑左移;SHR(ShiftRight):   逻辑右移;SAL(ShiftArithmeticLeft):算术左移;SAR(Shift…

    2022年6月9日
    22
  • 分布式缓存之memcached–命令测试

    1.启动Memcache常用参数2.基本命令五种基本memcached命令执行最简单的操作。这些命令和操作包括:前三个命令是用于操作存储在memcached中的键值对的标准修改命令。

    2021年12月28日
    35
  • linux 配置java变量_linux部署java环境

    linux 配置java变量_linux部署java环境很多Java项目发布到环境,需要配置java全局变量这样可以很省心。配置java全局变量非常简单只需要三步。第一步,上传Jdk包并且解压jdk包。并且确定jdk的地址,进入到jdk包中执行pwd会初心jdk的地址第二步:在etc下执行viprofile。这样需要在最下面配置如下内容:exportJAVA_HOME=jdk的主目录路径exportP

    2022年8月21日
    11
  • 课程设计—飞机订票系统

    课程设计—飞机订票系统1. 题目 本课程设计的题目为:飞机订票系统。2. 项目描述 基于目前人们外出远行频繁,为方便乘客提前买票及优化飞机航空订票服务,需要开发一个飞机订票系统,此程序就是要实现航班情况的录入,查询,订票,退票以及航班的查询和修改等基本功能。 3. 数据及其逻辑结构分析 (1)航班的信息:航班的情况存储结构采用单链表,每个元素表示一个航班的情况,包括航班号、起飞时间、降落时间、起

    2022年6月15日
    26
  • ieda激活不成功解决方法

    idea激活失效方法,idea激活码,IDEA激活码,idea序列号

    2022年3月13日
    115
  • vue基础教程总结篇,用最短的时间入门vue.js(持续更新…)

    vue基础教程总结篇,用最短的时间入门vue.js(持续更新…)目前,vue已经成为前端工程师必会的框架之一,这里简单总结一下,可以让您快速的入门vue,师傅带进门,修行靠个人,最主要的还是自己多动手,多实践,本专栏会持续更新。1.vue安装教程及简介2.vue计算属性computed与监听属性watch的基本使用3.Vue组件及自定义事件4.Vue过渡&动画&混入5.Vue路由的基本使用6.vue中Ajax(axios)及Ajax(vue-resource)的使用方法7.vues响应接口and实例8.vue目录.

    2022年6月4日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号