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

第一范式、第二范式、第三范式[通俗易懂]范式:英文名称是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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MPC-HC播放器_mp238播放器设置说明

    MPC-HC播放器_mp238播放器设置说明以下内容均来自互联网本文仅作参考,请使用MPC-HC最新版本结合自身硬件条件和实际播放情况进行设置和调整!启动MPC-HC,先设置语言:(最新版本会自动选择对应的系统语言)View-Language-Chinese=>界面变为中文进视图-选项:播放器:建议勾选「保存设置至.ini文件中」格式:建议勾选全部视频类格式,其中QuickTi

    2022年9月14日
    5
  • kl1083_显示器dpi是什么意思

    kl1083_显示器dpi是什么意思Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?输入格式共一行,包含两个整数 A 和 B。输出格式输出一个整数,表示答案。数据范围1≤A≤B≤2×109输入样例1:1 10输出样例1:9输入样例2:25 50输出样例2:20#include<bits/stdc++.h>using namespace std;

    2022年8月9日
    8
  • 简单介绍一下spring bean的生命周期_生命周期分析

    简单介绍一下spring bean的生命周期_生命周期分析面试题来自面试官发自灵魂深处的拷问:谈谈你对spring的理解;一脸懵逼的求职者的内心活动:啥?具体的问题是什么?现在的面试都不按套路出牌了吗?抛出一个这么大的问题,你让我怎么回答?一脸懵逼的求职者的回答:额~~~这个。。。。额~~~那个。。。。额~~~不知道唉。。。为什么面试官要问这种问题?不可否认,现在的大多数的面试出题方式都是这样的,惊人的相似,就是面试官喜欢抛出一个问题,看你能讲多深,考的就是你对这项技术的深度和广度,深度就是你对技…

    2022年9月19日
    4
  • tar打包命令(linux)

    tar打包命令(linux)1.打包命令:tar-cvf归档路径被打包文件路径。(c–createarchivev-verbosef–file,f指归档路径,故f必须放在其他选项之后,而且-可省略不写)单独打包命令:tar-cvf归档路径被打包路径.(整体文件变大,后缀一般是.tar)gzip压缩命令:tar-zcvf归档路径被打包路径.(gun-zip压缩,后缀一般是.tar.gz)bzip2压缩命令:tar-jcvf归档路径被打包路径.

    2022年5月31日
    39
  • VS多行注释快捷键_vs2015注释快捷键

    VS多行注释快捷键_vs2015注释快捷键最近在使用VS2010开发ASP.NET,突然发现想全部注释时找不到注释的快捷键,网上查了下,原来很简单,只是需要使用组合键。注释:先CTRL+K,然后CTRL+C取消注释:先CTRL+K,然后CTRL+U…

    2022年8月15日
    4
  • linux添加防火墙_centos防火墙设置与端口开放的方法

    linux添加防火墙_centos防火墙设置与端口开放的方法一、介绍当设置ip过滤的时候,如果ip较多,经常修改,修改防火墙规则比较麻烦,可以使用ipset,ipset是一个集合,防火墙可以添加集合,只需要一条防火墙规则就可以实现整个集合里面ip的过滤iptables-IINPUT-mset–match-setbanipsrc-ptcp–destination-port80-jDROPTYPENAME:=method:datatype[,datatype[,datatype]]可以使用的method:bitmap,ha

    2022年10月6日
    2

发表回复

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

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