数据库规范化范式设计

举报
码乐 发表于 2024/04/25 08:54:39 2024/04/25
【摘要】 简介这里整理数据存储设计的几个套路。 1 关系数据库规范化函数依赖: 定义:设R(U)是属性U的关系模式,X,Y是U的子集, 对于R(U)的任意一个可能的关系r,r的任意两个元组在X上属性值相等, 那么在Y上的属性值也相等,称“X函数确定Y” 或Y函数依赖X,记为 X->Y. X称为这个函数依赖的决定属性组,也称为决定因素。例如:关...

简介

这里整理数据存储设计的几个套路。

1 关系数据库规范化

函数依赖:

        定义:设R(U)是属性U的关系模式,X,Y是U的子集,
        对于R(U)的任意一个可能的关系r,r的任意两个元组在X上属性值相等,
        那么在Y上的属性值也相等,称“X函数确定Y” 或Y函数依赖X,记为 X->Y. 
        X称为这个函数依赖的决定属性组,也称为决定因素。

例如:关系式S(Sno,Sname,Ssex,Sage,Sdept)
F={Sno->Sname,Sno->Ssex,Sno->Sage,Sno->Sdept}
若Y没有函数依赖于X,则记为X !->Y.
例如: Ssex !-> Sage, Ssex !-> Sdept

	X -> Y, Y 不属于 X,则称 X -> Y 是 非平凡的 函数依赖
	X -> Y, 但 Y 属于 X, 则称 X -> Y 是 平凡的 函数依赖

平凡函数依赖

  • 超键

属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。

例如学生关系模式的 学号,身份证,学号-姓名,身份证号,性别等。

  • 候选键

不含多余属性,这些超键被称为 候选键,是超键的最小子集。 如 学号,身份证

  • 主键

用户挑选的做元组标识的一个候选键称为主键。

如,我们通常选择学号作为主键

  • 外键

如果关系模式R中的某些属性集不是R的主键,而是关系模式S的主键,这个属性集对模式R而言是外键。

例如,教师编号,是这个学生关系模式的外键

  • 主属性

包括在任何一个候选键中的属性称为主属性,否则称为非主属性。

  • Armstrong公理

Armstrong公理:从已知的一些函数依赖,可以推导出另外一些函数依赖,
这就需要一系列推理规则,这些规则常被称作“Armstrong 公理”.

设关系式R(U,F),U是关系模式R的属性集,F是U上一组函数依赖,则有以下

三条推理规则:

1) A1自反律:若Y⊆X⊆U,则X→Y为F所蕴含;
2) A2增广律:若X→Y为F所蕴含,且Z⊆U,则XZ→YZ为F所蕴含;
3) A3传递律:若X→Y,Y→Z为F所蕴含,则X→Z为F所蕴含。

根据上面三条推理规则,又可推出下面三条推理规则:

4) 合并规则:若X→Y,X→Z,则X→YZ为F所蕴含;
5) 伪传递规则:若X→Y,WY→Z,则XW→Z为F所蕴含;
6) 分解规则:若X→Y,Z⊆Y,则X→Z为F所蕴含。

例子:
例如有两个关系模式:

1 学生(学号、姓名、性别、身份证号、教师编号)

2 教师(教师编号、姓名、工资)

数据库范式中判定设计属于哪一个类型,通常需要使用Armstrong公理传递性依赖是否存在,做为依据。

image.png

1.1 非平凡函数依赖

例如 关系式 Student Sno(学号),Sdept,Mname,Cno(课程号),Grade

名称              定义
完全函数依赖		 Sno,Cno -> Grade 是完全函数依赖,
				必须要两个条件都知道才能确定Grade

部分函数依赖      (Sno,Cno) -> Sdept 是部分函数依赖
				只需要知道一个条件,就可以确定 Sdept

传递依赖          Sno->Sdept,Sdept->Mname,则称Mname传递依赖于Sno
				通过Sno 学号,可以间接查询出 Mname

2 数据库范式

共有 5个范式,也就是 1NF~5NF

1NF 范式

若关系模式R的每一个分量是不可再分的数据项,则关系模式R属于第一范式。

2NF 范式

若关系模式 R 属于 1NF,且每一个非主属性完全依赖主键时,则关系式 R 是 2NF

例如 R 学号,姓名,班级,课程,成绩

函数依赖:

    学号 -> 姓名,学号 -> 班级,(学号,课程号)->成绩
    主键: 学号,课程号
    姓名,班级部分依赖于 主键,不属于2NF,需要将其分解为
            R1 学号,姓名,班级
            R2 学号,课程,成绩

3NF 范式

    当2NF消除了非主属性对主键的传递函数依赖,则称为3NF

也就说,全部非主属性都直接依赖于主键。

    SNo    Sname    Dno    Dname
    3001   张军      D01    计算机
    3002   李明      D01    计算机
    4003   王丽      D01    计算机
    0004   李红      D02    自动化
    0001   刘强      D02    自动化

    SNo    Sname   Dno
    3001   张军     D01
    3002   李明     D01
    4003   王丽     D01
    0004   李红     D02
    0001   刘强     D02

    Dno    Dname
    D01    计算机
    D01    计算机
    D01    计算机
    D02    自动化
    D02    自动化

3 小结

实际工作中,规范化的应用不如反规范化普遍,为了优化数据库常用的反规范化方法如:

增加几余列:是指在多个表中具有相同的列,它常用来在查询时避免连接操作。

增加派生列:指增加的列可以通过表中其他数据计算生成。它的作用是在查询时减少计算量,从而加快查询速度。

重新组表:指如果许多用户需要查看两个表连接出来的结果数据,则把这两个表重新组成一个表来减少连接而提高性能。

水平分表:按记录进行分割,把数据放到多个独立的表中,主要用于表数据规模很大、表中数据相对独立或数据需要存放到多个介质上时使用。

垂直分表:对表进行分割,将主键与部分列放到一个表中,主键与其它列放到另一个表中,在查询时减少 1/0 次数

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。