資料庫知識點⑤

来源:http://www.cnblogs.com/zpfbuaa/archive/2016/05/24/5523163.html
-Advertisement-
Play Games

1.第三範式 定義 如果關係模式R屬於2NF,且每個非主屬性都不傳遞依賴於R的每個關係鍵,則稱R屬於第三範式(Third Normal Form),簡稱3NF,記作R屬於3NF。 基本性質: 1.如果R屬於3NF,則R也是2NF。 2.如果R屬於2NF,則R不一定是3NF。 例如,我們前面由關係模式 ...


1.第三範式

定義

如果關係模式R屬於2NF,且每個非主屬性都不傳遞依賴於R的每個關係鍵,則稱R屬於第三範式(Third Normal Form),簡稱3NF,記作R屬於3NF。

基本性質:

1.如果R屬於3NF,則R也是2NF。

2.如果R屬於2NF,則R不一定是3NF。

例如,我們前面由關係模式SCD分解而得到的SD和SC都為2NF,其中,SC屬於3NF,但在SD中存在著非主屬性MN對主鍵SNO傳遞依賴,SD不是3NF。對於SD,應該進一步進行分解,使其轉換成3NF。

2.3NF規範化

3NF規範化是指把2NF關係模式通過投影分解轉換成3NF關係模式的集合。

和2NF的規範化時遵循的原則相同,即“一事一表”,讓一個關係只描述一個實體或者實體間的聯繫。

舉例將之前的SD表進行再分解,使其滿足第三範式

clip_image008

SD(SN,AGE,DEPT,MN)分解為S(SN,AGE,DEPT)D(MN),如下圖所示

clip_image010

3.第三範式3NF與第二範式2NF相比

(a).數據冗餘降低。系主任的名字存儲的次數與該系的學生人數無關,只在關係D中存儲一次。

(b).不存在插入異常。當一個新系沒有學生時,該系的信息可以直接插入到關係D中,而與學生關係S無關。

(c).不存在刪除異常。要刪除某系的全部學生而仍然保留該系的有關信息時,可以只刪除學生關係S中的相關學生記錄,而不影響系關係D中的數據。

(d)不存在更新異常。更換系主任時,只需修改關係D中一個相應元組的MN屬性值,從而不會出現數據的不一致現象。

SCD規範到3NF後,所存在的異常現象已經全部消失。

4.第三範式3NF的不足

3NF只限制了非主屬性對鍵的依賴關係,而沒有限制主屬性對鍵的依賴關係

如果發生了這種依賴,仍有可能存在數據冗餘、插入異常、刪除異常和修改異常。

這時,則需對3NF進一步規範化,消除主屬性對鍵的依賴關係,為瞭解決這種問題,Boyce與Codd共同提出了一個新範式的定義,這就是Boyce-Codd範式,通常簡稱BCNF或BC範式。它彌補了3NF的不足。

5.BCNF範式

