Skip to content

关系型数据库设计

约 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 $