关系数据库设计之Armstrong公理详解
一、Armstrong公理简介
Armstrong公理是一组在关系数据库理论中用于推导属性依赖的基本规则。这些公理是以著名计算机科学家威廉·阿姆斯特朗(William W. Armstrong)命名的。Armstrong公理提供了一种形式化的方法,用于推导关系数据库中的所有属性依赖。通过使用这套公理,我们可以理解和掌握一个数据库的所有潜在的属性依赖,从而帮助设计合理的数据库模式,确保数据的一致性与完整性。
在关系数据库中,属性依赖是一个核心概念。它描述了一个属性集合如何通过另一个属性集合来确定,换句话说,若存在两个属性集合 ( X ) 和 ( Y ),若 ( X ) 可以唯一地确定 ( Y ),那么我们说 ( X → Y ),即 ( Y ) 函数依赖于 ( X )。Armstrong公理为我们提供了推导属性依赖的基础工具,使得我们能够通过有限的一组规则来确定数据库中的所有可能存在的依赖。
二、Armstrong公理的组成
Armstrong公理包括三条基本规则,它们分别是:
1. 反身性
若属性集合 ( Y ) 是 ( X ) 的子集,则 ( X → Y ) 成立。即:
2. 增广性
如果 ( X → Y ),则 ( XZ → YZ ) 也成立。即,如果 ( Y ) 是 ( X ) 的函数依赖属性,则在任何集合 ( Z ) 加入到两侧的情况下,依赖关系仍然成立:
3. 传递性
如果 ( X → Y ) 且 ( Y → Z ),则 ( X → Z ) 也成立。即:
三、Armstrong公理的扩展
上述三条公理是推导数据库中所有函数依赖关系的基础。在实际应用中,这三条基本规则常与如下推导规则一起使用,这些规则可从Armstrong公理中导出,帮助我们更高效地推导依赖关系:
1.并合性
如果 ( X → Y ) 且 ( X → Z ),则 ( X → YZ )。换句话说,如果一个属性集合可以分别决定两个属性集,它也可以决定它们的并集。并合性可以通过反复使用Armstrong公理的增广性和传递性推导出来:
2.分解性
如果 ( X → YZ ),那么 ( X → Y ) 和 ( X → Z ) 都成立。即,如果一个属性集合可以决定某个并集,那么它也可以决定并集中的每一个子集。分解性也是通过Armstrong公理推导出来的:
3.伪传递性
伪传递性是一种类似于传递性的规则,它表明如果 ( X → Y ) 且 ( WY → Z ),则 ( WX → Z ) 成立。这条规则适用于处理那些不仅依赖于单个属性集合的复杂函数依赖关系:
四、Armstrong公理的应用
Armstrong公理在关系数据库设计的多个方面都有应用,尤其在以下几个领域:
1. 规范化
关系数据库的规范化过程旨在减少数据冗余和避免插入、删除和更新异常。在规范化过程中,我们需要识别关系中的所有函数依赖,以便将关系分解为更小的、没有冗余的子关系。Armstrong公理在这一过程中扮演了重要角色,它帮助我们推导出所有可能的依赖关系,从而更好地进行分解。
例如,在第三范式(3NF)的分解过程中,我们需要确保所有非主属性完全依赖于主键,而不是部分依赖或传递依赖。通过使用Armstrong公理的传递性规则,我们能够识别传递依赖,从而进行适当的分解。
2. 属性闭包
属性闭包是关系数据库设计中的一个重要工具,用于确定一个属性集合的所有可以通过函数依赖推导出的属性。Armstrong公理的反身性、增广性和传递性规则在计算属性闭包时尤为重要。通过应用这些公理,我们能够系统地推导出一个属性集合能够确定的所有属性。
例如,给定一个关系模式 ( R(A, B, C, D) ) 和已知的依赖关系 ( A → B ) 和 ( B → C ),我们可以通过计算 ( A ) 的闭包来确定 ( A ) 可以唯一决定哪些属性。根据Armstrong公理的传递性,闭包计算结果为 ( A^+={A, B, C} )。
3. 推导最小依赖集
在设计数据库时,我们通常希望找到一个最小的函数依赖集,即在保留所有推导能力的前提下,减少冗余的依赖关系。Armstrong公理在推导最小依赖集的过程中非常有用,因为它允许我们系统化地分析哪些依赖是可以从其他依赖推导出来的,从而简化依赖集。
五、Armstrong公理与数据库规范化
Armstrong公理在数据库的规范化过程中发挥着关键作用。规范化旨在将关系数据库中的关系模式分解为更小的、无冗余的子关系,以确保数据一致性并避免更新异常。规范化的目标是使数据库达到某些范式(Normal Form),如第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及BCNF(Boyce-Codd Normal Form)。
1. 第一范式(1NF)
第一范式要求所有属性的值都是原子的,即不可再分割。Armstrong公理在1NF中的作用相对较少,因为这一范式主要关注的是数据的基本结构。
2. 第二范式(2NF)
第二范式要求所有非主属性完全依赖于主键,即不存在部分依赖。通过Armstrong公理中的传递性和反身性,我们能够识别哪些非主属性部分依赖于主键,然后根据这些依赖进行分解,确保关系模式符合2NF。
3. 第三范式(3NF)
第三范式进一步要求消除传递依赖,即非主属性不能依赖于其他非主属性。Armstrong公理的传递性规则在3NF的分解中尤为重要。通过传递性,我们能够识别出隐含的传递依赖,然后对关系模式进行适当分解,确保其符合3NF。
4. BCNF
BCNF是一种更严格的第三范式,它要求每个函数依赖的左侧必须是超键。通过Armstrong公理中的各种推导规则,我们能够识别哪些属性不是超键,从而进行更细致的分解,确保模式符合BCNF。
六、Armstrong公理的局限性
尽管Armstrong公理非常强大,但它并不是完备的,它存在一些局限性,尤其是在处理更复杂的依赖关系时。
1. 无法处理多值依赖
Armstrong公理只能处理函数依赖,而无法处理多值依赖。多值依赖是一种更复杂的依赖关系,它描述了一个属性集的多值与另一个属性集之间的依赖。对于多值依赖,我们需要引入其他规则,如第五范式(5NF)等。
2. 无法处理连接依赖
连接依赖是一种更为复杂的依赖关系,它涉及关系的连接操作。Armstrong公理无法直接推导出这样的依赖。对于处理连接依赖的场景,通常需要结合其他理论工具,如第六范式(6NF)等。
3. 难以处理大规模依赖集
在处理大规模依赖集时,尽管Armstrong公理提供了系统化的推导工具,但由于依赖链条过长,实际操作中的推导过程可能会变得非常复杂且难以管理。
相关文章:

