原则:

规范化的目的是一份数据只存储在一个地方。

根据上面的原则来理解3种范式:

第一范式:

列的原子性;

保证行的唯一性---一份数据只存储在一个地方。

第二范式:非属性键与主键的关系

1.满足第一范式

2.非键属性依赖于整体主键,而不是非键属性仅仅依赖于主键中的某个部分。即:无部分依赖:

违反第二范式就是存在部分依赖(非键属性仅仅依赖于主键中的某个部分)。

违反第二范式这有点像:

在一个由诸多长老全部举手表才能表决的组织里,你却只听一个或个别长老的话,这可是坏了规矩的。

例如,如下的关系就违背了第二范式:

关系名:PersonPet(人宠物)

主键:PesonId 、PetId

非键属性:PesonName、PetName、PetType

违背第二范式:PesonName只依赖于PesonId

PetName只依赖于PetId

举个例子,违反了第二范式存储的数据的样子:

PesonId    PetId           PesonName    PetName

1          1                    人才1           宠物1

2          2                    人才2           宠物2

3          1                    人才3           宠物1

在现实生活中,人和宠物的关系是多对多的关系,即:

1个人可以有0、1、1以上个宠物

1个宠物可以属于0(如流浪狗)、1(单身IT男)、1个以上(一对情侣)个人

我们从上表因为违反第二范式而存储的数据违反规范化的原则:

规范化的目的是一份数据只存储在一个地方。

即:PetId为1的宠物,在存储数据的时候,被复制了多次,存放的不同的地方。

这样会对数据的增、删、改。会有什么影响:

增:

1.通常来说,当需要对单个事物(单个人、单个宠物)进行处理,而不是处理他们之间关系时,

因为没有专门为“人”这个实体建立了的表(如:Person表)为了增加一个人,不得不在PersonPet(人宠物表)中添加人

的相关信息,而在“宠物”相关的列输入无意义的值。

在单独查询人(不查询宠物)的时,不得不额外去除掉那些来自宠物相关信息。

2.只要一个人有多个宠物,这个人的信息将被多次复制。同样:

3.只要一个宠物属于多个人,这个宠物的信息也将被多少复制。

删:

当需要对单个事物(单个人、单个宠物)进行处理,而不是处理他们之间关系时,对删除的影响:

如果PesonId为1和3(这对情侣可能同时出现车祸)的人都没,要删除这两个人,存储的数据就是这样的:

PesonId   PetId        PesonName         PetName

NULL            1               NULL                 宠物1

2              2               人才2                 宠物2

NULL            1               NULL                 宠物1

可以看到这样的设计基本废掉了。

改:

数据同步问题, 例如:通过主键(PesonId ,PetId)=(1,1)修改 PetName的值“宠物1”为“宠物007”,如果在编程时没有

注意同步

PesonId   PetId    PesonName   PetName

3              1            人才3         宠物1

那么就破坏了数据。

第三范式:非属性键之间的关系

1.满足第二范式

2.非属性键不依赖于非属性键,即:不存在传递依赖。

违反第三范式这有点像:

在朝廷中有个皇帝(主键)就够了,有人结党私营,搞小团体,听命于一个小头目(非属性键依赖于非属性键),也是坏了规矩的。

Book表

主键:BookIsbnNunmber

非属性键:Title

Price

PublishName

PublishCity

这个表满足了第二范式.

但是违反了第三范式:

非属性键PublishCity依赖于非属性键PublishName。

违反了第三范式将导致如下问题,例如下面违反了第三范式的表存储的数据:

BookIsbnNunmber     Title                Price       PublishName       PublishCity

1001                 《我是人才》        63.1          人才出版社            地球村

1002                 《我是蠢材》         87.2         人才出版社            地球村

按常规,我们都是通过“主键”去唯一定位要修改的数据,所以,用如下SQL语句:

Update adb.Book

Set PublishCity='月亮城'

Where BookIsbnNunmber=‘1001’;

执行以上SQL后,表中的数据如下:

BookIsbnNunmber        Title              Price       PublishName   PublishCity

1001                       《我是人才》       63.1         人才出版社      月亮城

1002                       《我是蠢材》       87.2         人才出版社       地球村

这就产生了数据同步的问题,数据在更新时被破坏了。

PublishName     PublishCity

人才出版社           月亮城

人才出版社           地球村

由于违反了第三范式(非属性键PublishCity依赖于非属性键PublishName),

我们就得写额外的处理去更新所有列的PublishName

Update adb.Book

Set PublishCity='月亮城'

Where PublishCity='地球村' And PublishName='人才出版社'

这样,说明一点,违反第三范式,为了更细数据时,避免非属性键之间依赖产生的数据同步问题,不得不

进行而不处理数据同步问题,但是这额外的同步数据操作很容易被忘记,

