关系型数据库设计
约 650 个字 预计阅读时间 2 分钟
第一范式
A relation schema R is in first normal from(1NF) if the domains of all attributes of R are atomic.第一范式就是原子性,关系型数据库的所有关系都必须满足第一范式,这也是为什么上一章我们需要把phone number这种多值属性划为一个单独的表而不是把它作为一个属性。
如何处理非原子的属性:
- 对于复合属性:拆分成一系列属性
- 对于多值属性:
- 拆分成多个属性,比如phone number拆分成(phone1,phone2,...)
- 使用一张独立的表
- 使用单值域
非原子属性的缺陷:
- 复杂的存储,会导致重复存储
- 查询会很麻烦
原子性实际上是域元素使用方式的一种属性,比如字符串通常可以看作是原子的,为什么我们不把院系和学号混合在一起,比如CS1001
,这是因为这样存储就不能利用数据库的机制完成查询,比如当我们要查一个计院学生的信息时,就要先把学号查出来,先截取前两位对比出计算机学院的人,再对比编号找到目标。
关系型数据库设计的隐患
关系型数据库的设计需要我们找到一种较好的关系模式,坏的设计可能会导致反复存储,增删改的异常和不能表示某些关系。比如在导师的表里面直接添加院系名、院系大楼和经费,但是同一个学院的导师这三个属性会重复,而且不能在没有导师的情况下添加新的院系。我们的主要优化手段就是分解,需要无损全连接分解(lossless-join decomposition),满足\(\overset{\mathrm{\tilde{} }}{r} = {\mathrm{\Pi }}_{\mathrm{R}\mathrm{1}}\left( \overset{\mathrm{‾}}{r}\right) \bowtie {\mathrm{\Pi }}_{\mathrm{R}\mathrm{2}}\left( \overset{\mathrm{‾}}{r}\right)\)
函数依赖
设\(\alpha\)和\(\beta\)是\(R\)的属性,\(\alpha\rightarrow \beta\)是一个函数依赖当且仅当对于任意两个元组\(t_1,t_2\),若$t_1[\alpha]=t_2[\alpha] \(,那么\)t_1[\beta]=t_2[\beta] $,这个概念借鉴了数学上的函数。函数依赖本质上是一种一致性约束,表达了一个关系中不同属性的联系,可以用于标准化判断机制和提供优化建议。
函数依赖其实是键的泛化:
- K is a super-key for relation schema R if and only if $K\rightarrow R $
- K is a candidate-key if and only if
- $K\rightarrow R $
- no $\alpha\in K \(,\)\alpha\rightarrow R $