第1范式:每个列和记录包含一个而且只包含一个值的表。
Branch(不属于1NF,第1条记录telNos有多个值)
branchNo branchAddress telNos
B001 8 504,503
B002 city 206
B003 14 216
需要拆分成2个表,符合1NF
Branch(1NF) BranchTelephone(1NF)
branchNo branchAddress branchNo telNos
B001 8 B001 503
B002 city B001 504
B003 14 B002 206
B003 216
第二范式:一个第1范式的表并且每个非主键列都可以从构成主键的全部的列映射得到。一般应用于具有复合主键的表,而具有单列主键的1NF表自动是2NF.
TempStaffAllocation( staffNo branchNO为复合主键)
staffNo branchNo branchAddress name position hoursPerWee
S4555 B002 city Ellen Ass 16
S4555 B004 16 Ellen Ass 9
S4612 B002 city Dav Ass 14
S4612 B004 16 Dav Ass 10
分析:branchAddress列的值可以仅从branchNO列映射得到。所以非2NF表。name列的值可以仅从staffNO列映射得到。所以非2NF.需要拆分表。hoursPerWee可以由主键映射得到。
Branch(2NF)
branchNo branchAddress
B002 city
B004 16
TempStaff(2NF)
staffNo name position
S4555 Ellen Ass
S4612 Dav Ass
TempStaffAllocation(2NF)
staffNo branchNo hoursPerWee
S4555 B002 16
S4555 B004 9
S4612 B002 14
S4612 B004 10
第三范式:一个已经是第一和第二范式的表,并且所有的非主键列的值都只能从主键列映射得到,而不能从其他的列得到。
staffBranch(非3NF)
staffNo name position salary branchNo branchAddr telNo
S1500 Tom Man 46000 B001 8 Way 503
S0003 Sally Ass 30000 B001 8 Way 503
S0010 Mary Man 50000 B002 City 206
S3250 Robert Super 32000 B002 City 206
S2250 Sally Man 48000 B004 16-14th 207
S0415 Art Man 41000 B003 14-8th 212
分析:branchAddress和telNo可以从branchNo映射得到,非3NF。branchNo和telNo列可以从branchAddr映射得到,非3NF。branchNo和branchAddre可以从telNo映射得到,非3NF。
范式设计不好,可能引发:1插入异常 2 删除异常 3 更新异常。这些会违背数据库ACID原则的其中的若干个。
逆规范的使用场合:若性能达不到要求,表的更新频率比较低,查询比较高,则逆规范就可行,可以加快查询速度,但会降低更新速度。逆规范是对原有表属性的修改,使得新表比原始表的范式低。
逆规范有几个要点:不分解到3NF,增加重复属性来减少连接(根据cdm关联关系),对大表要做分区。
分区有3类:范围分区(每个分区中包含一个或多个列的范围值),列表分区(每个分区中包含一列的值列表),哈希分区(根据哈希函数分解每个分区)。
需要考虑6种完整性约束:1需要的数据。2属性域约束。3实体完整性。 4 关系多样行。 5参照完整性。 6其它业务规则。
其中参照完整性需要重点考虑。还有需要正确删除cdm中的冗余关系。
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24214296/viewspace-1059541/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24214296/viewspace-1059541/