mysql 正規化化 Mysql正規化與反正規化

2021-10-18 21:05:51 字數 1194 閱讀 2603

第一正規化(1nf)

第一正規化,強調屬性的原子性約束,要求屬性具有原子性,不可再分解。

第二正規化(2nf)

第二正規化,強調記錄的唯一性約束,表必須有乙個主鍵,並且沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。

舉個例子:版本表(版本編碼,版本名稱,產品編碼,產品名稱),其中主鍵是(版本編碼,產品編碼),這個場景中,資料庫設計並不符合第二正規化,因為產品名稱只依賴於產品編碼。存在部分依賴。所以,為了使其滿足第二正規化,可以改造成兩個表:版本表(版本編碼,產品編碼)和產品表(產品編碼,產品名稱)。

第三正規化(3nf)

第三正規化,強調屬性冗餘性的約束,即非主鍵列必須直接依賴於主鍵。

舉個例子,訂單表(訂單編碼,顧客編碼,顧客名稱),其中主鍵是(訂單編碼),這個場景中,顧客編碼、顧客名稱都完全依賴於主鍵,因此符合第二正規化,但是顧客名稱依賴於顧客編碼,從而間接依賴於主鍵,所以不能滿足第三正規化。為了使其滿足第三正規化,可以拆分兩個表:訂單表(訂單編碼,顧客編碼)和顧客表(顧客編碼,顧客名稱),拆分後的資料庫設計,就可以完全滿足第三正規化的要求了。

值得注意的是,第二正規化的側重點是非主鍵列是否完全依賴於主鍵,還是依賴於主鍵的一部分。第三正規化的側重點是非主鍵列是直接依賴於主鍵,還是直接依賴於非主鍵列。

反正規化正規化可以避免資料冗餘,減少資料庫的空間,減輕維護資料完整性的麻煩。 然而,通過資料庫正規化化設計,將導致資料庫業務涉及的表變多,並且可能需要將涉及的業務表進行多表連線查詢,這樣將導致效能變差,且不利於分庫分表。因此,出於效能優先的考量,可能在資料庫的結構中需要使用反正規化的設計,即空間換取時間,採取資料冗餘的方式避免表之間的關聯查詢。至於資料一致性問題,因為難以滿足資料強一致性,一般情況下,使儲存資料盡可能達到使用者一致,保證系統經過一段較短的時間的自我恢復和修正,資料最終達到一致。

需要謹慎使用反模式設計資料庫。一般情況下,盡可能使用正規化化的資料庫設計,因為正規化化的資料庫設計能讓產品更加靈活,並且能在資料庫層保持資料完整性。

另外乙個比較典型的場景,出於擴充套件性考慮,可能會使用 blob 和 text 型別的列儲存 json 結構的資料,這樣的好處在於可以在任何時候,將新的屬性新增到這個欄位中,而不需要更改表結構。但是,這個設計的缺點也比較明顯,就是需要獲取整個字段內容進行解碼來獲取指定的屬性,並且無法進行索引、排序、聚合等操作。因此,如果需要考慮更加複雜的使用場景,更加建議使用 mongodb 這樣的文件型資料庫。

真實場景很難做到正規化化,一般會選擇效能,保證最終一致性。

mysql 正規化化 MySQL 正規化和反正規化

1.第一正規化 1nf 列不能再拆分 原子性,字段不可分 列的資訊 只要是關係型資料庫,就自動滿足1nf 2.第二正規化 2nf 主鍵唯一,且被依賴 在第一正規化基礎上建立的,即滿足第二正規化的必須先滿足第一正規化。要求db表中的每個例項或行必須可以被唯一區分,通常設計乙個主鍵來實現,其他屬性完全依...

mysql 逆正規化化 mysql優化

一 mysql優化主要體現在四個方面。設計 儲存引擎 設計型別 正規化與逆正規化 功能 索引 快取 分區分表 合理sql 測試 經驗 1 儲存引擎 在建立表的時候我們使用sql語句,create table tablename engine myisam innodb 儲存引擎是engine還是in...

mysql 反正規化 mysql 正規化和反正規化

第一正規化 1nf 強調的是列的原子性,即列不能夠再分成其他幾列。第二正規化 2nf 首先是 2nf,另外包含兩部分內容一是表必須有乙個主鍵 二是沒有包含在主鍵中的列必須完全依賴於主鍵,而不能只依賴於主鍵的一部分。第三正規化 3nf 首先是 2nf,另外非主鍵列必須直接依賴於主鍵,不能存在傳遞依賴。...