关系数据库设计之Armstrong公理详解
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 一、Armstrong公理简介 Armstrong公理是一组在关系数据库理论中用于推导属性依赖的基本规则。这些公理是以著名计算机科学家威廉阿姆斯特朗&…...

【Geoserver使用】SRS处理选项
文章目录 前言一、Geoserver的三种SRS处理二、对Bounding Boxes计算的影响总结 前言 今天来看看Geoserver中发布图层时的坐标参考处理这一项。根据Geoserver官方文档,坐标参考系统 (CRS) 定义了地理参考空间数据与地球表面实际位置的关系。CRS 是更通用的模型&…...

python里面的单引号和双引号的区别
在Python中,单引号(‘’)和双引号(“”)在大多数情况下是等价的,没有本质区别。它们都用于创建字符串。以下是一些关键点: 功能相同: 两者都可以用来定义字符串,例如&…...

为什么不要在循环,条件或嵌套函数中调用hooks
为什么不要在循环,条件或嵌套函数中调用hooks 前言useState Hook 的工作原理具体实现1、初始化2、第一次渲染3、后续渲染4、事件处理简单代码实现 为什么顺序很重要Bad Component 第一次渲染Bad Component 第二次渲染 总结 前言 自从 React 推出 hooks 的 API 后&a…...

