设计理论通常是关系理论中的一个固定组成部分。
然而,它不是关系模型本身的一部分。
相反,它是建立在这个模型顶层的独立理论。
关系模型本身并不关心数据库设计得“好”与“坏”。
无损分解与 1NF
定义:
关系变量 R 是 1NF,当且仅当可以合法赋值给 R 的每个关系 r 都是 1NF 的。
当且仅当可以合法赋值给 R 的每个关系 r 中的每个元组应该满足:
- (a)每个属性都恰好只有一个;
- (b)除此之外,没有其他条件。
第一范式存在的问题,如 SPCT 关系:
SNO | PNO | QTY | CITY | STATUS |
---|---|---|---|---|
S1 | P1 | 300 | London | 20 |
S1 | P2 | 200 | London | 20 |
S2 | P1 | 300 | Paris | 10 |
S1 | P1 | 300 | Paris | 20 |
在以上关系中,具体特定城市的供应商,以及具有特定状态的供应商都会出现多次。
插入异常
我们插入位于雅典的供应商 S5,直到该供应商提供零件。
删除异常
如果执行删除供应商 S2,因为只有一条信息,则删除后,关于该供应商的所有信息即丢失
修改异常
如果修改 SNO 为 S1,PNO 为 P1 的供应商的城市信息,则会出现明显的不一致,则会导致 S1 供应商存在与两个城市(除非一个供应商可以位于多个城市)
无损分解
我们需要把关系变量 SPCT 替换成两个单独的关系变量。
一个就是常用的供应商变量 S:
SNO | STATUS | CITY |
---|---|---|
S1 | 20 | LONDON |
S1 | 30 | LONDON |
另一个是供应关系变量 SP:
SNO | PNO | QTY |
---|---|---|
S1 | P1 | 300 |
S1 | P2 | 300 |
可以看出,分解出来的两个关系变量 S 和 SP 都是关系变量 SPCT 的投影,而且,如果我们把这些投影再联接在一起,就要恢复成原来的关系变量。
因而,从这个例子可以得出如下结论(或者至少是强烈建议的):
更高级别的范式(如 2NF、3NF 等等)应该满足:
(a)可以通过投影的方式来分解一个关系变量;
(b)可以消除冗余;
(c)分解前的关系变量应该等价于这些投影的联接。
因为要特别考虑到(c),所以分解过程必须是无损的,即不能丢失任何重要信息。
函数依赖
定义:
X 和 Y 是关系变量 R 两个属性子集,那么函数依赖(FD)X→Y 在 R 中成立,当且仅当如果属性集合 X 中每个属性的值构成的集合唯一地决定了属性集合 Y 中每个属性的值构成的集合,则属性集合 Y 函数依赖于属性集合 X,记为:X→Y。
属性集合 X 中的属性有时也称作函数依赖 X→Y 的决定因素(determinant),Y 称为被决定因素(dependent)。
函数依赖 FD {SNO} → {CITY}来自于关系变量 SPCT(一个供应商号码可以找到唯一对应的城市)。
当然,关系变量 SPCT 中也存在函数依赖{SNO} → {STATUS}。
因此,我们可以把这两个函数依赖进行合并简化,如下:
{ SNO } → { CITY , STATUS }
注意,这里使用的是大括号。
X 和 Y 都是 R 的子集,因此也是集合,即使在{SNO} → {CITY}的情况下,它们也是单独的集合。
以此类推,X 和 Y 的值也都是元组,即使恰好有时它们的度为 1
不严格地讲,如果存在任何其他的函数依赖,那么这个设计就很糟糕。
最小函数依赖
如果关系变量 R 中存在函数依赖 X→Y,那么就存在函数依赖 X′→ Y′,X′是 X 的子集,Y′是 Y 的子集。
换句话说,你可以向决定因素中添加属性,或者从被决定因素中减少属性,仍然可以得到关系变量中的函数依赖。
例如,关系变量 SPCT 中存在函数依赖{ SNO } → { CITY , STATUS },则函数依赖{ SNO , PNO } → { CITY }也是成立的(向决定因素中增加了属性 PNO,从被决定因素中减少了属性 STATUS。
那么,如果函数依赖 X′→ Y′成立,但函数依赖 X→ Y′对于 X′任意的子集 X 都不成立,那么 X′→ Y′就是最小函数依赖。
例如,关系变量 SPCT 中的函数依赖{ SNO , PNO } → { QTY }就是最小函数依赖,
但{ SNO , PNO } → { CITY }不是, 因为在该关系变量中存在函数依赖{SNO} → {CITY}。
2NF 第二范式
定义:关系变量 R 是第二范式(2NF),当且仅当 R 中的每个码 K 和 R 的每个非码属性 A,其函数依赖 K→ {A}是不能简化的。
注意,关系变量 R 的非码属性是指 R 的属性不是码的组成部分。
例如关系变量 SPCT 为什么是 1NF,而不是 2NF?
因为:
(a){SNO,PNO}是码;(b)存在函数依赖:{SNO ,PNO} → {CITY}、{SNO ,PNO} → {STATUS},但是(c)这个函数依赖是可以进行简化的。
因此在关系变量SPCT中存在冗余的资源。
第二范式的另外一个定义:
定义:
关系变量R是2NF,当且仅当R中存在的每一个非平凡的函数依赖X→ Y,至少满足如下条件之一:(a)X是超码;(b)Y是子码;(c)X不是子码。
注意,所有的码都是超码,但是大多数超码不一定都是码
3NF 第三范式
BC 范式
第四范式
略