数据库设计
设计范式
概念
设计数据库时,需要遵循的一些规矩.要遵循后边的范式要求,必须先遵循前边的所有范式要求
设计关系数据库时,遵循不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据厍冗余越小。
依赖含义
- 函数依赖:
A-->B如果通过 A 属性(属性组)的值可以唯一确定 B 属性的值.则称 B 依赖于 A例如:学号 --> 姓名
- 完全函数依赖:
A-->B如果 A 是一个属性组,则 B 属性值得确定需要依赖 A 属性组中所有的属性值例如:(学号, 课程名称)--> 分数
- 部分函数依赖:
A-->B如果 A 是一个属性组,则 B 属性值确定只需要依赖于 A 属性组中的某一些值即可例如:(学号, 课程名称)--> 姓名
- 传递函数依赖:
A-->B,B-->C通过 A 属性(属性组)的值,可以确定唯一 B 属性的值例如:学号-->系名,系名-->系主任
- 如果在在一张表中,一个属性或属性组,被其他所有属性所完全依赖,则称这个属性(属性值)为该表的码
例如:表中码为:(学号,课程名称)
- 主属性:码(主码)属性组中的所有属性
- 非主属性:除了码(主码)属性组中的属性
候选码与主码的关系
候选码和主码都是关系型数据库中的概念,用于唯一标识表中的每条记录。它们之间的区别在于:
候选码是能够唯一标识表中每条记录的一个属性集合,而不一定是最小的这样的属性集合。主码则是最小的候选码,即被选作唯一标识表中每条记录的属性集合。
一个表可以有多个候选码,但只能有一个主码。通常情况下,主码会被用作该表与其他表之间的外键关联,以建立数据之间的关系。
候选码是在设计表结构时确定的,而主码通常是在实际使用过程中确认的。在实际使用中,主码不能重复且必须存在,否则将导致数据错误或不一致。
总之,候选码是必备条件,它能够唯一标识表中每条记录;而主码是在候选码基础上选择的最小候选码,它扮演了关系型数据库体系结构中重要的角色。
分类
目前关系数据库有六种范式:
- 第一范式(1NF)
- 第二范式(2NF)
- 第三范式(3NF)
- 巴斯-科德范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF 又称完美范式)
第一范式:每一列都是不可分割的原子数据项
第二范式:在 1NF 的基础上,非码属性必须完全依赖于候选码(在 1NF 的基础上消除非主属性对主码的部分函数依赖)
第三范式:在 2Nf 的基础上,任何非主属性不依赖于其他非主属性(在 2NF 的基础上消除传递依赖)
BC 范式:对于关系模式 R,若 R 为第一范式,且每个属性都不部分依赖于候选键也不传递依赖于候选键,则 R 称之为 BC 范式
TIP
如果一个关系不满足 BC 范式,那么就说明其中某些属性并不完全依赖于候选键,而是依赖于其他属性,这可能导致数据冗余和更新异常等问题。因此,符合 BC 范式能够提高数据的一致性、可靠性和规范性。
分解方式
2NF
对于关系, U 为所有码的集合,如果是主码,上存在,不是主属性且,那么这明显不符合 2NF 🤓。
方法: 需要把分为和,即把作为新表,主码是X,中去掉Z,主码仍然为W,X作为外键。那么仍然可以通过联表得到原来的数据(无损的)
重复操作直到所有的表不能再分。
3NF
对于每个非平凡 FD(函数依赖),或者左边是超键,或者右边仅由主属性构成,那么它就是 3NF。
•᷄ࡇ•᷅ 白话就是所有非主属性都没有依赖于其他主属性(不传递依赖于主属性)
方法: 先求出最小依赖集(就是所有依赖的集合),例:
- 按左部相等的原则分组,再把左右部合并,例:
- 查看新分组中的关系集中有没有包含关系,如果有,合并
- 查看新分组的属性集中是否包含码,如果没有(说明该分解是有损的),新建一个分组把主码放进去。
BCNF
对于每个非平凡 FD(函数依赖),左边是超键,那么它就是 BCNF。
todo |・ω・`)