1. 程式人生 > >資料庫設計反正規化

資料庫設計反正規化

1.正規化 1.1 1NF-3NF 定義 1NF確保原子性(Atomicity)原子性的粒度、原子性的價值(1正規化:單值,並且把值當做單值用,建議不要把值拆開) 2NF檢查對鍵的完全依賴價值在在於控制資料冗餘和查詢效能 3NF檢查屬性的獨立性 規範化的價值合理規範化的模型可應對需求變更 規範化資料重複降至最少

為什麼要有三正規化? 不會發生插入(insert)、刪除(delete)和更新(update)操作異常。 控制資料冗餘和提高查詢效能 更好的進行資料有效性檢查,提高儲存效率。 正規化的滿足便於資料一致性的控制

如何控制冗餘? 使用資料庫三正規化

缺點 正規化化的表,在查詢的時候經常需要很多的關聯,因為單獨一個表內不存在冗餘和重複資料。這導致多次的關聯,增加查詢代價 可能使一些索引策略無效。因為正規化化將列存放在不同的表中,而這些列在一個表中本可以屬於同一個索引。

1.2 反正規化(逆正規化)打破正規化 定義,為什麼要有反正規化? 等級越高的正規化設計出來的表越多,可能會增加查詢所需時間。當我們的業務所涉及的表非常多,經常會有多表連線,並且我們對錶的操作要時間上要儘量的快,這時可以考慮我們使用“反正規化”。 反正規化用空間來換取時間,引入受控的資料冗餘,當查詢時可以減少或者是避免表之間的關聯

優點 可以避免關聯,因為所有的資料幾乎都可以在一張表上顯示; 可以設計有效的索引; 缺點 提高了對資料冗餘的維護,為了保證資料的一致性(可以用觸發器來解決這個問題,某個表被修改後觸發另一個表的更新)

反正規化的7種模式,並舉例。 ①一對一:合併表 如果雙方都是完全參與,那麼某個表直接可以作為另一張表的屬性直接合並。若有一方是部分參與,把完全參與的併入部分參與的會出現空值,將部分參與併入完全參與的可以。若雙方都是部分參與,一定會出現空值,這樣就很難確定主鍵 例子:員工表(員工編號,姓名,住址,薪水,科室編號) 親屬表(員工編號,親屬姓名,親屬電話),其中親屬表中只登記一位親屬,如果要查詢張三的親屬的電話,就要連線兩張表,所以將兩張表合併以減少連線。

②一對多:複製非關鍵字以減少連線 適用條件:當兩張表連線時,最主要的事務都與某個非鍵值相關 例子:兩個表(使用者id,好友id)和(使用者id,使用者暱稱,使用者郵箱,聯絡電話)符合3NF,如果需查詢某個使用者的好友(暱稱)名單,此時需對2個表進行連線查詢,可以把第一個表修改成(使用者id,好友id,好友暱稱)這樣只需要查詢第一個表就可獲取所有好友暱稱.

③一對多:複製關鍵字以減少連線 複製一對多關係中的外來鍵,使需要通過第三張表連線的兩張表直接關連在一起 在一對多的關係中,將另一實體表的主鍵複製到多的實體表當外來鍵,減少join表的數量

例子:每個部門租了一些錄影帶,每盤錄影帶是有租賃協議的。這樣有三張表:部門(部門編號),租的錄影(錄影帶編號,部門編號),租賃協議,見下圖關係表

\
\

④多對多:關係裡面複製值以減少連線 引入一張新表,多對多被拆成兩個一對多(滿足3NF)。 假設要查詢,演員演了哪些電影,為了避免三張表連線,就在role表中複製電影名稱以減少連線

\
\

⑤引入重複組 引入重複組,重複組一般不超過10個 (對於一個多值屬性,如果多值的數量不多小於等於10) 例子:customer 可能有多個address。一般是customer一張表,address一張表,address中儲存它對應的customer的ID那麼每次付款的時候,需要再查詢address表來得到customer的所有地址。可以在customer後面加addr1、addr2欄位,但不知道要加多少個,不好。較為常見的做法是,在customer表中引入一條addr欄位,放最常用地址,address表中儲存所有地址。

