关系数据库的范式
1 函数依赖
函数依赖: 设R(U)是属性集U上的关系模式。X,Y是U的子集。若对于R(U)的任意一个可能的关系r,r中不可能存在两个元组在X上的属性值相等,而在Y上的属性值不相等,则称X函数确定Y或者Y函数依赖于X。记为X->Y。
完全函数依赖: 在R(U)中,如果Y函数依赖于X,并且对于X的任何一个真子集X',都有 Y不函数依赖于X', 则称Y对X完全函数依赖。否则称Y对X部分函数依赖。
传递函数依赖: 在R(U)中,如果X->Y, Y->Z, 则称Z对X传递函数依赖。
2 第一范式
第一范式规定关系的每一个量必须是一个不可分的数据项。下面给出不是第一范式的例子。
Customer ID | First Name | Surname | Telephone Number |
---|---|---|---|
123 | Pooja | Patel | 555-861-2025, 192-122-1111 |
456 | Zhang | San | (555) 403-1659 Ext. 53; 182-929-2929 |
789 | John | Doe | 555-808-9633 |
可以将其重新设计以符合第一范式。
Customer | ID | First Name | Surname Telephone Number |
---|---|---|---|
123 | Pooja | Patel | 555-861-2025 |
123 | Pooja | Patel | 192-122-1111 |
456 | Zhang | San | 182-929-2929 |
456 | Zhang | San | (555) 403-1659 Ext. 53 |
789 | John | Doe | 555-808-9633 |
3 第二范式
数据库表中不存在非关键字段对任一候选键的部分函数依赖,也即所有非关键字段都完全依赖于任意一组候选关键字。
判断一个表是否是第二范式的方法分为四个步骤:
- 第一步:找出数据表中所有的码。
- 第二步:根据第一步所得到的码,找出所有的主属性。
- 第三步:数据表中,除去所有的主属性,剩下的就都是非主属性了。
- 第四步:查看是否存在非主属性对码的部分函数依赖。
下面的表不符合第二范式。虽然表格的设计者可以将<Moduel Full Name>作为主键,但<Manufacturer,Model>也是一个候选键,<Manufacturer Country>完全函数依赖于它的子集,即<Manufacturer>。
Manufacturer | Model | Model Full Name | Manufacturer Country |
---|---|---|---|
Forte | X-Prime | Forte X-Prime | Italy |
Forte | Ultraclean | Forte Ultraclean | Italy |
Dent-o-Fresh | EZbrush | Dent-o-Fresh EZbrush | USA |
Kobayashi | ST-60 | Kobayashi ST-60 | Japan |
Hoch | Toothmaster | Hoch Toothmaster | Germany |
Hoch | X-Prime | Hoch X-Prime | Germany |
可以将其拆分成两个表以符合第二范式。
Manufacturer | Manufacturer Country |
---|---|
Forte | Italy |
Dent-o-Fresh | USA |
Kobayashi | Japan |
Hoch | Germany |
Manufacturer | Model | Model Full Name |
---|---|---|
Forte | X-Prime | Forte X-Prime |
Forte | Ultraclean | Forte Ultraclean |
Dent-o-Fresh | EZbrush | Dent-o-Fresh EZbrush |
Kobayashi | ST-60 | Kobayashi ST-60 |
Hoch | Toothmaster | Hoch Toothmaster |
Hoch | X-Prime | Hoch X-Prime |
4 第三范式
在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。也可以描述为:表中不存在可以确定其他非关键字的非键字段。
下面的表格不符合第三范式。<Tournament, Year>是这张表的候选键,而 <Winner Date of Birth>函数依赖于<Winner>。
Tournament | Year | Winner | Winner Date of Birth |
---|---|---|---|
Indiana Invitational | 1998 | Al Fredrickson | 21 July 1975 |
Cleveland Open | 1999 | Bob Albertson | 28 September 1968 |
Des Moines Masters | 1999 | Al Fredrickson | 21 July 1975 |
Indiana Invitational | 1999 | Chip Masterson | 14 March 1977 |
要修改为第三范式,需拆分为两张表。
Tournament | Year | Winner |
---|---|---|
Indiana Invitational | 1998 | Al Fredrickson |
Cleveland Open | 1999 | Bob Albertson |
Des Moines Masters | 1999 | Al Fredrickson |
Indiana Invitational | 1999 | Chip Masterson |
Winner | Date of Birth |
---|---|
Chip Masterson | 14 March 1977 |
Al Fredrickson | 21 July 1975 |
Bob Albertson | 28 September 1968 |
5 BC范式
如果对于关系模式R中存在的任意一个非平凡函数依赖X->A,都满足X是R的一个超键,那么关系模式R就属于BCNF。
BCNF意味着在关系模式中每一个决定因素都包含候选键,也就是说,只要属性或属性组A能够决定任何一个属性B,则A的子集中必须有候选键。BCNF范式排除了任何属性( 不光是非主属性,2NF和3NF所限制的都是非主属性)对候选键的传递依赖与部分依赖。
下面的表不符合第三范式。
Court | Start Time | End Time | Rate Type |
---|---|---|---|
1 | 09:30 | 10:30 | SAVER |
1 | 11:00 | 12:00 | SAVER |
1 | 14:00 | 15:30 | STANDARD |
2 | 10:00 | 11:30 | PREMIUM-B |
2 | 11:30 | 13:30 | PREMIUM-B |
2 | 15:00 | 16:30 | PREMIUM-A |
这张表的超键包括:
- S1 = {Court, Start Time}
- S2 = {Court, End Time}
- S3 = {Rate Type, Start Time}
- S4 = {Rate Type, End Time}
- S5 = {Court, Start Time, End Time}
- S6 = {Rate Type, Start Time, End Time}
- S7 = {Court, Rate Type, Start Time}
- S8 = {Court, Rate Type, End Time}
- ST = {Court, Rate Type, Start Time, End Time}, the trivial superkey
而显然<Rate Type> -> <Court>。可将其修改以符合BCNF。
Rate Type | Court | Join |
---|---|---|
SAVER | 1 | Yes |
STANDARD | 1 | No |
PREMIUM-A | 2 | Yes |
PREMIUM-B | 2 | No |
Join | Court | Start Time | End Time |
---|---|---|---|
Yes | 1 | 09:30 | 10:30 |
Yes | 1 | 11:00 | 12:00 |
No | 1 | 14:00 | 15:30 |
No | 2 | 10:00 | 11:30 |
No | 2 | 11:30 | 13:30 |
Yes | 2 | 15:00 | 16:30 |