热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

数据库规范化理论、范式、模式分解

函数依赖部分函数依赖;传递函数依赖非关系化关系模式可能存在的问题数据冗余、更新异常(数据不一致)、插入异常、删除异常关系化关系的用途解决非关系化模式存在的问题键相关的概念超键:唯一

函数依赖

部分函数依赖;传递函数依赖

非关系化关系模式可能存在的问题

数据冗余、更新异常(数据不一致)、插入异常、删除异常

关系化关系的用途

解决非关系化模式存在的问题

键相关的概念

超键:

唯一标识元组,可能存在冗余属性

候选键:

唯一标识元组

超键与候选键的差异

比如:(SNo,SName,SSex) 其中(SNo,SName)超键

主键:

在候选键中任意选择一个作为主键

外键:

其他关系的主键

候选键的求法

图示法

先把属性转化为结点,把函数依赖转化为有向箭头
再找入度为0 的结点开始遍历有向图,若能遍历全图则说明该结点就是候选键。
若没有入度为0的结点,则选择既有入度又有出度的结开始遍历。

求候选键的相关例题

《数据库---规范化理论、范式、模式分解》

解题过程分析:

《数据库---规范化理论、范式、模式分解》

先把属性都转化为结点,把函数依赖转化为有向图的边,再从上图中找到入度为0的节点A1,从A1开始遍历有向图,我们发现从A1开始刚好可以遍历整个有向图,所以A1是候选关键字(候选码)

《数据库---规范化理论、范式、模式分解》

解题过程分析:

《数据库---规范化理论、范式、模式分解》

同理:先把属性都转化为结点,把函数依赖都转化为有向图的边,我们开始查找图中入度为0的结点,(转化结点的时候需要注意,由多个属性共同决定的结点需要把多个结点聚合一起后到达目标结点,而不是每个结点直接到达目标结点)观察图中入读为0的结点,发现A、B、C、D都是入读为0的结点,由于图示法已经将图分为了两部分,而由ABCD四个属性共同组成的候选字可以遍历整个有向图。即是,ABCD是所求

《数据库---规范化理论、范式、模式分解》

解题过程分析:

《数据库---规范化理论、范式、模式分解》

前期工作不再赘述,发现图中没有入度为0的结点,我们需要找既有入度又有出度的结点,C可以直接排除,而AB都是这样的结点,AB都可以遍历整个有向图,所以所求为A和B

范式

《数据库---规范化理论、范式、模式分解》

第一范式(1NF)

每个分量都是不可再分的数据项,若不是,只需删除可再分项

第二范式(2NF)

在第一范式的基础上,不存在部分依赖,单属性主键必定没有部分依赖

第三范式(3NF)

在第二范式的基础上没有传递依赖

BC范式(BCNF)

每个函数依赖的左边必须是候选键

模式分解

保持函数依赖分解

原关系的函数依赖全部保留为新的模式

无损(联接)分解

可以还原为原来的表

列表法

《数据库---规范化理论、范式、模式分解》
只要有一行全部为a则该分解为无损分解,适用于分解的表为多表,第一排为原表的属性,第一列为拆分后的关系模式,根据原有的函数依赖进行替换,用a示已有属性或者可以推出的属性,用b表示没有的属性

两表法

《数据库---规范化理论、范式、模式分解》

只适用于一分为二的情况,求分解后模式的、各自,若新依赖中有原有的依赖则为无损分解


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何使用libpq库与PostgreSQL后端建立连接。通过探讨PQconnectdb()函数的工作原理及其在实际应用中的使用方法,帮助读者理解并掌握建立高效、稳定的数据库连接的关键步骤。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文探讨如何设计一个安全的加密和验证算法,确保生成的密码具有高随机性和低重复率,并提供相应的验证机制。 ... [详细]
author-avatar
杜娟小乖_748
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有