⑥提取表 extract table的表中內容和原表可能都相同,只是組織結構不同,有可能一個是為了查詢而建的表(將經常被查詢的資料提前計算出來存入該表,會有大量冗餘,但是提高效率),另一個是為了update的,一定程度上實現了讀寫分離。 比如有學生表,宿舍表,為了查學生的住宿費,需要連線兩表。此時可以提取出一張用於查詢的表,其中包含了學生姓名,住宿費用以及其他欄位,方便查詢。

⑦使用分割槽表 可以將表分解成更少的分割槽。 水平分割槽:跨多個(較小)的表分配記錄。這種形式分割槽是對錶的行進行分割槽,通過這樣的方式不同分組裡面的物理列分割的資料集得以組合,從而進行個體分割(單分割槽)或集體分割(1個或多個分割槽)。所有在表中定義的列在每個資料集中都能找到,所以表的特性依然得以保持。 例子:一個包含十年發票記錄的表可以被分割槽為十個不同的分割槽,每個分割槽包含的是其中一年的記錄。 垂直分割槽:跨多個(較小)表分佈列。 PK複製,以便重建。垂直分割槽(Vertical Partitioning) 這種分割槽方式一般來說是通過對錶的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分割槽,每個分割槽都包含了其中的列所對應的行。 例子:一個包含了大text和BLOB列的表,這些text和BLOB列又不經常被訪問,這時候就要把這些不經常使用的text和BLOB了劃分到另一個分割槽,在保證它們資料相關性的同時還能提高訪問速度。

相關推薦

資料庫設計正規化

1.正規化 1.1 1NF-3NF 定義 1NF確保原子性(Atomicity)原子性的粒度、原子性的價值(1正規化:單值,並且把值當做單值用,建議不要把值拆開) 2NF檢查對鍵的完全依賴價值在在於控制資料冗餘和查詢效能 3NF檢查屬性的獨立性 規範化的價值合理規範化的模型可應對需求變更 規範

資料庫設計正規化正規化

我們在設計資料庫的過程中,往往要用到正規化或反正規化的設計模式。熟悉地掌握正規化與反正規化的要領,學會在實際開發中恰當地混合使用正規化與反正規化,才能設計出結構合理,執行高效的資料庫。 下面就以一個經典的例子進行講述正規化與反正規化: 職工-部門表: 部門-部門

JDBC章節總結(.資料庫設計正規化、如何設計資料庫表)

1.介面可以降低程式的耦合度,提高程式的擴充套件力* 答:如果需要擴充套件介面功能的時候,直接建立一個實現介面功能的物件就可以了。 2.JDBC是一套專門用來操作資料庫的介面* 見名知意,java databases connection java 虛擬機器與資料庫之間的連線,需

資料庫設計三大正規化和五大約束

【三大正規化】 第一正規化(1NF):   資料表中的每一列(欄位),必須是不可拆分的最小單元,也就是確保每一列的原子性。   例如: userInfo: '山東省煙臺市 1318162008' 依照第一正規化必須拆分成        &

資料庫設計正規化

