正規化的理解

2021-08-31 12:44:23 字數 1305 閱讀 6318

前言

為什麼要寫這篇文章呢,從去年年底開始,就和很多做技術的朋友交流過,從資料庫設計到資料庫架構各個方面的內容。有一些朋友執著於orm,執著於所謂的資料庫設計,卻忘記了一切技術是要為業務服務這個基石。當然這文章裡也有一些自己的理解,想向大家表達。

正規化是什麼

正規化是符合某一種級別的關係模式的集合。關聯式資料庫中的關係必須滿足一定的要求,即滿足不同的正規化。目前關聯式資料庫有六種正規化:第一正規化(1nf)、第二正規化(2nf)、第三正規化(3nf)、第四正規化(4nf)、第五正規化(5nf)和第六正規化(6nf)。滿足最低要求的正規化是第一正規化(1nf)。在第一正規化的基礎上進一步滿足更多要求的稱為第二正規化(2nf),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3nf)就行了。

正規化的原理

正規化的說明

我對正規化的理解

乙個嚴格恪守資料庫設計正規化來進行資料庫設計的人,必定是個傻球;

乙個沒有研究過資料庫設計正規化就進行資料庫設計的人,必定也是個傻球;

在現代資料庫設計中,尤其是web 2.0的系統中的資料庫設計,我可以斷言,大多數都是違反2nf、3nf的,少數設計甚至是違反1nf的。資料庫設計正規化只是對資料庫慣用設計的一些說明,並不能定性為標準。

而從資料庫的發展來看,以mysql舉例,隨著mysql實現越來越多的功能,它的宣傳材料上會越來越多的出現以前被mysql所摒棄的複雜設計理念,並且宣稱這是mysql所獨創或一貫倡導的。這是乙個資料庫系統發展所必然經歷的過程。而這卻會給mysql的使用者以極大的誤導,從而忽視了是否新特性是業務所真正需要的。

資料庫設計不是一種程式語言這麼簡單,與物件導向、面向過程無關。資料庫設計代表的是一種與應用開發語言完全不同的思想。現在絕大多數的程式,無論任何人採用什麼方式進行程式開發,其最終還是會回歸到對資料庫的操作上(當然如果你的程式只是個教學演示則不在此範圍內)。

資料庫發展從下面的列表可以看出當前sns的**對於高併發、高效能的資料庫解決方案有多麼渴求,facebook貢獻了cassandra、linkedin貢獻了voldemort、mixi.jp貢獻了tokyo cabinet和tokoy tyrant、green.jp貢獻了flare、甚至包括google的bigtable。

總結

寫到這裡,我發現單單是這些新的資料庫解決方案就有太多可寫的內容,而這些已經超過了本文所要說明的主要內容,而現在所寫的內容就全當是個引子吧,我寫的很意猶未盡。後面會就反正規化設計例項,記憶體快取方案、nosql資料庫等逐漸展開。

正規化的理解

關聯式資料庫規範化 關係內部各屬性之間的聯絡的合理化程度 正規化 符合第二正規化的就一定符合第一正規化 2nf在1nf的基礎之上,消除了非主屬性對於碼的部分函式依賴。函式依賴 屬性x能夠確定屬性y,則y函式依賴於x,即x y 依賴於誰,誰在前面 碼 除 k 之外的所有屬性都完全函式依賴於 k,則k是...

三正規化的理解

1nf 字段不可分 2nf 有主鍵,非主鍵字段依賴主鍵 3nf 非主鍵字段不能相互依賴 解釋 1nf 原子性 字段不可再分,否則就不是關聯式資料庫 2nf 唯一性 乙個表只說明乙個事物 3nf 每列都與主鍵有直接關係,不存在傳遞依賴 不符合第一正規化的例子 關聯式資料庫中create不出這樣的表 表...

三正規化的理解

list b 第二正規化 2nf b 單關鍵字的表,或者若為組合關鍵字則必須沒有關鍵字組合鍵中的某個字段 非關鍵字段的表 b 第三正規化 3nf b 在第二正規化的基礎上,資料表中如果不存在傳遞函式依賴 關鍵字段 非關鍵字段x 非關鍵字段y list size large b 第一正規化 1nf b...