将成功请求的数据 放入apipost接口测试工具,发送给后端后,部分符号丢失
将成功请求的数据 放入apipost接口测试工具,发送给后端后,部分符号丢失 apipost、接口测试、符号、丢失、错乱、变成空格背景 做CA对接,保存CA系统的校验数据,需要模仿前端请求调起接口,以便测试功能完整性。 问题描…...

N诺计算机考研-错题
B A.LLC,逻辑链路控制子层。一个主机中可能有多个进程在运行,它们可能同时与其他的一些进程(在同一主机或多个主机中)进行通信。因此在一个主机的 LLC子层的一个服务访问点,以便向多个进程提供服务。B.MAC地址,称为物理地址、硬件地址,也称为局域网地址,用来定义网络设…...

vue3 数字滚动组件封装
相关参考文献 干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React) Vue3 插件方式 安装插件: countup.js 封装组件: components/count-up/index.js <template><div class="countup-wrap"><slot name="prefix"></slot&g…...

如何确保消息只被消费一次:Java实现详解
引言 在分布式系统中,消息传递是系统组件间通信的重要方式,而确保消息在传递过程中只被消费一次是一个关键问题。如果一个消息被多次消费,可能会导致业务逻辑重复执行,进而产生数据不一致、错误操作等问题。特别是在金融、电商等…...

Web3技术在元宇宙中的应用:从区块链到智能合约
随着元宇宙的兴起,Web3技术正逐渐成为其基础,推动着数字空间的重塑。元宇宙不仅是一个虚拟世界,它还代表着一个由去中心化技术驱动的新生态系统。在这个系统中,区块链和智能合约发挥着至关重要的作用,为用户提供安全、…...

