热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

数据库规范化设计(函数依赖、三大范式)

数据库设计6.1函数依赖关系模式中的各属性之间相互依赖、相互制约的联系称为数据依赖。数据依赖有函数依赖、多值依赖。函数依赖(FD,FunctionalDependency)是关系模

数据库设计

6.1 函数依赖

关系模式中的各属性之间相互依赖、相互制约的联系称为数据依赖。数据依赖有函数依赖 、多值依赖。

函数依赖(FD ,Functional Dependency)是关系模式中属性之间的一种逻辑依赖关系。

函数依赖的定义:设关系模式R(U,F), U是属性全集,F是U上的函数依赖所构成的集合,X和Y是U的子集,如果对于R(U)的任意一个可能的关系r ,对于X的每一具体值,Y 都有唯一的具体值与之对应,则称X决定函数Y ,或Y函数依赖于X,记作X→Y。我们称X为决定因素, Y为依赖因素。当Y不函数依赖于X 时,记作:X/→Y。当X→Y且Y→X时,则记作:X↔Y。

U={SNo,SN,Age,Dept,MN,CNo,Score}

F={SNo→SN,SNo →Age,SNo→ Dept, (SNo ,CNo)→ Score}

 

设有关系模式R(U),U是属性全集,X和Y是U的子集。

完全函数依赖如果 X→ Y ,并且对于 X 的任何一个真子集 X' ,都有 X'/→Y , 则称 Y 对 X 完全函数依赖,记作X→Y(箭头上加  f)。

部分函数依赖如果对 X 某个真子集 X', 有 X'→Y , 则称 Y 对 X 部分函数依赖,记作 X→Y(箭头上加 p)。

只有当决定因素是组合属性时,讨论部分函数依赖才有意义;当决定因素是单属性时,只能是完全函数依赖。

传递函数依赖:设有关系模式 R(U) ,U 是属性全集,X,Y,Z是 U 的子集。

若X→ Y ,但 Y/→X,而Y→Z(Y∉Z,Z∉Y),则称 Z 对 X 传递函数依赖,记作:X → Z (箭头上加 t)。如果 Y→X,则 X↔Y , 这时称 Z对 X 直接函数依赖,而不是传递函数依赖。


6.2 范式

把关系数据库的规范化过程中为不同程度的规范化要求设立的不同标准称为范式(Normal Form)。关系数据库中的关系必须满足一定的要求。满足不同程度要求的为不同范式

各种范式之间存在联系:5NF⊂4NF⊂3NF⊂2NF⊂1NF

某一关系模式R为第n范式,可简记为R∈ nNF。一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。


6.2.1 第一范式

如果关系模式R的所有的域为简单域,其元素不可再分,则称R为第一范式的关系,简记为R∈ 1NF

1NF的关系模式要求属性不能再分,即属性项不能是属性组。

第一范式是对关系模式的最起码的要求。不满足第一范式的数据库模式不能称为关系数据库

但是满足第一范式的关系模式并不一定是一个好的关系模式

例:

 


6.2.2 第二范式

若R∈1NF,且每一个非主属性完全函数依赖于任何一个候选码,则R∈2N。

2NF解决了插入异常的问题,如果一个关系模式R不属于2NF,便会产生以下几个问题问题:



  1. 插入异常:假设 Sno = 07102 , Sdept = CS的学生还未选课,因课程号是主属性,因此该学生的信息无法插入SMC

  2. 删除异常:假定某个学生本来只选修了3号课程这一门课·现在因身体不适,他连3号课程也不选修了。因课程号是主属性,此操作将导致该学生信息的整个元组都要删除

  3. 修改复杂:例如学生转系,在修改此学生元组的Sdept 值的同时,还可能需要修改系主任的名字。如果这个学生选修了K门课,则必须无遗漏地修改K个元组中全部 Sdept · Mname信息

  4. 数据冗余度大:如果一个学生选修了10门课程,那么他的Sdept和Mname 值就要重复存储了10次

