資料庫設計_正規化理解及其它

sembh發表於2012-10-07

第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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章