定義 如果關係模式R屬於1NF,且所有的函數依賴X→Y(Y ,X),決定因素X都包含了R的一個候選鍵,則稱R屬於BC範式(Boyce-Codd Normal Form,記作R屬於BCNF。

基本性質

(a).滿足BCNF的關係將消除任何屬性(主屬性或非主屬性)對鍵的部分函數依賴和傳遞函數依賴。也就是說,如果R屬於BCNF,則R也是3NF。

(b)如果R屬於3NF,則R不一定是BCNF

舉例:

設關係模式SNC(SNO,SN,CN0,SCORE),其中SNO代表學號,SN代表學生姓名並假設沒有重名,CNO代表課程號,SCORE代表成績。可以判定,SNC有兩個候選鍵(SNO,CNO)和(SN,CNO),其函數依賴如下:

SNO <->SN

(SNO,CNO)→SCORE

(SN,CNO)→SCORE。

唯一的非主屬性SCORE對鍵不存在部分函數依賴,也不存在傳遞函數依賴所以SNC屬於3NF

但是,因為SNO <->SN,即決定因素SNO或SN不包含候選鍵,從另一個角度說,存在著主屬性對鍵的部分函數依賴: (SNO,CNO)-(p)-> SN,(SN,CNO)-(p)->SNO,所以SNC不是BCNF

分析

正是存在著這種主屬性對鍵的部分函數依賴關係,造成了關係SNC中存在著較大的數據冗餘,學生姓名的存儲次數等於該生所選的課程數。從而會引起修改異常。

比如,當要更改某個學生的姓名時,則必須搜索出現該姓名的每個學生記錄,並對其姓名逐一修改,這樣容易造成數據的不一致問題。

解決這一問題的辦法仍然是通過投影分解進一步提高SNC的範式等級,SNC規範到BCNF

6.BCNF範式的規範化

BCNF規範化是指把3NF關係模式通過投影分解轉換成BCNF關係模式的集合。

還是上面的例子:

將SNC(SNO,SN,CNO,SCORE)規範到BCNF。

分析SNC數據冗餘的原因,是因為在這一個關係中存在兩個實體,一個為學生實體,屬性有SNO、SN;另一個是選課實體,屬性有SNO、CNO和SCORE。

根據分解的原則,我們可以將SNC分解成如下兩個關係:

S1(SNO,SN),描述學生實體;

S2(SNO,CNO,SCORE),描述學生與課程的聯繫。

對於S1,有兩個候選鍵SNO和SN,

對於S2,主鍵為(SNO,CNO)。

在這兩個關係中,無論主屬性還是非主屬性都不存在對鍵的部分依賴和傳遞依賴,S1屬於BCNF,S2屬於BCNF。

7.讓我們看一下從1NF到BCNF的轉化過程

下圖是1NF的函數依賴關係圖(存在部分依賴以及傳遞依賴)

clip_image011

下圖是2NF函數依賴關係圖(消除了部分依賴但是存在傳遞依賴)

clip_image008[1]

下圖是3NF函數依賴關係圖(消除了部分依賴和傳遞依賴,但是主屬性對鍵存在著部分依賴關係)

clip_image012

下圖是BCNF函數依賴關係圖(消除了部分依賴和傳遞依賴,以及主屬性對鍵的部分依賴關係)

clip_image013

8.關係模式的規範化

定義:

一個低一級範式的關係模式,通過模式分解轉化為若幹個高一級範式的關係模式的集合,這種分解過程叫作關係模式的規範化(Normalization)

目的:

規範化的目的就是使結構合理,消除存儲異常,使數據冗餘儘量小,便於插入、刪除和更新。

原則:

規範化的基本原則就是遵從概念單一化“一事一表”的原則,即一個關係只描述一個實體或者實體間的聯繫。

規範化的步驟:

(a).對1NF關係進行投影,消除原關係中非主屬性對鍵的部分函數依賴,將1NF關係轉換成若幹個2NF關係。

(b).對2NF關係進行投影,消除原關係中非主屬性對鍵的傳遞函數依賴,將2NF關係轉換成若幹個3NF關係。

(c).對3NF關係進行投影,消除原關係中主屬性對鍵的部分函數依賴和傳遞函數依賴,也就是說使決定因素都包含一個候選鍵。得到一組BCNF關係。

clip_image014

規範化的要求:

關係模式的規範化過程是通過對關係模式的投影分解來實現的,但是投影分解方法不是唯一的,不同的投影分解會得到不同的結果。

在這些分解方法中,只有能夠保證分解後的關係模式與原關係模式等價的方法才是有意義的。

判斷對關係模式的一個分解是否與原關係模式等價可以有三種不同的標準:

1.分解要具有無損連接性。

2.分解要具有函數依賴保持性。

3.分解既要具有無損連接性,又要具有函數依賴保持性。

9.非規範化設計

使用非規範化設計原因:

(a).許多資料庫應用強調性能優先

(b).規範化設計有時會導致資料庫運行效率的下降

(c).在特殊條件和要求下,適當地降低甚至拋棄關係模式的範式,不再要求一個表只描述一個實體或者實體間的一種聯繫。其主要目的在於提高資料庫的運行效率。

何時進行非規範化處理:

(a).大量頻繁的查詢過程所涉及的表都需要進行連接;

(b).主要的應用程式在執行時要將表連接起來進行查詢;

(c).對數據的計算需要臨時表或進行複雜的查詢。

非規範化處理的主要技術:

包括增加冗餘或派生列,對錶進行合併、分割或增加重覆表。

10.增加冗餘列(用空間換取時間)

增加冗餘列是指在多個表中具有相同的列,它常用來在查詢時避免連接操作。

舉例:

如果經常檢索一門課的任課教師姓名,則需要做class和teacher表的連接查詢:

select classname,teachername

from class,teacher

where class.teacherno=teacher.teacherno

這樣的話就可以在class表中增加一列teacher-name就不需要連接操作了。

增加冗餘列可以在查詢時避免連接操作,但它需要更多的磁碟空間,同時增加表維護的工作量。

11.增加派生列

增加派生列指增加的列來自其它表中的數據,由它們計算生成。

它的作用是在查詢時減少連接操作,避免使用集函數。派生列也具有與冗餘列同樣的缺點。

12.重新組表

重新組表指如果許多用戶需要查看兩個表連接出來的結果數據,則把這兩個表重新組成一個表來減少連接而提高性能。

舉例:

用戶經常需要同時查看課程號,課程名稱,任課教師號,任課教師姓名,則可把表class(classno,classname,teacherno)和表teacher(teacherno,teachername)合併成一個表class(classno,classname,teacherno,teachername)。

這種方法可以提高性能,但需要更多的磁碟空間,同時也損失了數據在概念上的獨立性。

13.對錶進行分割

表分割有兩種方式:

水平分割

垂直分割

水平分割:根據一列或多列數據的值把數據行放到兩個獨立的表中。

水平分割的使用:

(a).表很大,分割後可以降低在查詢時需要讀的數據和索引的頁數,同時也降低了索引的層數,提高查詢速度。

(b).表中的數據本來就有獨立性,例如表中分別記錄各個地區的數據或不同時期的數據,特別是有些數據常用,而另外一些數據不常用。

(c).需要把數據存放到多個介質上。

舉例:

法規表law就可以分成兩個表active-law和inactive-law。active-law表中的內容是正生效的法規,是經常使用的,而inactive-law表則使已經作廢的法規,不常被查詢。

水平分割會給應用增加複雜度,它通常在查詢時需要多個表名,查詢所有數據需要union操作。在許多資料庫應用中,這種複雜性會超過它帶來的優點。

垂直分割:把主鍵和一些列放到一個表,然後把主鍵和另外的列放到另一個表中

垂直分割的使用:

如果一個表中某些列常用,而另外一些列不常用,則可以採用垂直分割加快查詢速度。其缺點是需要管理冗餘列,查詢所有數據需要join操作。

14.非規範化設計總結

主要優點:

(a).減少了查詢操作所需的連接

(b).減少了外部鍵和索引的數量

(c).可以預先進行統計計算,提高了查詢時的響應速度

主要問題:

(a).增加了數據冗餘

(b).影響資料庫的完整性

(c).降低了數據更新的速度

(d)增加了存儲表所占用的物理空間

 

 

上一篇資料庫知識點④:http://www.cnblogs.com/zpfbuaa/p/5522527.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 2.1 關係資料庫的結構 關係資料庫由表(table)的集合構成,每個表有唯一的名字。例如,instructor表記錄了有關教師的信息,它有四個列首:ID、name、dept_name和salary。該表中每一行記錄了一位教師的信息,包括該教師的ID、name、dept_name以及salary。類 ...
  • HDFS Federation (讀書筆記) HDFS的架構 HDFS包含兩個層次: 命名空間管理 (Namespace) 和 塊/存儲管理 (Block Storage)。 命名空間管理(Namespace) HDFS的命名空間包含目錄、文件和塊。命名空間管理是指命名空間支持對HDFS中的目錄、文 ...
  • Error:Illegal mix of collations (utf8_general_ci,IMPLICIT) and (gbk_chinese_ci,COERCIBLE) for operation '='Errno:1267 問題很明顯,就是Mysql字元編碼問題,所以主要排查問題方嚮應該 ...
  • 在PL/SQL塊中可以定義變數和數據類型,這使得PL/SQL塊對數據的處理更加靈活。 變數和類型的定義放在PL/SQL塊的變數聲明部分。 變數的定義與使用 變數的定義有兩種格式,分別為:變數名 類型 [約束][DEFAULT 預設值]變數名 類型[約束][:=初始值]其中用方括弧限定的部分是可選的。 ...
  • 關於PL/SQL的內容,主要包括匿名塊、存儲過程和存儲函數三種形式的PL/SQL塊,以及在PL/SQL 中如何使用變數、類型、流控制語句、游標、觸發器、異常等內容,以及如何利用PL/SQL塊訪問資料庫中的數據。 PL/SQL概述 如果說SQL是一種標準的資料庫訪問語言,那麼PL/SQL則是Oracl ...
  • 20 分區 20 分區... 1 20.1 MySQL的分區概述... 2 20.2 分區類型... 3 20.2.1 RANGE分區... 3 20.2.2 LIST分區... 5 20.2.3 COLUMNS分區... 7 20.2.3.1 RANGE COLUMNS分區... 7 20.2.3 ...
  • 下載MongoDB 下載地址:https://www.mongodb.com/download-center?jmp=nav#community 這裡是在windows平臺下安裝MongoDB, 下載後,在本機,按提示進行安裝。 註: 這個安裝只是為了得到MongoDB的文件,安裝的機器並不是伺服器... ...
  • 第四章作業 1. 什麼是資料庫安全性? 答:資料庫的安全性是指保護資料庫以防止不合法的使用所造成的數據泄露、更改或破壞。 2. 試述實現資料庫安全性控制的常用方法和技術。 答:實現資料庫安全性控制的常用方法和技術有: (1)用戶標識和鑒別:該方法由系統提供一定的方式讓用戶標識自己的名字或身份。每次用 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...