oracle 第一范式,数据库范式之第一范式

oracle 第一范式,数据库范式之第一范式数据库范式(DatabaseNormalization)设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,还又称完美范式)。首先要明白”范式(NF)”…

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

数据库范式(Database Normalization)

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,还又称完美范式)。

首先要明白”范式(NF)”是什么意思。按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”。很晦涩吧?实际上你可以把它粗略地理解为一张数据表的表结构所符合的某种设计标准的级别。就像家里装修买建材,最环保的是E0级,其次是E1级,还有E2级等等。数据库范式也分为1NF,2NF,3NF,BCNF,4NF,5NF。一般在我们设计关系型数据库的时候,最多考虑到BCNF就够。符合高一级范式的设计,必定符合低一级范式,例如符合2NF的关系模式,必定符合1NF。

不过在设计关系型数据库时,通常只会用到前四种范式,内容相对较少,利用闲暇之余整理一下,以便记忆。这次只是提及最简单的第一范式。

第一范式(1NF)

所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域都应该是原子性的,即数据库表的每一列都是不可分割的原子数据项,而不能是集合,数组,记录等非原子数据项。即实体中的某个属性有多个值时,必须拆分为不同的属性。在符合第一范式(1NF)表中的每个域值只能是实体的一个属性或一个属性的一部分。简而言之,第一范式就是无重复的域。符合1NF的关系中的每个属性都不可再分。

如下表,就不符合1NF。

AAffA0nNPuCLAAAAAElFTkSuQmCC

实际上,1NF是所有关系型数据库的最基本要求,你在关系型数据库管理系统(RDBMS),例如SQL Server,Oracle,MySQL中创建数据表的时候,如果数据表的设计不符合这个最基本的要求,那么操作一定是不能成功的。也就是说,只要在RDBMS中已经存在的数据表,一定是符合1NF的。如果我们要在RDBMS中表现表中的数据,就得设计为下表的形式:

AAffA0nNPuCLAAAAAElFTkSuQmCC

通常上只要知道1NF的上述特点即可。但是为了严谨,这里举出三点不符合第一范式的例子。

不符合第一范式的情况

1、重复组(单一字段中有多个有意义的值)

重复组通常会出现在会计账上,每一笔记录可能有不定个数的值。举例来说:

顾客

日期

数量Pater

Monday

19.00,-28.20

Pater

Wednesday

-84.00

Sarah

Friday

100.00,150.00

‘数量’ 就是所谓的重复组了,而在这种情况下这份数据就不符合第一范式。想要消除重复组的话,只要把每笔记录都转化为单一记录即可:

顾客

日期

数量Pater

Monday

19.00

Pater

Monday

-28.20

Pater

Wednesday

-84.00

Sarah

Friday

100.00

Sarah

Friday

150.00

2、缺少唯一识别码

一样是在交易这个例子中,同一天同一个人买了同样的数量,这样的交易做了两次:

顾客

日期

数量Pater

Monday

19.00

Pater

Monday

19.00

如上所示,这两笔交易可以说是一模一样,也就是说如果只靠这些数据我们没有办法分辨这两笔记录。我们之所以说它不符合第一范式,是因为上面这样的表示法欠缺一个唯一识别码,可以是一个字段,也可以是一组字段,而且可以保证在这个数据中唯一识别码不会重复出现。要将它正规化到符合第一范式的原则只需要加入一个唯一识别码即可:

交易ID

顾客

日期

数量1

Pater

Monday

19.00

2

Pater

Monday

19.00

3、用很多字段来表达同一个事实

在同一个数据表里用多个字段来表达同一个事情也是违反第一范式的:

交易ID

人物

不喜欢的食物(1)

不喜欢的食物(2)

不喜欢的食物(3)1

Pater

梨子

苹果

2

Jim

西瓜

梨子

3

Airing

西瓜

苦瓜

梨子

4

Tom

老鼠

葡萄

懂得数据库基础的人一看就知道这是一个很糟糕的设计,甚至连觉得其都称不上是一个数据表。没错,其实1NF是很简单,它是所有关系型数据库设计必须要满足的基础。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142322.html原文链接:https://javaforall.net

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


相关推荐

  • random.nextint java_实例讲解Java中random.nextInt()与Math.random()的基础用法

    random.nextint java_实例讲解Java中random.nextInt()与Math.random()的基础用法1、来源random.nextInt()为java.util.Random类中的方法;Math.random()为java.lang.Math类中的静态方法。2、用法产生0-n的伪随机数(伪随机数参看最后注解)://两种生成对象方式:带种子和不带种子(两种方式的区别见注解)Randomrandom=newRandom();Integerres=random.nextInt…

    2022年7月22日
    19
  • poj 2375

    poj 2375这道题是一道gu

    2022年6月13日
    19
  • CentOS7 安装 kafka「建议收藏」

    CentOS7 安装 kafka「建议收藏」文章目录一、安装JDK二、安装zookeeper三、安装kafka一、安装JDKrpm-qa|grepjavarpm-qa|grepjdkrpm-qa|grepgcjrpm-qa|grepjava|xargsrpm-e–nodeps #卸载老版本yumlistjava-1.8*yuminstalljava-1.8.0-openjdk*-yjava-version二、安装zookeeper官方地址:https://ar

    2022年6月6日
    30
  • J2EE究竟是什么?「建议收藏」

    J2EE究竟是什么?「建议收藏」J2EE(即Java2平台企业版)是由Sun公司主持推出的一项中间件技术。从CORBA、IDL到面向消息的系统,中间件技术已经走过了很长的一段路程,如今J2EE作为中间件技术史上的一块具有决定意义的里程碑,正受到业界越来越广泛的重视和采纳。J2EE,一方面有着一套相当庞大的标准体系和数个不同版本,另一方面,由于市场上应用服务器品种多样,各家开发商使用的术语又不尽相同,因此,围绕着J2EE,常

    2025年6月6日
    6
  • java字符串分割split_js的sort排序方法

    java字符串分割split_js的sort排序方法●利用split函数:Strings=newString(“2_8_7_4_3_9_1”);String[]arr=s.split(“_”);Java中用split函数进行分割字符串。1.语法如下String.split(sourceStr,maxSplit)String.split(sourceStr)参数说明:sourceStr是被分割的字

    2022年9月30日
    4
  • 最新idea激活码永久【2021免费激活】

    (最新idea激活码永久)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月22日
    330

发表回复

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

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