`
zwt2001267
  • 浏览: 450662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
阅读更多

范式

    就关系数据库而言,一贯认为:从其他元素中消除数据冗余问题,去除重复往往以减少冗余, 从特定的表中最小化冗余意味着摆脱不必要的数据。

商业上来讲,主要目标是通常保存空间和组织的数据可用性和可管理性,而不牺牲性能。此外,要求强烈繁忙的应用程序和最终用户的需要往往需要以多种方式打破规则的范式,以满足性能要求。第三范式以外的范式常常被忽视和有时甚至是第三范式本身就是多余的。

范式是一个升级的过程,每个上层的模式都是建立在下一级范式之上的。

消除数据冗余的影响如下:

物理空间需要存储的数据减少。

数据变得更有组织。

范式化允许修改少量的数据(即单记录)。换言之,一个表的具体字段记录更新时,会影响其他引用他的表。

首先我们对一些概念性的东西来进行一个总结,通过对这些概念的理解,从来从根本上做到合理的数据库设计:

异常

l  添加异常:当我们添加一条记录的时候,他依赖的主表记录还没有记录,而该记录已经插入成功。

l  删除异常:当我们的主表记录删除,而依赖他的子表没有清空对应的记录。

l  更新异常:当我们的主表记录有更新草组,而已来他的子表没有相应的更新记录。

依赖,决定因子

l  函数依赖:当Y的值由X决定的时候,我们就说Y函数依赖于X,这就类似于一个线性方程:Y=X+1;类似的ERD图中,我们这样表示 ,很清楚的看到表Category,中的主键是CategoryID,他决定着其他字段的值NamePic,我们就说Name或者Pic 函数依赖于CategoryID,他们之间就是一个函数依赖关系。

l  决定因素:如上例中,CategoryID就是一个决定因素,他决定其他字段的值,Y=X+1中,X就决定着Y的值,虽然加了一个常量。

l  传递依赖:当X决定YY决定Z的时候,我们就说Z传递依赖于X ,从这个ERD图中,我们看到Account帐号表中的City字段,他被AccountID所决定,而City字段的值又决定了College的值,因为大学肯定是被城市所决定,所以College就传递依赖于AccountID

l  候选键:候选键(潜在的或允许的主键)可以扮演主键的角色他可以是一个表中的一个字段或组合字段­­——也就是一条记录中的唯一标识。 ,我们看到这个表,Customer表(客户表),字段分别表示,客户ID,客户名,货币缩写码,货币,转换汇率,地址。这个表我们没有定义主键,但是我们可以推测那些可以成为主键,那么那些键就叫做候选键。 ,我们就看到了,所有能成为主键的可能,表中的#就是主键的标识符。

l  完全函数依赖:当X决定Y,但是X不被XZ的组合所决定,换句话说,YE依赖于独立的X,如果Y依赖于X加上一些其他的东西,那就不是完全函数依赖,本质上,决定因素X不能是一个组合键。 ,我们来看到旅游表TravelCountry是旅游的国家,Populication是旅游的城市,同时TravelIDCountryID是主键,可以看出来只有CountryID决定着Populcation人口,但是这里有两个主键,所以Populication并没有完全函数依赖于主键组合,只部分依赖于CountryID

l  多值依赖:某个字段中的值之一个集合,或者是用某种分隔符分割开来的元素集合,我们就称为多值依赖。很经典的 Path保存的这个递归表的所有上司的级别,比如老大的ID1,老22Path 就保存12,像这样的字段,我们就称为多值依赖。

l  循环依赖:循环依赖就如其名,是一个个闭环的依赖系统。A依赖于B,B依赖于C,C依赖于A

范式(学术定义)

l  第一范式(1NF):消除表中所有重复的记录,除了主键以外的所有其他字段全部依赖于主键。

l  第二范式(2NF):所有非键值字段必须全部完全函数依赖于主键,当一个字段完全函数依赖于一组组合主键的部分函数依赖是不允许的。

l  第三范式(3NF):消除传递依赖,意味着一个字段必须非间接的依赖于主键

l  正规化范式(BCDF):所有表中的决定因素必须是一个候选键,如果只有一个候选键,那么就和第三范式是一样的。

l  第四范式(4NF):消除多值依赖。

l  第五范式(5NF):消除循环依赖。

我们从一个比较容易的位置来理解范式,通过上述的理解,加上实际的操作范式,让我们对数据库的设计有一个比较深的认识,以决定什么情况下用范式。

l  第一范式(1NF):通过创建一个新表来移除重复的元素,使他们成为一个主从关系或者是one to many的关系,类似下图:

l  第二范式(2NF):建立在1NF的基础上,就是移除重复的值到一个新表中去,新表有唯一的主键,而主表有一个对新表的外键的引用,排除存在的部分依赖。

如下图:

Bookid book表的主键,而authorauthor1的主键,在book表中建立author,主表有一个对子表的外键引用,而不是把author也定义为主键,那样就存在部分函数依赖,因为bookid就已经确定了titlepageisbn等等信息。

l  第三范式:消除传递依赖,如下图:

我们把多对多的关系变化成上图的关系。这是一种简单的形式,下面展示一个另外一种情况:

这里的表分别是客户(客户名,货币号,货币,货币,汇率,地址),提供商(客户名,货币号,货币,汇率,地址)。首先他们的地址决定了他们的货币情况,而地址又是由客户或者提供商决定的,所以他们之间存在一个传递依赖关系,而且最好是把相同的存在于不同的数据移植到一个新表中去。前面我们提到了 这个关系,也是一个不满足第三范式的表,CityCollege以及主键存在传递关系,所以可以把College移植到一个新表中去,

还有一些存在订单的表中,有类似(qty(数量),price(单价),total(总价))的结构,qtyprice决定了total,而订单号决定了qty和,price,所以也存在一中依赖关系,我们要删除total字段,但是不是都遵循范式的表都是好的结构,我们还是要根据实际情况,比如在一个数据仓库的设计中,汇总字段就是必须的。

l  超三范式(Beyond 3NF)中的one to one关系,这个主要用户当我们表中一些字段经常存在空值的时候,我们将存在的NULL字段移到一个新表中去,然后建立11的关系。

l  BCNF范式:BCNF划分成多个表的表格,以确保没有一个单一的表有更多不止一个潜在的主键。这是我的理解BCNF 。在我看来,是BCNF 用于商业环境是过度设计的。从本质上讲,从数学的角度上它的漂亮,但在商业环境中它不是很酷。下面的例子是一个BCNF转换:

l  第四范式:消除多值依赖,很经典的一个环境就是,我们的递归表问题 ,一个Manager有多个Employee,然后每条记录都有一个Path老表示这种关系,所以pathEmployeeId就存在一个多对多的关系。我们就应该重新建立一个新表,用来消除Path字段,新表中就保留一个EmployeeId作为外键,另外一个EmployeeId用来表示他的下属。

l  消除循环依赖,如下图:

在这个实例中Solution表中的键都是主键,他们存在这样的关系,每两个组合的主键决定另外一个主键。比方项目1和经理1就决定了有哪些下属属于项目1和经理1关系,而一个经理1和他的下属员工又决定了他们参与了那些项目。所以他们之间其实是一个循环的依赖。

反范式:

l  这种类型的应用在商业正常化环境将导致业绩不佳,更精确的数学的必要性比商业要低的多。因此:

 

l  同样的,对于第4范式,我们很多时候都没有必要去消除他们里面多值的依赖,那样对性能来说简直是个噩梦。所以很多情况下,我们都是用类似的处理

CSDN上的,显示自己的技术就是这样的反范式化转换。

l  在商业环境中,绝大多数超越第3范式的设计都是不切实际的。因为应用程序在3NF级别就能变现的相当出色。我们上述的很多例子,将指向箭头反过来就是先了反范式化。所以我们要对整体的结构有个比较深的认识,才确定我们是否范式话或者反范式化,范式化越深的东西越导致表的增多,也就意味着查询的join开销。

l  总结一下反范式化的一些准则:

n  分离活动和静态的数据,数据可分为独立的物理表,即

n活动和静态表。那些累计的历史数据导致我们占据了绝大多数的空间。这是影响性能的最经常的数据,在数据仓库设计中,我们经常将无效的静态的数据移植到数据仓库中,由于OLAP和数据挖掘。

n  在表之间复制字段,在那些不是直接有链接表的之间复制字段,使得我们不必每次进行查询都要通过第3方表,越少的join操作,使得性能的大幅度提升。

n  在夫表中建立统计字段,这样可以减去消耗大的聚合操作,但是实时更新会给我们带来另外的麻烦。

n  分离繁重和轻松的字段,就像把活动和静态的数据数据表分离一样,这个避免持续物理扫描很少使用的数据字段,尤其是当这些字段不包含空值。这是一个潜在的合理利用4NF在分离表格分为两个表格,相关的一对一关系。

 

分享到:
评论

相关推荐

    数据库范式理解例题数据库范式理解例题.doc

    数据库范式理解例题 数据库范式是relation database设计中的一种规范,旨在确保数据库的结构正确性和数据的一致性。其中包括第一范式(1NF)、第二范式(2NF)和第三范式(3NF)等。 第一范式(1NF) 第一范式是...

    数据库范式理解例题.doc

    数据库范式理解例题 数据库范式是关系数据库设计中的一种规范约束规则,用于确保数据库的逻辑一致性和数据的完整性。下面是对数据库范式的理解和例题: 1. 属性的分类: 在关系数据库中,属性可以分为主属性和非...

    数据库范式.pdf

    "数据库范式" 数据库范式是关系数据库的设计理论,旨在消除数据冗余,提高数据的一致性和可管理性。范式是一个升级的过程,每个上层的模式都是建立在下一级范式之上的。消除数据冗余的影响包括:减少物理空间的存储...

    数据库范式详解+实例

    ### 数据库范式详解 #### 一、范式的概念与作用 在数据库设计过程中,为了减少数据冗余、避免更新异常等问题,引入了**数据库范式**的概念。范式是衡量关系模式优劣的标准,其核心目的是通过规范化过程来简化...

    数据库设计的基础-数据库范式

    数据库范式是关系型数据库设计的基本原则和规范,旨在通过规范化处理减少数据冗余和依赖,增强数据结构的合理性,提高数据的一致性。数据库范式涉及多个级别,包括但不限于第一范式(1NF)、第二范式(2NF)、第三范式(3...

    数据库范式理论

    数据库系统概论数据库范式理论。数据库范式理论

    数据库范式化教程 - 订单数据实例速成.pdf

    数据库范式化是数据库设计中保证数据关系清晰、降低数据冗余和提高数据一致性的过程。根据文档内容,本教程将简明扼要地介绍范式化的概念,并通过订单数据实例进行阐释。以下是基于文档内容的知识点梳理。 首先,...

    数据库范式讲解

    数据库范式讲解

    什么是数据库范式?什么是设计范式?

    数据库范式是关系型数据库设计中的核心理论,它是一组规则,用来指导如何构建和组织数据库,以确保数据的一致性、减少冗余并避免数据异常。这些规则以不同的级别存在,即第一范式(1NF)、第二范式(2NF)、第三范式...

    数据库范式【转】

    数据库范式 数据库范式是数据库设计中的一种规则,旨在确保数据的正确性、完整性和一致性。数据库范式通常有三种:第一范式、第二范式和第三范式。下面将对每种范式进行详细的介绍。 第一范式 第一范式是最基本的...

    通俗易懂,实例讲解数据库范式,三范式,六范式

    ### 数据库范式详解 #### 一、基础知识 在深入探讨数据库范式之前,我们需要先了解几个基础概念。 ##### 实体(Entity) 实体是指现实世界中客观存在的、可以被区别的事物。例如:“一个学生”、“一本书”、...

    数据库范式练习题.doc

    数据库范式练习题 数据库范式是数据库设计的重要概念,它们是关系数据库设计的基本原则。下面是对数据库范式的详细介绍: 第一范式(1NF) 第一范式是指数据库表中的每一列都是不可分割的数据项,即每一列的值不...

    数据库范式解析,看了秒懂

    数据库范式是关系数据库设计中的核心理论,它们是用来衡量数据依赖规范化的程度,确保数据库的结构合理、数据冗余最小,从而减少数据异常。本文将深入解析数据库的几个主要范式,包括第一范式(1NF)、第二范式(2NF...

    数据库范式理解例题.docx

    "数据库范式理解例题" 数据库范式是数据库设计中的一种原则,它可以帮助我们设计出高效、可维护的数据库。下面我们将对数据库范式的相关知识点进行详细的讲解。 函数依赖 函数依赖是指关系中一个或一组属性的值...

    关系数据库范式归属的证明

    标题和描述均提到了“关系数据库范式归属的证明”,这一主题聚焦于关系数据库理论中的范式归属问题,即如何证明高级范式归属于低级范式。范式是关系数据库设计中用来规范数据库结构的标准,旨在减少数据冗余并提高...

    数据库范式以及范式的级别

    数据库范式是数据库设计中的一个重要概念,用于优化数据存储,减少数据冗余并避免数据不一致性。这个概念源自于关系数据库理论,由埃德加·科德在其关系模型中提出。在数据库设计中,遵循不同级别的范式有助于构建...

    数据库范式的详细讲解

    "数据库范式的详细讲解" 数据库范式是数据库 normalization 的一个重要概念,指的是将关系数据库中的数据组织成一个优化的结构,以提高数据的存储效率、减少数据冗余和更新异常。数据库范式有多种,分别是第一范式...

    数据库范式(123BCNF范式)详解.docx

    数据库范式(123BCNF范式)详解 数据库设计中,数据库范式是指数据库设计所需要满足的标准,满足这些标准的数据库是简洁的结构明晰的,同时,不会发生插入、删除和更新操作异常。反之,则是乱七八糟,不仅给数据库...

Global site tag (gtag.js) - Google Analytics