当前位置: 首页 > news >正文

Oracle数据库设计第三范式

一、数据库设计范式及其意义和不足

数据库的设计范式是数据库设计所需要满足的规范,数据库的规范化是优化表的结构和优化把数据组织到表中的方式,这样使数据更明确,更简洁。实践中,通常把一个数据库分成两个或多个表并定义表之间的关系以做到数据隔离,添加、删除和修改某个字段只需要在一个表中进行,接着可以通过定义的关系传递到数据库中剩余的表中(和分层思想的意义所在很相似)。这样我们可以消除很多错误或垃圾数据出现的机会并减轻更新信息所必要的工作量。

 

目前,主要有六种范式:第一范式、第二范式、第三范式、BC范式、第四范式和第五范式。满足最低要求的叫第一范式,简称1NF。在第一范式基础上进一步满足一些要求的为第二范式,简称2NF。其余依此类推

 

事物往往具有多面性,设计范式也会带来一定的麻烦:操作困难,因为需要联系多个表才能得到所需要数据,而且范式越高性能就会越差。所以使用多高的范式需要权衡利弊,一般在项目中,使用到第三范式也就足够了,性能好而且方便管理数据。

 

二、下面我们来举例介绍一下数据库设计三范式

说明:实例采用《学校机房收费系统》的“学生信息表”,“学生上下机记录表”的部分字段

 

1、第一范式1NF

定义:数据库表中的字段都是单一属性的,不可再分。

简单的说,每一个属性都是原子项,不可分割。

 

1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。也就是说,只要是关系型数据库,就一定满足第一范式。

 

我们先来看一张不符合1NF的表1-1

CardNo

StudentNo

StudentName

Sex

Department

CardCash

UserID

UserLevel

Time

001

021101

小明

教育学院,心理系,1班

100

Operator

操作员

2011/10/03,09:00

 

之所以说这张表不符合1NF,是因为Department和Time字段可以再分,所以应该更改为表1-2:

CardNo

StudentNo

StudentName

Sex

Academy

Major

class

CardCash

UserID

UserLevel

Date

Time

001

021101

小明

教育学院

心理系

1

100

Operator

操作员

2011/10/03

09:00

 

2、第二范式2NF

定义:数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,即符合第二范式。

 

《注:什么是函数依赖,详见百度百科(http://baike.baidu.com/view/40008.htm)。

如果一个表中某一个字段A的值是由另外一个字段或一组字段B的值来确定的,就称为A函数依赖于B。》

2NF可以减少插入异常,删除异常和修改异常。

 

简单的说,一方面,第二范式肯定要满足第一范式,否则就没有必要谈第二范式。

另一方面,当某张表中的非主键信息不是由整个主键函数来决定时,即存在依赖于该表中不是主键的部分或者依赖于主键一部分的部分时,通常会违反2NF。

 

我们再来看上面的满足1NF的表1-2

CardNo

StudentNo

StudentName

Sex

Academy

Major

class

CardCash

UserID

UserLevel

Date

Time

001

021101

小明

教育学院

心理系

1

100

Operator

操作员

2011/10/03

09:00

 

我们看到,在这张表中,通过CardNo和StudentNo就可以确定StudentName,Sex,Academy,Major,class,CardCash,UserID,Date,Time。所以可以把CardNo和StudentNo的组合作为主键。

但是,我们发现CardCash并不完全依赖于CardNo和StudentNo,仅仅通过CardNo就可以确定CardCash,因为一张卡,一定会有卡内金额。这就造成了部分依赖。出现这种情况,就不满足第二范

修改为:

 

 

我们再来看另一个例子,学生上下机记录表,会更明显些。表2-1

CardNo

StudentNo

StudentName

Sex

Department

Major

class

OnDate

OnTime

OffDate

OffTime

ConsumeTime

ConsumeMoney

001

0211

小明

教育学院

心理系

1

2011/10/14

09:00

2011/10/14

10:00

1

2

 

我们看到,在这张表中,StudentName,Sex,Department,Major,class都是直接依赖于StudentNo,而不依赖与表中的其他字段,这样的设计也不符合2NF非主键信息不是由整个主键函数来决定时。

 

我们可以把1-2和2-1优化为:

3-1

StudentNo

CardNo

UserID

UserLevel

Date

Time

021101

001

Operator

操作员

2011/10/03

09:00

3-2

CardNo

CardCash

001

98

3-3

CardNo

OnDate

OnTime

OffDate

OffTime

ConsumeTime

ConsumeMoney

001

2011/10/14

09:00

2011/10/14

10:00

1

2

3-4

StudentNo

StudentName

Sex

Academy

Major

class

021101

小明

教育学院

心理系

1

 

 

3、第三范式3NF

定义:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合3NF。

 

我们来看上例中优化后的表3-1

StudentNo

CardNo

UserID

UserLevel

Date

Time

021101

001

Operator

操作员

2011/10/03

09:00

 

在表中,一个UserID能确定一个UserLevel。这样,UserID依赖于StudentNo和CardNo,而UserLevel又依赖于UserID,这就导致了传递依赖,3NF就是消除这种依赖。

 

我们把3-1进行优化得到:

4-1

StudentNo

CardNo

UserID

Date

Time

021101

001

Operator

2011/10/03

09:00

4-2

UserID

UserLevel

Operator

操作员

 

 

我们看到,第三范式规则查找以消除没有直接依赖于第一范式和第二范式形成的表的主键的属性。我们为没有与表的主键关联的所有信息建立了一张新表。每张新表保存了来自源表的信息和它们所依赖的主键。

 

三、总结

数据库设计规范化能让我们更好地适应变化,使你能够改变业务规则、需求和数据而不需要重新构造整个系统。

 

 

 

 

 

 

转载于:https://www.cnblogs.com/xiaomingzaixian/p/5585777.html

相关文章:

  • 人月神话阅读笔记之三
  • laravel5入门(三)
  • 关于虚拟机能ping通物理机,而物理机ping不通虚拟机问题解决。
  • iis7 appcmd的基础命令及简单用法
  • 《OpenStack 实战》内容概览与作者采访
  • LinkedIn 开源成功的秘密
  • cocoaPods的安装使用 以及 Carthage
  • jxl 导出Excel
  • linux dd 读取 写入磁盘速度
  • MYSQL数据库导出
  • HDU2013 蟠桃记
  • caffe 调试
  • GetKeyState和GetAsyncKeyState以及GetKeyboardState函数的用法与区别2-------C#检查键盘大小写锁定状态...
  • Ntop性能提升方案
  • OC执行JavaScript代码
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【剑指offer】让抽象问题具体化
  • 345-反转字符串中的元音字母
  • Android 控件背景颜色处理
  • Django 博客开发教程 8 - 博客文章详情页
  • dva中组件的懒加载
  • jQuery(一)
  • Markdown 语法简单说明
  • MySQL-事务管理(基础)
  • opencv python Meanshift 和 Camshift
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Python - 闭包Closure
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 初识MongoDB分片
  • 动态魔术使用DBMS_SQL
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 免费小说阅读小程序
  • 如何优雅地使用 Sublime Text
  • 深度学习中的信息论知识详解
  • 网络应用优化——时延与带宽
  • 小程序button引导用户授权
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 用Visual Studio开发以太坊智能合约
  • 智能合约Solidity教程-事件和日志(一)
  • 转载:[译] 内容加速黑科技趣谈
  • C# - 为值类型重定义相等性
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • ()、[]、{}、(())、[[]]命令替换
  • (70min)字节暑假实习二面(已挂)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Note)C++中的继承方式
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (四)鸿鹄云架构一服务注册中心
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)linux下的时间函数使用