数据库引论:5、关系数据库设计理论

5.1 好的关系设计的特点

​ 没有冗余,例如 i n _ d e p in\_dep in_dep模式:
i n _ d e p ( I D , n a m e , s a l a r y , d e p t _ n a m e , b u i l d i n g , b u d g e t ) in\_dep(ID,name,salary,dept\_name,building,budget) in_dep(ID,name,salary,dept_name,building,budget)
​ 表示 i n s t r u c t o r instructor instructor d e p a r t m e n t department department的关系上进行自然连接的结果,但实际上存在许多冗余,对于同一个院系的老师(例如 C o m p . S c i . Comp.Sci. Comp.Sci.),每一个元组都在 b u i l d i n g building building属性上冗余了。

​ 此外,如果想要创建一个新的院系,是一件比较麻烦的事情,或许可以通过插入空值来实现,但这样可能会导致不可预料的错误。

​ 那么这个模式就不是一个好的关系

5.1.1 分解

​ 避免模式中信息重复的唯一方式是将其分解为两个模式,单并非所有的模式分解都是有益的,例如:
e m p l o y e e ( I D , n a m e , s t r e e t , c i t y , s a l a r y ) employee(ID,name,street,city,salary) employee(ID,name,street,city,salary)
​ 分解为以下两个模式:
KaTeX parse error: Expected 'EOF', got '&' at position 2: &̲employee1(ID,na…
​ 存在如下缺陷:如果存在同名的两个员工,我们将其自然连接后,无法分辨到底是谁,反而多了很多无意义的元组。实际上,分解后得到了更多的元组,但却获得了更少的信息,这是因为我们丢失了正确连接的信息。

​ 我们将这样的分解称为有损分解,而将那些没有信息丢失的称为无损分解

图1 不好的分解导致信息丢失

5.1.2 无损分解

​ 令 R R R为关系模式,并令 R 1 R_1 R1 R 2 R_2 R2构成 R R R的分解,即 R = R 1 ∪ R 2 R=R_1\cup R_2 R=R1R2,如果对于所有合法的数据库实例,关系 r r r都包含与下述SQL查询的结果相同的元组集,我们称该分解是无损的:

	select *
	from (select R1 from r)
		natural join
		(select R2 from r)

​ 或用关系代数表示为: Π R 1 ( r ) ⋈ Π R 2 ( r ) = r \Pi_{R_1}(r)\Join \Pi_{R_2}(r)=r ΠR1(r)ΠR2(r)=r

​ 类似的,如果 r r r是真子集,即$r\sub\Pi_{R_1}®\Join \Pi_{R_2} $,那么分解是有损的

5.2 使用函数依赖进行分解

​ 在真实世界中的数据上通常存在各种约束(规则)。例如,在一个大学数据库中期望满足的一些约束有:

  1. 学生和教师通过他们的ID来唯一识别
  2. 每位学生和教师只有一个名字
  3. 每位教师和学生只(主要)关联一个系
  4. 每个系只有一个预算值,并且只有一栋关联的办公楼

​ 一个关系的满足所有这种真实世界约束的实例被称为该关系的合法实例(legal instance)

5.2.2 码和函数依赖

​ 在之前,我们将超码定义为:能够一起来唯一标识出关系中一个元组的一个或多个属性的集合。在这里,重新定义如下:

​ 给定 r ( R ) r(R) r(R) R R R的一个子集 K K K r ( R ) r(R) r(R)超码的条件是:

​ 在 r ( R ) r(R) r(R)的任意合法实例中,对于 r r r的实例中的所有元组对 t 1 t_1 t1 t 2 t_2 t2总满足:若 t 1 ≠ t 2 t_1\ne t_2 t1=t2 t 1 [ K ] ≠ t 2 [ K ] t_1[K]\neq t_2[K] t1[K]=t2[K],也就是在关系 r ( R ) r(R) r(R)的任意合法实例中,不存在两个元组在属性值 K K K上具有相同的值。

​ 考虑一个关系模式 r ( R ) r(R) r(R),并且令 α ⊆ R \alpha \subseteq R αR β ⊆ R \beta \subseteq R βR

  • 给定 r ( R ) r(R) r(R)的一个实例,如果对于该实例中的所有元组对 t 1 t_1 t1 t 2 t_2 t2,使得若 t 1 [ α ] = t 2 [ α ] t_1[\alpha]=t_2[\alpha] t1[α]=t2[α],则 t 1 [ β ] = t 2 [ β ] t_1[\beta]=t_2[\beta] t1[β]=t2[β]也成立,那么我们称该实例满足函数依赖 α → β \alpha \rightarrow \beta αβ
  • 如果 r ( R ) r(R) r(R)的每个合法实例都满足函数依赖 α → β \alpha\rightarrow \beta αβ,则我们称该函数依赖在模式 r ( R ) r(R) r(R)成立(hold)

​ 利用函数依赖的表达方式,我们可以对超码和候选码进行重新定义

K K K是关系表 R R R的一个超码,如果 K → R K\rightarrow R KR

K K K是关系表 R R R的一个候选码,如果 K → R   a n d   n o   a ⊂ K , a → R K\rightarrow R \ and\ no \ a\subset K,a\rightarrow R KR and no aK,aR

​ 考虑之前提过的模式:
i n _ d e p ( I D , n a m e , s a l a r y , d e p t _ n a m e , b u i l d i n g , b u d g e t ) in\_dep(ID,name,salary,dept\_name,building,budget) in_dep(ID,name,salary,dept_name,building,budget)
​ 对于一个系,他的预算是唯一的,那么函数依赖 d e p t _ n a m e → b u d g e t dept\_name\rightarrow budget dept_namebudget成立,此外,属性对 ( I D , d e p t _ n a m e ) (ID,dept\_name) (ID,dept_name)构成 i n _ d e p in\_dep in_dep的一个超码,可写作:
I D , d e p t _ n a m e → n a m e , s a l a r y , b u i l d i n g , b u d g e t ID,dept\_name \rightarrow name,salary,building,budget IDdept_namename,salary,building,budget
​ 我们可以发现,函数依赖是否成立,取决于现实世界的一些约束,比如一个学生只能有一个院系,那么 s t u d e n t _ I D → d e p t _ n a m e student\_ID\rightarrow dept\_name student_IDdept_name是成立的,而相反,尽管表中的每一个实例都满足某一个依赖,也不能断定函数依赖成立。

​ 有些函数依赖被称为是平凡的(trival),因为它们被所有关系满足,例如 A → A , A B → A A\rightarrow A,AB\rightarrow A AA,ABA,一般地,如果 β ⊆ α \beta \subseteq \alpha βα,则形如 α → β \alpha\rightarrow \beta αβ地函数依赖是平凡的。

​ 一个关系的实例可能满足的某些函数依赖并不需要在关系的模式上成立。

闭包:包含集合 F F F中的所有函数依赖。使用符号 F + F^+ F+来表示,即为能够从给定的集合 F F F推导出的所有函数依赖的集合。

Armstrong’s Axiom

  1. 自反律:如果 β ⊆ α \beta \subseteq \alpha βα,则 α → β \alpha \rightarrow \beta αβ
  2. 增广律:如果 α → β \alpha\rightarrow \beta αβ,则 γ α → γ β \gamma\alpha\rightarrow \gamma\beta γαγβ
  3. 传递律:如果 α → β , β → γ \alpha\rightarrow\beta,\beta\rightarrow\gamma αβ,βγ,则 α → γ \alpha\rightarrow\gamma αγ

这个公理是正确且完备的

通过公理可推导出:

  1. 合并规则:如果 α → β , α → γ \alpha\rightarrow\beta,\alpha\rightarrow\gamma αβ,αγ,则 α → β γ \alpha\rightarrow\beta\gamma αβγ
  2. 分解规则:如果 α → β γ \alpha\rightarrow\beta\gamma αβγ,则 α → β , α → γ \alpha\rightarrow\beta,\alpha\rightarrow\gamma αβ,αγ
  3. 伪传递规则:如果 α → β , γ β → δ \alpha\rightarrow\beta,\gamma\beta\rightarrow\delta αβ,γβδ,则 α γ → δ \alpha\gamma\rightarrow\delta αγδ

例子:
R = ( A , B , C , G , H , I )   F = { A → B , A → C , C G → H , C G → I , B → H } R=(A,B,C,G,H,I)\ F=\{A\rightarrow B,A\rightarrow C,CG\rightarrow H,CG\rightarrow I,B\rightarrow H\} R=(A,B,C,G,H,I) F={AB,AC,CGH,CGI,BH}

A → H , A G → I , C G → H I , ⋯ ∈ F + A\rightarrow H,AG\rightarrow I,CG\rightarrow HI,\cdots \in F^+ AH,AGI,CGHI,F+

属性集闭包(Closure of attributes sets)

​ 给定一组属性 α \alpha α,定义属性 α \alpha α F F F下的闭包为: α → β ∈ F + ⟺ β ⊆ α + \alpha\rightarrow\beta \in F^+ \Longleftrightarrow \beta \subseteq \alpha^+ αβF+βα+

​ 计算 α + \alpha^+ α+的算法:
KaTeX parse error: Expected 'EOF', got '&' at position 2: &̲result:=\alpha;…
例子:

R = ( A , B , C , G , H , I ) , F = { A → B , A → C , C G → H , C G → I , B → H } R=(A,B,C,G,H,I),F=\{A\rightarrow B,A\rightarrow C,CG\rightarrow H,CG\rightarrow I,B\rightarrow H\} R=(A,B,C,G,H,I),F={AB,AC,CGH,CGI,BH}

计算 ( A G ) + (AG)^+ (AG)+

​ result = AG

​ result = ABCG( A → C , A → B A\rightarrow C ,A\rightarrow B AC,AB)

​ resullt = ABCGH ( C G → H CG\rightarrow H CGH)

​ result = ABCGHI=R ( C G → I CG\rightarrow I CGI)

A G AG AG是超键吗?

​ 是否有 A G → R AG\rightarrow R AGR? 显然 R ⊆ ( A G ) + R\subseteq (AG)^+ R(AG)+

A G AG AG是候选码吗?

​ 是否有 A → R A\rightarrow R AR?计算可得 ( A ) + = A B C H (A)^+=ABCH (A)+=ABCH,

​ 是否有 G → R G\rightarrow R GR?计算可得 ( G ) + = G (G)^+=G (G)+=G

最小覆盖(Canonical cover)

例如:

  • 在右边: { A → B , B → C , A → C D } \{A\rightarrow B,B\rightarrow C,A\rightarrow CD\} {AB,BC,ACD}可被简化为 { A → B , B → C , A → D } \{A\rightarrow B,B\rightarrow C,A\rightarrow D\} {AB,BC,AD} (缩小的过程)
  • 在左边: { A → B , B → C , A C → D } \{A\rightarrow B,B\rightarrow C,AC\rightarrow D\} {AB,BC,ACD}可被简化为 { A → B , B → C , A → D } \{A\rightarrow B,B\rightarrow C,A \rightarrow D\} {AB,BC,AD} (放大的过程)

最小覆盖:最简形式的 F F F

无关属性:考虑 F F F中的一个依赖 α → β \alpha\rightarrow \beta αβ

  • 属性A在左侧是无关的:如果 A ∈ α A\in \alpha Aα并且 F F F满足, ( F − { α → β } ) ∪ { ( α − A ) → β } (F-\{\alpha\rightarrow \beta\})\cup\{(\alpha-A)\rightarrow\beta\} (F{αβ}){(αA)β}
  • 属性A在右侧是无关的:如果 A ∈ β A\in\beta Aβ并且 F F F满足, ( F − { α → β } ) ∪ { ( α → ( β − A ) ) } (F-\{\alpha\rightarrow\beta\})\cup\{(\alpha\rightarrow(\beta-A))\} (F{αβ}){(α(βA))}
检测某一属性是否多余

​ 考虑 α ∈ β \alpha\in\beta αβ

  • 为了检测左侧的属性 A A A是否多余:
    • 利用 F F F中的依赖,计算 ( { α } − A ) + (\{\alpha\}-A)^+ ({α}A)+
    • 检查这个闭包,如果包含 β \beta β,那么A是多余的
  • 为了检测右侧的属性 B B B是否多余:
    • 利用 F ′ = ( F − { α → β } ∪ { α → ( β − A ) } ) F'=(F-\{\alpha\rightarrow\beta\}\cup\{\alpha\rightarrow(\beta-A)\}) F=(F{αβ}{α(βA)})中的依赖关系,计算闭包 α + \alpha ^+ α+
    • 如果闭包包含A,那么确实多余。

最小覆盖的严格定义

F F F的最小覆盖是依赖的一个集合 F c F_c Fc,满足:

  • F F F可以推导出 F c F_c Fc中的所有关系,反之亦然
  • F c F_c Fc中的所有依赖没有多余的属性
  • F c F_c Fc中的所有依赖,他们的左边都是唯一的,例如,没有这样两个依赖: α 1 → β 1 , α 2 → β 2 \alpha_1\rightarrow\beta_1,\alpha_2\rightarrow\beta_2 α1β1,α2β2,有 α 1 = α 2 \alpha_1=\alpha_2 α1=α2

计算最小覆盖的算法

伪代码:

repeat

​ 用集合的并来替换 F F F中形如 α 1 → β 1   a n d   α 2 → β 2 \alpha_1\rightarrow\beta_1\ and\ \alpha_2\rightarrow\beta_2 α1β1 and α2β2 α 1 → β 1 β 2 \alpha_1\rightarrow\beta_1\beta_2 α1β1β2

​ 找多余的属性,并删除

until F不再变化

找候选码

​ 对于 R ( A 1 , A 2 , ⋯   , A n ) R(A_1,A_2,\cdots,A_n) R(A1,A2,,An)以及 F F F中的依赖关系,所有属性都可以被分类为4类:

  1. L L L:属性只出现在左侧
  2. R R R:属性只出现在右侧
  3. N N N:属性在两侧均未出现
  4. L R LR LR:属性出现在两侧

算法伪代码:

  1. 对所有属性分类: x x x代表 L L L N N N类, y y y代表 L R LR LR
  2. 计算 x + x^+ x+,如果 x x x包含 R R R中的所有属性,那么 x x x就是唯一的候选码,结束算法
  3. y y y中取属性 A A A,计算 ( x A ) + (xA)^+ (xA)+,如果 ( x A ) + (xA)^+ (xA)+包含 R R R中的所有属性,那么 x A xA xA R R R的一个候选码。继续选取,知道 y y y中属性的所有组合都被选过
  4. 结束,输出结果

无损链接分解

即无损分解,对于 R R R表中的所有属性,必须出现在分解 ( R 1 , R 2 ) (R_1,R_2) (R1,R2)中,即 R = R 1 ∪ R 2 R=R_1\cup R_2 R=R1R2,对于 R R R上所有可能的关系 r r r,有 r = Π R 1 ( r ) ⋈ Π R 2 ( r ) r=\Pi_{R_1}(r)\Join \Pi_{R_2}(r) r=ΠR1(r)ΠR2(r)

无损分解的判断

​ 对于 ( R ) = ( R 1 , R 2 ) (R)=(R_1,R_2) (R)=(R1,R2),它是一个无损分解,当且仅当

  • R 1 ∩ R 2 → R 1 R_1 \cap R_2 \rightarrow R_1 R1R2R1
  • R 1 ∩ R 2 → R 2 R_1\cap R_2 \rightarrow R_2 R1R2R2

​ 至少满足一个。

例如:给定 R < U , F > R<U,F> R<U,F>, U = { A , B , C , D , E } , F = { A B → C , C → D , D → E } U=\{A,B,C,D,E\},F=\{AB\rightarrow C,C\rightarrow D,D\rightarrow E\} U={A,B,C,D,E},F={ABC,CD,DE} R R R上的一个分解为: R 1 ( A , B , C ) , R 2 ( C , D ) , R 3 ( D , E ) R1(A,B,C),R2(C,D),R3(D,E) R1(A,B,C),R2(C,D),R3(D,E),判断是否为无损分解

P r o o f : Proof: Proof:
R 1 ∩ R 2 = C C → A B C   ? 没有这个依赖关系 C → C D  √ R 2 ∩ R 3 = D D → C D   ? 没有这个依赖关系 D → D E  √ R1\cap R2=C\\ C\rightarrow ABC \ ? 没有这个依赖关系\\ C\rightarrow CD \ √ \\ R2 \cap R3= D \\ D\rightarrow CD \ ? 没有这个依赖关系\\ D\rightarrow DE \ √ R1R2=CCABC ?没有这个依赖关系CCD R2R3=DDCD ?没有这个依赖关系DDE 
所以是无损分解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/555734.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Root mapping definition has unsupported parameters: [all : {analyzer=ik_max_wor

你们好&#xff0c;我是金金金。 场景 我正在使用Springboot整合elasticsearch&#xff0c;在创建索引(分词器) 运行报错&#xff0c;如下 排查 排查之前我先贴一下代码 import org.elasticsearch.action.admin.indices.create.CreateIndexRequest; // 注意这个包SpringBootTe…

Linux中如何安装ImageMagick及其常规使用命令

在Linux中安装ImageMagick可以通过包管理工具进行安装。具体步骤如下&#xff1a; 打开终端&#xff08;Terminal&#xff09;。 使用以下命令更新系统软件包列表&#xff1a; sudo apt update使用以下命令安装ImageMagick&#xff1a; sudo apt install imagemagick安装完…

物理机安装centos7并配置基本环境,网络配置,docker配置

1.首先下载镜像Download 2.下载UltraISO 安装docker 第1步&#xff1a;卸载当前版本docker yum erase docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \do…

[生活][杂项] 如何正确打开编织袋

编织袋打开的正确姿势 面对单线分离右边的线头&#xff0c;然后依次拉开即可

YAML教程-1-基础入门

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go YAML简介 YAML&#xff08;YAML Aint Markup Language&#xff09;是一种用于数据序列化的人类可读格式。它广泛用于配置文件、数据交换、持续集成/持续部署&#xff08;CI/CD&#xff09;等领域。YAML的设计目标…

注意,把Python库安装在一个环境里,可能会“非常危险”!

如果说谁写Python不用第三方库&#xff0c;我敬他是条汉子。如今到处是轮子的时代&#xff0c;Python第三方库管理成了开发者们头疼的问题。 可能在看这篇文章的很多人&#xff0c;都没用过Python虚拟环境&#xff0c;不知道安装Python库需要考虑版本兼容问题。 那么把所有要…

基于SpringBoot的健身房管理系统

一.前言 本系统用了 Sping Data JPA 这一不常用的数据库框架&#xff0c;是一个值得学习研究的点。 本项目用户名&#xff1a;admin 密码: admin123 方可进入。项目源码在文章开头&#xff0c;下载到本地导入IDEA&#xff0c;修改配置文件中数据库连接信息后&#xff0c;导入项…

字段名称导致mybatisplus自带方法报错.BadSqlGrammarException: ### Error querying database. C

今天在建一个数据表之后&#xff0c;在springboot中使用了mybatisplus代码生成工具生成了java相关代码&#xff0c;在查询的时候&#xff0c;使用的是list()方法查询&#xff0c;发现居然会报错&#xff0c;找了好久。 org.springframework.jdbc.BadSqlGrammarException: ###…

锁策略和死锁问题

锁策略 乐观锁 vs 悲观锁重量级锁 vs 轻量级锁自旋锁 vs 挂起等待锁读写锁 vs 互斥锁公平锁 vs 非公平锁可重入锁 vs 不可重入锁死锁死锁产生的必要条件如何简单的解决死锁问题 小结 这里不是描述的某个特定锁,而是描述的锁的特性,描述的是"一类锁". 乐观锁 vs 悲观…

人到中年三两事儿

人到中年&#xff0c;常常伴随着一系列的焦虑和烦恼。这些焦虑可能源自对工作的不确定性、对未来的担忧、对家庭责任的增加&#xff0c;或是对个人成就的反思。在这个年纪&#xff0c;我们可能会发现自己站在人生的十字路口&#xff0c;面临着重要的选择和决策。 首先&#xff…

数智时代的AI人才粮仓模型解读白皮书(2024版)

来源&#xff1a;极客邦 自 2023 年上半年起&#xff0c;ChatGPT 等大模型技术蓬勃发展&#xff0c;AI 技术不断突破边界&#xff0c;展现 出惊人的潜力和发展速度。从早期的逻辑推理、专家系统&#xff0c;到如今的深度学习、神经网络&#xff0c; AI 技术显著缩小了科学与实…

【面试经典 150 | 二分查找】搜索旋转排序数组

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;二分查找 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…

Redis中的Lua脚本(二)

Lua脚本 创建排序辅助函数 为了防止带有副作用的函数令脚本产生不一致的数据&#xff0c;Redis对math库的math.random函数和math.randomseed函数进行了替换。对于Lua脚本来说&#xff0c;另一个可能产生不一致数据的地方是哪些带有不确定性质的命令&#xff0c;比如对于一个集…

STM32串口通信

一、串口发送 1.初始化引脚 void Serial_Init(uint32_t BaudRate) {RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA ,ENABLE );RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 ,ENABLE );GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP…

python自动化之网易自动点歌

这个代码是是使用的pyautogui库和pyperclip库完成的&#xff0c;这个库是开源的地址如下&#xff1a;https://github.com/asweigart/pyautogui这里详细的用法想学习的可以到这看看 下面是代码&#xff1a; import pyautogui import subprocess import pyperclip import time i…

如何进行 ICP 备案/公安部联网备案

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

安装jmeter和ant

安装jmeter和ant 安装java环境 安装jdk和jre 下载Java SE Development Kit 8 Java SE subscribers will receive JDK 8 updates until at least December 2030. 选择指定包进行安装&#xff0c;如windows 共享账号参考&#xff1a;Oracle官网 账号及密码 目前官网下载低…

Java程序生成可执行的exe文件 详细图文教程

1.Java编辑器&#xff0c;如&#xff1a;idea、eclipse等&#xff0c;下载地址&#xff1a;IntelliJ IDEA: The Capable & Ergonomic Java IDE by JetBrainshttps://www.jetbrains.com/idea/2.exe4j&#xff0c;下载地址&#xff1a;ej-technologies - Java APM, Java Prof…

吴恩达<用于LLM应用程序开发的LangChain> L1-Model_prompt_parser

问题预览/关键词 课程地址如何获取openAI的API Key如何根据日期设置不同模型?如何调用OpenAI的API?如何使用OpenAI的API&#xff1f;langchain如何抽象OpenAI的API接口&#xff1f;langchain如何创建提示词模板并查看模板内容&#xff1f;langchain如何使用提示词模板生成提…

使用Google reCAPTCHA防止机器注册

本文作者&#xff1a;陈进坚 博客地址&#xff1a;https://jian1098.github.io CSDN博客&#xff1a;https://blog.csdn.net/c_jian 简书&#xff1a;https://www.jianshu.com/u/8ba9ac5706b6 联系方式&#xff1a;jian1098qq.com 环境要求 能翻墙的电脑域名 验证原理 在谷歌…
最新文章