采用投影分解法将一个1NF的关系分解为多个2NF的关系,可以在一定程度上减轻原1NF关系中存在的插入异常、删除异常﹑数据冗余度大、修改复杂等问题

·将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余


6.2.3 第三范式

3NF:关系模式R中若不存在这样的码X﹑属性组丫及非主属性Z(Y ⊈Z),使得× ->Y,Y →z,y ↛X ,成立,则称R∈3NF若。R∈ 3NF,则每一个非主属性既不部分依赖于码也不传递依赖于码

采用投影分解法将一个2NF的关系分解为多个3NF的关系,可以在一定程度上解决原2NF关系中存在的插入异常﹑删除异常﹑数据冗余度大﹑修改复杂等问题。

将一个2NF关系分解为多个3NF的关系后,并不能完全消除关系模式中的各种异常情况和数据冗余


6.2.4 BCNF

BC范式(BCNF):设关系模式R ∈ 1NF ,如果对于R的每个两数依赖X→Y,若Y ∉X,则X必含有候选码,那么R∈BCNF。若R∈ BCNF:每一个决定属性集(因素)都包含候选码,R中的所有属性(主,非主属性)都完全函数依赖于码。


6.2.5 小结

范式的优点:

1)范式化的数据库更新起来更加快;

2)范式化之后,只有很少的重复数据,只需要修改更少的数据;

3)范式化的表更小,可以在内存中执行;

4)很少的冗余数据,在查询的时候需要更少的distinct或者group by语句。

范式的缺点:

范式化的表,在查询的时候经常需要很多的关联,因为单独一个表内不存在冗余和重复数据。这导致,稍微复杂一些的查询语句在查询范式的schema上都可能需要较多次的关联。这会增加让查询的代价,也可能使一些索引策略无效。因为范式化将列存放在不同的表中,而这些列在一个表中本可以属于同一个索引。

反范式的优点:

1)可以避免关联,因为所有的数据几乎都可以在一张表上显示;

2)可以设计有效的索引;

反范式的缺点:

表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失。



推荐阅读
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • Spring Boot使用AJAX从数据库读取数据异步刷新前端表格
      近期项目需要是实现一个通过筛选选取所需数据刷新表格的功能,因为表格只占页面的一小部分,不希望整个也页面都随之刷新,所以首先想到了使用AJAX来实现。  以下介绍解决方法(请忽视 ... [详细]
  • 使用Echarts for Weixin 小程序实现中国地图及区域点击事件
    本文介绍了如何使用Echarts for Weixin在微信小程序中构建中国地图,并实现区域点击事件。包括效果展示、条件准备和逻辑实现的具体步骤。 ... [详细]
  • mysql 授权!!
    为什么80%的码农都做不了架构师?MySQL的权限系统围绕着两个概念:认证-确定用户是否允许连接数据库服务器授权-确定用户是否拥有足够的权限执 ... [详细]
  • AngularJS 控制器详解
    本文通过一个示例详细介绍了 AngularJS 控制器的使用方法,并探讨了控制器之间数据共享的问题。 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 一个建表一个执行crud操作建表代码importandroid.content.Context;importandroid.database.sqlite.SQLiteDat ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • Linux bash 命令行下实现可视化文件或文件夹浏览
    Linuxbash命令行下实现可视化文件或文件夹浏览  有时候部署环境,需要配置文件路径或者载入相应的配置文件。这种情况下,如果用传统的手动修改配置的方式配置,会比较容易出意外(比 ... [详细]
  • 本文详细介绍了 JavaScript 中面向对象编程的基本概念,包括对象的创建、工厂模式、构造函数、原型及其优缺点,并探讨了继承的多种实现方式。 ... [详细]
  • 本文介绍了 jQuery 的基本使用方法,包括文档就绪函数和常用的鼠标事件处理,以及各种选择器的详细说明。 ... [详细]
  • 短视频app源码,Android开发底部滑出菜单首先依赖三方库implementationandroidx.appcompat:appcompat:1.2.0im ... [详细]
author-avatar
手机用户2702933521
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有