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

【数据库设计】规范设计理论之数据依赖的公理系统(1)

知道范式的几种分类之后还并不能帮助我们设计一款好的数据库,在对关系进行拆解(指模式分解)之前,我们需要引入一个理论基础让设计过程变得有迹可循和具备一定的严谨性以此来支撑数据库背后的可靠性。

Armstrong公理系统

所谓公理就是那些不证自明的理论,比如欧几里得几何中:可以从任意一点向任意一点画一条直线、可以以任意一点和任意半径画成一个圆等,数据库中也有类似的公理。R<U,F>表示有关系R,且属性集为U,有函数依赖集合F的关系模式,用来描述数据库的关系模式和数据之间的约束关系。假如该关系模式中有任一关系r满足函数依赖X→Y,那么就说F逻辑蕴含X→Y,或者说X→Y是F的逻辑蕴含。根据已知的函数依赖比如A→B,B→C,就可以推理出A→C,或者说逻辑蕴含出A→C,而公理系统定义了几种可以推理的方法:

自反律

假如有U有子集X、Y,并且Y ⊆ X ⊆ U,很明显可以得出X→Y,自己当然可以推出自己,比如关系(Sno,Sname)→Sno。

增广律

有关系(Sno,Cno,Cname),其中存在Sno→Cno的函数依赖,那么也就意味着(Sno,Cname)→(Cno,Cname),就像a=b,那么a+c=b+c.定义是这样的:假设函数依赖集合F逻辑蕴含X→Y,且Z ⊆ U,那么存在XZ→YZ。

传递律

假如F逻辑蕴含X→Y和Y→Z,那么自然X→Z也是F的逻辑蕴含。

延伸规则

根据上面的三个定律可以推导出有下面的规则:

合并规则:若X→Y,Y→Z,则X→YZ。YZ是指Y和Z两个属性集合的并集。

分解规则:若X→Y,且Z⊆Y,那么很显然X→Z

伪传递规则:若X→Y,WY→Z,那么显然有WX→WY,再加上原来的WY→Z,因此自然有WX→Z.

引理1——基于公理

X → A1, A2, ..., An 成立的充分必要条件是 X → Ai (i = 1, 2, 3, ..., n) 成立。充分必要条件是指P⇔Q

两个条件可以互相推,也就意味着这两个条件在逻辑上时等价的。

例题

对于关系模式 R<U,F>U1,U2,U3,U4,U5,U6 是它的属性集 U 的子集,R 满足函数依赖为 {U1→U2U3U3U4→U5U6},证明函数依赖 U1U4→U6 成立。

证明:

因为U1→U2U3由分解规则,所以有U1→U3

再然后,由增广律U1U4→U3U4

U3U4→U5U6由传递律U1U4→U5U6;

最后,由分解规则有U1U4→U6

函数依赖 U1U4→U6 得证。

闭包

借助上面所讲的公理系统,依靠一组函数依赖我们就可以推导出关系中其他的函数依赖,直到全部集结完毕,也叫闭包,指关系R中所蕴含的所有函数依赖,即关系模式 R<U,F>中,由F逻辑蕴含出的所有函数依赖集合,用符号F+表示。除了整个函数的闭包,也可以单指属性集闭包。比如关系R中U={A1, A2, ..., An}, 有属性集合X,当然还有其他的属性集合Y等,那么X属性集合的闭包就是X+F={A|X→A,A是F的逻辑蕴含},那么就称X+F是属性集X关于函数依赖集F的闭包——属性依赖集的闭包。

引理2——基于公理和闭包

U={A1, A2, ..., An} 是关系模式 R中所有属性的集合,F是 U 上的一组函数依赖,X⊆U,Y⊆U,X→Y 能由 F 根据 Armstrong 公理系统推出的充分必要条件是 Y⊆X+F。

所以当我们要使X→Y 的办法是Y⊆X+F,这意味着我们需要求出属性集X的闭包。

具体的算法明天更新。

http://www.lryc.cn/news/473568.html

相关文章:

  • Leetcode 合并两个数组
  • Native Crash 信号速查
  • 【工具变量】自由贸易试验区试点DID数据集(2003-2023年)
  • js-在数组中根据name查找出对应id(find与filter方法)
  • 推荐:自然语言处理方向的一些创新点
  • 成都睿明智科技有限公司抖音电商服务的领航者
  • 【大数据学习 | kafka】kafka的整体框架与数据结构
  • 隐私保护下的数据提取策略
  • vue 和 django 报 CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,
  • 「Mac畅玩鸿蒙与硬件3」鸿蒙开发环境配置篇3 - DevEco Studio 插件安装与配置
  • 【论文阅读】PGAN
  • 基于Unet卷积神经网络的脑肿瘤MRI分割
  • [java][基础]HTTPTomcatServlet
  • 【开源免费】基于SpringBoot+Vue.JS网上超市系统(JAVA毕业设计)
  • 【单片机】深入剖析USART与UART的区别
  • ‌Linux tac命令‌
  • 从简单的demo开始让您逐步了解GetX的用法
  • JAVA的动态代理
  • 「图文详解」Pycharm 远程服务器Debug
  • Golang反射在实际开发中的应用场景
  • 【二叉树】C非递归算法实现二叉树的先序、中序、后序遍历
  • Android——事件冲突处理
  • vue + elementui 全局Loading效果
  • 深度了解flink(十) JobManager(4) ResourceManager HA
  • 【万兴科技-注册_登录安全分析报告】
  • Android启动流程_Zygote阶段
  • 2022NOIP比赛总结
  • Leetcode 排序链表
  • 哈希函数简介
  • nginx------正向代理,反向代理生产,以及能否不使用代理详解