第一正規化(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。 問:怎麼知道列還能不能分? 答:靠生活常識與經驗 舉例1 id 地址 1 中國廣東 2

轉:資料庫設計三大正規化

http://www.cnblogs.com/linjiqin/archive/2012/04/01/2428695.html 為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須

資料庫設計三大正規化簡析

為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的正規化。       在實際開發中最為常見的設計正規化有三

資料庫設計三大正規化

為了建立冗餘較小、結構合理的資料庫,設計資料庫時必須遵循一定的規則。在關係型資料庫中這種規則就稱為正規化。正規化是符合某一種設計要求的總結。要想設計一個結構合理的關係型資料庫,必須滿足一定的正規化。 在實際開發中最為常見的設計正規化有三個: 1.第一正規化(確保每

深入淺出資料庫設計正規化

        設計良好結構的資料庫,可以有效減小資料冗餘,減少增刪改中出現的問題。深入理解資料庫設計的三正規化,對於設計“健壯的資料庫“十分有必要。資料庫三正規化是設計資料庫 時參考的準則,接下來我們一一進行介紹: 一、資料庫第一正規化:        資料庫表的每一列

資料庫設計 第一正規化 二 三 INF 2NF 3NF 區別 詳解 傳遞依賴

關於資料庫的設計準則,平時我也就知道怎麼去做。當有人問起我第三正規化的時候,我還真不知道怎麼去表述了。找到這篇解說,覺得概念和例子都講得不錯,收藏起來,以備後用。 I、關係資料庫設計正規化介紹 1.1 第一正規化(1NF)無重複的列         所謂第一正規化(1NF

資料庫設計正規化的舉例說明

前言        資料庫課本上都把正規化寫到五正規化了,但是實際應用中,滿足三正規化已經足夠了,五正規化太多餘了。 三種正規化是條件遞增的聯絡(即後一個正規化是在前一個條件滿足的情況下引入新的條件)。 例如  正規化 滿足條件

關係型資料庫設計三大正規化

1.何為資料庫正規化? 設計關係資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同 規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。 目前關係資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第

資料庫設計正規化理解

從資料庫理論上講,一共有8種正規化(normal form),分別是:1NF,2NF,3NF,BCNF,4NF,5NF,DKNF,

資料庫設計正規化的理解

反三正規化是基於第三正規化所調整的,沒有冗餘的資料庫未必是最好的資料庫,有時為了提高執行效率,就必須降低正規化標準,適當保留冗餘資料。具體做法是: 在概念資料模型設計時遵守第三正規化,降低正規化標準的工作放到物理資料模型設計時考慮。降低正規化就是增加欄位,減少了查詢時的關聯,提高查詢效率,因為在資料

資料庫設計一二三四正規化有何區別

範化是在識別資料庫中的資料元素、關係、以及定義所需的表和各表中的專案這些初始化工作之後的一個細化的過程。常見的正規化有1NF 2NF 3NF BCNF以及4NF。 1NF,第一正規化。第一正規化是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者

資料庫設計之三大正規化NF

       國內絕大多數院校用的王珊的《資料庫系統概論》這本教材,某些方面並沒有給出很詳細很明確的解釋,與實際應用聯絡不那麼緊密,你有這樣的疑問也是挺正常的。我教《資料庫原理》這門課有幾年了,有很多學生提出了和你一樣的問題

資料庫設計之三正規化的的理解

目的:  為了降低資料冗餘,消除資料插入異常、更新異常、刪除異常。在設計資料庫時正規化要求越嚴謹則設計出來的表則越多資料結構越靈活。 定義: 第一正規化(1NF):資料表中的每一列(每個欄位)必須是不可拆分的最小單元,也就是確保每一列的原子性; 第二正規化(2NF):滿足1NF後,

資料庫設計之規範化--------幾種正規化詳解

資料庫的設計正規化是資料庫設計所需要滿足的規範,滿足這些規範的資料庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。反之則是亂七八糟,不僅給資料庫的程式設計人員製造麻煩,而且面目可憎,可能儲存了大量不需要的冗餘資訊。  

資料庫設計除了需要遵守正規化還需要的遵守的原則

1. 可用性 舉一個簡單的例子,就像現在部落格園可以上傳的字元數量,如果該欄位的長度只有500字,這顯然不能滿足場景的要求 2. 適當超前 超前到什麼程度需要根據對應用的預期來定。拿QQ來說,馬化騰最初肯定預見不到QQ能有目前的使用者量與活躍度,畢竟那是近20年前的事情了。 對於本文設定的應用場景,我

MySQL資料庫三大正規化正規化

第一正規化(1NF): 資料表中的每一列(欄位),必須是不可拆分的最小單元,也就是確保每一列的原子性。 Table: t_user_info — — — — — —