关于QSizeGrip在ui界面存在布局的情况下的不显示问题
直接重写resizeEvent你会发现:grip并没有显示 void XXXXX::resizeEvent(QResizeEvent *event) {QWidget::resizeEvent(event);this->m_sizeGrip->move(this->width() - this->m_sizeGrip->width() - 3,this->height() - this->m_sizeGrip->…...

开始场景的制作+气泡特效的添加
3D场景或2D场景的切换 1.新建项目时选择3D项目或2D项目 2.如下图操作: 开始前的固有流程 按照如下步骤进行操作,于步骤3中更改Company Name等属性: 本案例分辨率可以如下设置,有能力者可根据需要自行调整: 场景制作…...

位运算--(二进制中1的个数)
位运算是计算机科学中一种高效的操作方式,常用于处理二进制数据。在Java中,位运算通常通过位移操作符和位与操作符实现。 当然位运算还有一些其他的奇淫巧计,今天介绍两个常用的位运算方法:返回整数x的二进制第k位的值和返回x的最…...

使用Docker和Macvlan驱动程序模拟跨主机跨网段通信
以下是使用Docker和Macvlan驱动程序模拟跨主机跨网段通信的架构图: #mermaid-svg-b7wuGoTr6eQYSNHJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-b7wuGoTr6eQYSNHJ .error-icon{fill:#552222;}#mermai…...

RestCloud webservice 流程设计
RestCloud webservice 流程设计 操作步骤 离线数据集成(首页) → \rightarrow → 示例应用数据集成流程(边栏) → \rightarrow → 所有数据流程 → \rightarrow → webservice节点获取城市列表 → \rightarrow → 流程设计 …...

从入门到精通:QT 100个关键技术关键词
Qt基础概念 Qt Framework - 一个跨平台的C图形用户界面应用程序开发框架。它不仅提供了丰富的GUI组件,还包括网络、数据库访问、多媒体支持等功能。 Qt Creator - Qt官方提供的集成开发环境(IDE),集成了代码编辑器、项目管理工具、…...

2024年双十一值得入手的好物有哪些?五大性价比拉满闭眼入好物盘点
随着2024年双十一购物狂欢节的临近,消费者们纷纷开始关注各类好物,期待在这一天能够以最优惠的价格入手心仪的商品,在这个特殊的时刻,我们为大家盘点了五大性价比拉满的闭眼入好物,这些产品不仅品质卓越,而…...

Hbase日常运维
1 Hbase日常运维 1.1 监控Hbase运行状况 1.1.1 操作系统 1.1.1.1 IO 群集网络IO,磁盘IO,HDFS IO IO越大说明文件读写操作越多。当IO突然增加时,有可能:1.compact队列较大,集群正在进行大量压缩操作。 2.正在执行…...

鸿蒙开发的基本技术栈及学习路线
随着智能终端设备的不断普及与技术的进步,华为推出的鸿蒙操作系统(HarmonyOS)迅速引起了全球的关注。作为一个面向多种设备的分布式操作系统,鸿蒙不仅支持手机、平板、智能穿戴设备等,还支持IoT(物联网&…...

【算法】反向传播算法
David Rumelhart 是人工智能领域的先驱之一,他与 James McClelland 等人在1986年通过其著作《Parallel Distributed Processing: Explorations in the Microstructure of Cognition》详细介绍了反向传播算法(Backpropagation),这一…...

外贸非洲市场要如何开发
刚不久前中非合作峰会论坛之后,取消了非洲33国的进口关税,中非贸易一直以来都还不错,这次应该会更上一个台阶。今天就来给大家分享一下,关于非洲市场的一些分析和开发方法。 一、非洲市场情况 非洲是一个广阔的大陆,由…...

python去除空格join()
sinput().split() print( .join(s)) input().split()的作用: split()是字符串对象的方法。当对一个字符串调用split()方法时,它会根据指定的分隔符将字符串分割成多个子字符串,并将这些子字符串以列表的形式返回。如果不指定分隔符…...

git push错误:Out of memory, malloc failed (tried toallocate 947912704 bytes)
目录 一、错误截图 二、解决办法 一、错误截图 因项目文件过大,http.postBuffer设置的内存不够,所以报错。 二、解决办法 打开cmd窗口,执行如下命令即可 git config --global http.postBuffer 1024000000 如图所示 执行完成以后&#…...

web平台搭建-LAMP(CentOS-7)
一. 准备工作 环境要求: 操作系统:CentOS 7.X 64位 网络配置:nmtui字符终端图形管理工具或者直接编辑配置文件 关闭SELinux和firewalld防火墙 防火墙: 临时关闭:systemctl stop firewalld 永久关闭:systemc…...

2024.9.21 Python与C++的面试八股文整理,类与对象,内存规划,默认函数,虚函数,封装继承多态
1.什么是类,什么是面向对象 (1)类是一种蓝图或者模板,用于定义对象的属性和行为,类通常包括:属性,也就是静态特征,方法,也就是动态特征。属性描述对象的特征,…...

2024 vue3入门教程:02 我的第一个vue页面
1.打开src下的App.vue,删除所有的默认代码 2.更换为自己写的代码, 变量msg:可以自定义为其他(建议不要使用vue的关键字) 我的的第一个vue:可以更换为其他自定义文字 3.运行命令两步走 下载依赖 cnpm i…...

[go] 状态模式
状态模式 允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 模型说明 上下文 (Context) 保存了对于一个具体状态对象的引用, 并会将所有与该状态相关的工作委派给它。 上下文通过状态接口与状态对象交互&…...

uniapp沉浸式导航栏+自定义导航栏组件
在 UniApp 中实现沉浸式导航栏并结合自定义导航栏组件 一、沉浸式导航栏设置 在pages.json中配置页面样式 在需要设置沉浸式导航栏的页面的style选项中进行如下配置: {"pages": [{"path": "pages/pageName/pageName","style&qu…...

光伏仿真:排布设计如何优化用户体验?
1、屋顶绘制精准 光伏系统的性能直接受到屋顶结构的影响,因此,屋顶绘制的精准性是光伏仿真设计的首要任务。现代光伏仿真软件通过直观的界面和强大的图形编辑功能,使得用户能够轻松导入或绘制出待安装光伏系统的屋顶形状。无论是平面屋顶、斜…...

Vue使用axios二次封装、解决跨域问题
1、什么是 axios 在实际开发过程中,浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后,官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的详细介…...

鸿萌数据恢复:如何降低 RAM 故障风险,以避免数据丢失?
天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 RAM 可能因多种原因而发生故障,并将设备和数据置…...