更糟糕的是,系统的关系会随着时间的关系不断变化,你也将越来越头痛。

转载于:https://www.cnblogs.com/easy5weikai/archive/2013/06/12/3133177.html

关系数据 规范化的理解相关推荐

  1. 关系模式规范化举例理解:第一范式、第二范式、第三范式

    参考:http://wenku.baidu.com/link?url=KzN3v3voao4ovz_izsiujMN8vMZMiArzgYbrue8tVL5L_ydc1B_6_1eEy7vfoSiO2 ...

  2. 数据库原理与应用(SQL)——3、关系数据理论(函数依赖、闭包、函数依赖集的最小集、规范化---范式 )

    加油! 不要停止奔跑, 不要回顾来路, 来路无可眷顾, 值得期待的只有远方.  关系数据理论是关系数据库的理论基础, 为数据库设计提供了判别标准, 是设计关系数据库的指南. 数据存储异常(因为存在数据 ...

  3. 第6章 关系数据理论—范式的介绍

    第6章 关系数据理论-范式的介绍 本文全部内容来自数据库系统概论(第5版)-王珊.萨师煊著 部分函数依赖图,出于自己的理解,如有错误,请大家评论指正! 范式:关系数据库中需要满足的一定要求的规范形式. ...

  4. 数据规范化(标准化)

    数据规范化(标准化) 在数据预处理时,这两个术语可以互换使用.(不考虑标准化在统计学中有特定的含义).  下面所有的规范化操作都是针对一个特征向量(dataFrame中的一个colum)来操作的.  ...

  5. 第6章 关系数据理论 习题6

    (一)大家根据自己了解的.所使用的.所设计的数据库系统,举例说明以下术语的定义(可查阅相关材料),要求理解并熟练掌握. 1.函数依赖 设R(U)是一个属性集U上的关系模式,X和Y是U的子集.若对于R( ...

  6. 【数据库】关系数据理论习题及解析

    一.选择题 1. 为了设计出性能较优的关系模式,必须进行规范化,规范化主要的理论依据是( A) . A. 关系规范化理论 B. 关系代数理论 C.数理逻辑 D. 关系运算理论 2. 规范化理论是关系数 ...

  7. 数据库复试--关系数据理论(主观题)

    第五章 关系数据理论 1. 在关系模式R(D,E,G)中,存在函数依赖关系{E→D,(D,G)→E},则候选码是__________,关系模式R(D,E,G)属于____________. 正确答案: ...

  8. JVM学习笔记之-方法区,栈、堆、方法区的交互关系,方法区的理解,设置方法区大小与OOM,方法区的内部结构,方法区使用举例

    栈.堆.方法区的交互关系 运行时数据区结构图 从线程共享与否的角度来看 栈,堆,方法区的交互关系 方法区的理解 方法区在哪里? <Java虚拟机规范>中明确说明:"尽管所有的方法 ...

  9. 对数据可视化的理解_使数据可视化更容易理解

    对数据可视化的理解 Data is weaving its way into almost all aspects of our lives since the past decade. Our ab ...

最新文章

  1. 小红帽怎样装图形化界面_linux安装图形化界面
  2. 模式7--ThreadPerMessage
  3. 加快发展设施业 农业大健康-林裕豪:从玉农业践行基础支撑
  4. python批量处理txt_浅谈Python批处理文件夹中的txt文件
  5. Python生成Windows可执行exe文件
  6. Vivado2015.4使用教程(一个完成工程的建立)
  7. 看动画学算法之:队列queue
  8. Android转载一:Android文件命名规范
  9. APK反编译之APKTOOL的使用
  10. java8新特性——如何使用lambda
  11. java 手机号码归属地_Java获取手机号码归属地
  12. PayPal WebHook事件异步通知
  13. CAD插件的安装和自动加载dll、arx
  14. ls-dyna常用结构单元类型
  15. 水桶平分 java,JAVA路线
  16. 老嫂子的保姆级科普 选择视频剪辑软件就从阅读本文开始
  17. 这就是最适合程序员的云笔记?
  18. 血仍未冷——写在37岁生日
  19. 未能打开这台计算机上的组策略对象,您可能没有合适的权限
  20. element ui 上传图片

热门文章

  1. 深入理解AbstractQueuedSynchronizer(AQS)
  2. STM32F4 HAL库开发 -- SPI Flash
  3. Mysql: SQL JOIN 子句详解
  4. 5行代码帮你梳理EOS.IO的脉络
  5. Android代码入侵原理解析(一)
  6. android settings源代码分析(2)
  7. JZOJ 1322. 硬币游戏
  8. 如何启用计算机超级账户,Windows7启用超级管理员账户的方法
  9. python 任务计划_使用Python添加计划任务
  10. 集合(normal)