数据库设计范式(二)之巴斯范式第四范式第五范式以及域键范式
目录
概述
巴斯范式
1.案例
2.是否符合三范式
3.存在的问题
4.问题解决
第四范式(了解即可)
第五范式、域键范式(了解即可)
小结
概述
之前我们讲过数据库设计范式的第一范式,第二范式以及第三范式,以及还说了在实际业务需求中如何使用反范式优化我们的查询。这篇文章我们来谈一下巴斯范式以及第四范式和第五范式。
巴斯范式
人们在三范式的基础上进行了改进,提出巴斯范式,也叫做巴斯-科德范式。巴斯范式被认为没有新的设计加入,仅仅是对第三范式中的设计规范要求更强,使得数据库冗余度更小。所以,称为是修正的第三范式或扩充的第三范式,不被称为第四范式。
若一个关系达到第三范式,并且它只有一个候选键或者它的每个候选键都是单属性,则该关系自然就达到巴斯范式。
1.案例
我们分析如下表的范式情况:
在这个表中,一个仓库只有一个管理员,同时一个管理员也只是管理一个仓库,我们先来梳理下这些属性之间的依赖关系。
仓库名决定了管理员,管理员也决定了仓库名,同时(仓库名,物品名)的属性集合可以决定数量这个属性。这样我们可以找到数据表的候选键了。
候选键:是(管理员,物品名)和(仓库名,物品名),然后我们从候选键选择一个作为主键,比如(仓库名,物品名)。
主属性:包含在任一候选键中的属性,也就是仓库名,管理员和物品名
非主属性:数量这个属性
2.是否符合三范式
如何判断一张表的范式呢?我们需要根据范式的等级,从低到高来进行判断。
首先,数据表每个属性都是原子性的,符合第一范式要求。
其次,数据表中的非主属性 数量这个字段都与候选键全部依赖。因此符合第二范式。
最后,数据表中的非主属性不传递依赖于候选键,符合第三范式。
3.存在的问题
既然数据表已经符合了三范式要求,是不是就不存在问题了呢?我们来看下面的情况:
1.增加一个仓库,但是还没有存放任何物品。根据数据表实体完整性约束主键不能有空值,因此会插入异常。
2.如果仓库更换了管理员,我们可能会修改数据表中的多条记录。
3.如果仓库管理的商品被卖空了,那么此时仓库名称和对应的管理员名称也会随之被删除。
4.问题解决
首先我们需要确认造成异常的原因:主属性仓库名对于候选键(管理员,物品名)是部分依赖关系,这样就有可能导致上面的异常情况。因此引入巴斯范式,它在三范式基础上清除了主属性对候选键的部分依赖或者传递依赖关系。
如果在关系R中,U作为主键,A属性是主键的一个属性,若存在A->Y,Y为主属性,则该关系不属于巴斯范式。
根据巴斯范式的要求,我们需要把仓库管理关系表拆成如下:
这样就不存在主属性对候选键而部分依赖,上面的表就符合巴斯范式。
第四范式(了解即可)
多值依赖关系的概念:
- 多值依赖,即属性之间的一对多关系,即为k→→A。
- 函数依赖,事实上是单质依赖,所以不能表达属性之间的一对多关系。
- 平凡的多值依赖,全集U=K+A,一个K可以对应于多个A,也可以对应于多个B,A与B互相独立,即K→→A,K→→B。整个表有多组一对多关系,且有:一部分是相同的属性集合,多部分是相互独立属性集合。
第四范式即在满足巴斯范式基础上,消除非平凡函数依赖的多值依赖,即把同一表内的多对多关系删除。
第五范式、域键范式(了解即可)
除了第四范式我们还有更高级的第五范式和域键范式
在满足第四范式的基础上消除不是由候选键索蕴含的连续依赖。如果关系模式R中每一个连接依赖均由R的候选键蕴含 则称此关系模式符合第五范式。
函数依赖是多值依赖的一种特殊情况,而多值依赖实际上是连接依赖的一种特殊情况。但连接依赖不像是函数依赖和多值依赖可以由语义直接导出,而是在关系连接运算时才反映出来。存在连接依赖关系模式仍可能遇到数据冗余插入、修改、删除异常等问题。
第五范式处理的是无损连接问题,这个范式基本没有实际意义,因为无损连接很少出现,而且难以察觉。而域键范式试图定义一个终极范式,该范式考虑所有依赖和约束类型,但是实用价值是最小的,只存在理论研究中。
小结
我们在实际开发中一般只考虑第一到第三范式即可或者再加上一个巴斯范式。因为越往后拆的表就越多从而导致查询的连接就越多。
数据库设计范式(二)之巴斯范式第四范式第五范式以及域键范式相关推荐
- 使用PowerDesigner做数据库设计(二)
使用PowerDesigner做数据库设计(二) CDM设计后续 在上一篇文章中,有一点给忘记了,在CDM设计窗口中,如果在设计中,实体entity越来越多,实体entity间的关系也会越来越复杂,像 ...
- 数据库设计(二)——数据库设计原则
一.数据库表的设计原则 1.不应该针对整个系统进行数据库设计,而应该根据系统架构中的组件划分,针对每个组件所处理的业务进行组件单元的数据库设计:不同组件间所对应的数据库表之间的关联应尽可能减少,如果不 ...
- 博客系统 - 数据库设计(二)
@R星校长 第2关:数据库表设计 - 核心表 核心表设计 设计编写完用户信息表之后,我们就需要设计博客系统的核心表了,在这里我们编写三个表分别是: 博客类型表: 博客信息表: 博客评论表. 博客类型表 ...
- 基于Jeecgboot前后端分离的ERP系统开发数据库设计(二)
-- ---------------------------- -- Table structure for erp_goods -- ---------------------------- DRO ...
- (转)数据库设计范式深入浅出
关系数据库设计之时是要遵守一定的规则的.尤其是数据库设计范式现简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另有第四范式和第五范式留到以后再介绍.在你设计数据库之时,若 ...
- 数据库设计范式深入浅出
关系数据库设计之时是要遵守一定的规则的.尤其是数据库设计范式现简单介绍1NF(第一范式),2NF(第二范式),3NF(第三范式)和BCNF,另有第四范式和第五范式留到以后再介绍.在你设计数据库之时,若 ...
- 第4章 数据库设计---数据库原理及应用
目录 一.数据库设计方案 1. 数据库应用架构设计:单用户.集中.CS.分布 2. 数据库结构设计:概念.逻辑.物理 3. 数据库应用访问方式设计:访问方式 数据库结构设计模型 概念数据模型:概念,不 ...
- 数据库表的软硬关联_Jimmy的关系型数据库设计心得 第一版
欢迎关注Jimmy的公众号:Jimmy嘚啵嘚,每周都有很多干货文章分享(最近比较懒,先保证每周写几篇,等忙完了再每日更新) 最近在梳理以前设计关系型数据库的心得体会,或者斗胆说是方法论,梳理出一些感觉 ...
- 实验五——数据库设计实验
实验五--数据库设计实验 一.实验题目 二. 实验内容和要求 三.实验步骤 1.分析问题 2.概念结构设计 3.逻辑结构设计 四.实验心得体会 一.实验题目 数据库设计实验 二. 实验内容和要求 掌握 ...
最新文章
- 精通ASP.NET中弹出窗口技术
- 文件服务器:共享文件夹的移动和权限设置备份2012-04-28
- java多线程编程——锁优化
- java内核_测量时间:从Java到内核再到
- vue radio双向绑定_Vue 双向绑定
- Springboot记录
- C++面试题整理,希望对大家有所帮助
- pycharm怎么安装python3.6_【python】Mac在Pycharm中导入python3.6(简单易行)
- 一款好看的pycharm主题Atom One Dark
- 要打理好自己的钱袋子
- 微信下单、支付流程和注意事项
- 记一次某制造业ERP系统 CPU打爆事故分析
- Outlook2016 使用技巧
- 2017二本各大学计算机分数线,2017全国二本大学排名及分数线查询 (2017二本大学名单一览)...
- 历史名人 明朝成化仙游抗倭首领总捕头——魏升
- 为什么手机移动4G信号满格,网速却非常慢?这些原因你知道吗
- PHP面试高频算法面试题 -- 判断链表是否有环
- Markdown——下载链接与语法说明
- Unity 动画系统:Animator
- P5587 打字练习
热门文章
- CentOS7 彻底卸载 MySQL5.7 (保姆级)
- SpringBoot--配置Druid(德鲁伊)数据源监控
- Nginx官方文档(四十六)【ngx_stream_access_module|ngx_stream_geo_module|ngx_stream_geoip_module】
- FMS学习(一):了解FMS的基本概念
- java利用jacob,文字转语音文件,windows
- 亚马逊开奖!应届生总包50w+
- python Tkinter color
- 色彩静物画法:先找体积再塑造细节~
- Z3 SMTsolver 学习笔记(一) ——安装,环境配置篇
- Oracle插入数据每5000条提交一次