關係資料庫範式詳解(Normal form,簡稱NF)

来源:https://www.cnblogs.com/folio/p/18074251
-Advertisement-
Play Games

引言 關係資料庫中的關係滿足一定要求的,滿足不同程度要求的為不同的範式,共有6種範式。 滿足最低要求的叫第一範式,簡稱 1NF;在第一範式的基礎上滿足進一步要求的稱為第二範式,簡稱 2NF; 其餘範式以此類推。 對於各種範式之間有如下關係: 5NF ∈ 4NF ∈ BCNF ∈ 3NF ∈ 2NF ...


引言

關係資料庫中的關係滿足一定要求的,滿足不同程度要求的為不同的範式,共有6種範式。
滿足最低要求的叫第一範式,簡稱 1NF;在第一範式的基礎上滿足進一步要求的稱為第二範式,簡稱 2NF; 其餘範式以此類推。
對於各種範式之間有如下關係:
5NF ∈ 4NF ∈ BCNF ∈ 3NF ∈ 2NF ∈ 1NF
各種範式之間的關係

第一範式 1NF

  • 定義: 屬於第一範式關係的所有屬性都不可再分,即數據項不可分。
  • 理解: 第一範式強調數據表的原子性,是其他範式的基礎。如下圖所示資料庫就不符合第一範式:
公司名稱 地址
商品
電話
名稱 數量
上表將商品這一數據項又劃分為名稱和數量兩個數據項,故不符合第一範式關係。改正之後如下圖所示:
公司名稱 地址 商品名稱 商品數量 電話

上表就符合第一範式關係。
但日常生活中僅用第一範式來規範表格是遠遠不夠的,依然會存在數據冗餘過大、刪除異常、插入異常、修改異常的問題,此時就需要引入規範化概念,將其轉化為更標準化的表格,減少數據依賴。

  • 規範化: 一個低一級的關係模式通過模式分解可以轉化為若幹個高一級範式的關係模式的集合,這個過程叫做規範化。

第二範式 2NF

  • 定義: 若某關係 R 屬於第一範式,且每一個非主屬性完全函數依賴於任何一個候選碼,則關係 R 屬於第二範式。
    此處我們需要理解非主屬性、候選碼和完全函數依賴的概念。
  • 候選碼: 若關係中的某一屬性組的值能唯一地標識一個元組,而其子集不能,則稱該屬性組為候選碼。若一個關係中有多個候選碼,則選定其中一個為主碼。
    以下所有內容中,主碼或候選碼都簡稱為碼。

例如

下圖所示的學生表中,學號和姓名都可以唯一標識一個元組,故該表的候選碼為學號和姓名,主碼我們可以隨便選定其中一個,則選學號為主碼。

學號 姓名 年齡 性別
101 劉晨 19
102 王琪 21
103 張宇 20
104 李琛 19
105 歐陽慧 20
  • 主屬性: 所有候選碼的屬性稱為主屬性。不包含在任何候選碼中的屬性稱為非主屬性或非碼屬性。

在上面的學生表中,學號和姓名就是該關係的主屬性,年齡和性別就是非主屬性。

  • 函數依賴: 設 R (U) 是屬性集 U 上的關係模式,X、Y 是 U 的子集。若對於 R (U) 的任意一個可能的關係 r,r 中不可能存在兩個元組在 X 上的屬性值相等,而在 Y 上的屬性值不等,則稱 Y 函數依賴於 X 或 X 函數確定 Y。
  • 完全函數依賴: 設 R (U) 是屬性集 U 上的關係模式,X、Y 是 U 的子集。如果 Y 函數依賴於 X,且對於 X 的任何一個真子集 X’,都有 Y 不函數依賴於 X’,則稱 Y 對 X 完全函數依賴。記作:如果 Y 函數依賴於 X,但 Y 不完全函數依賴於 X,則稱 Y 對 X 部分函數依賴。
      X ---> Y   Y 函數依賴於 X
      X -F-> Y   Y 函數完全依賴於 X
      X -P-> Y   Y 函數部分依賴於 X
  • 理解: 第二範式是指每個表必須有一個(有且僅有一個)數據項作為關鍵字或主鍵(primary key),其他數據項與關鍵字或者主鍵一一對應,即其他數據項完全依賴於關鍵字或主鍵。由此可知單主屬性的關係均屬於第二範式。

判斷一個關係是否屬於第二範式:

  1. 找出數據表中的所有碼;
  2. 找出所有主屬性和非主屬性;
  3. 判斷所有的非主屬性對碼的部分函數依賴。

以上面的學生表為例,表中的碼為學號(碼可以為學號或者姓名,此處假定碼為學號),非主屬性為性別、年齡(其餘都為主屬性),當學號確定時,性別、年齡也都惟一的被確定為,故學生表的設計滿足第二範式(學生表為單主屬性的關係)。

例如

下麵舉一個不滿足第二範式的關係。
有關係模式 S-L-C (Sno, Sdept, Sloc, Cno, Grade),其中 Sno, Sdept, Sloc, Cno, Grade 依次表示學生的學號、所在的系、住處、課程號、班級,並且每個系的學生住在同一個地方。可知 S-L-C 的碼為(Sno, Cno),則存在以下函數依賴:

      (Sno, Cno)  -F->  Ggrade
       Sno --->  Sdept ,  (Sno, Cno)  -P->  Sdept
       Sno --->  Sloc ,   (Sno, Cno)  -P->  Sloc ,  Sdept --->  Sloc (每個系的學生住在同一個地方)

可以看到,非主屬性 Sloc、Sdept 並不完全函數依賴於碼,因此關係模式 S-L-C (Sno, Sdept, Sloc, Cno, Grade) 不符合第二範式。

第三範式 3NF

  • 定義: 非主屬性既不傳遞依賴於碼,也不部分依賴於碼。

首先我們要理解傳遞函數依賴的概念。

在R(U)中,若X-->Y,Y-/->X,Y-->Z,Z不屬於Y,則稱Z對X傳遞函數依賴。記作 X -傳遞-> Z。

  • 理解: 第三範式要求在滿足第二範式的基礎上,任何非主屬性不依賴於其他非主屬性,即在第二範式的基礎上,消除了傳遞依賴。

在下圖 S-L 關係中,Sloc 對 Sno 傳遞函數依賴,故該關係不屬於第三範式。

graph LR A(Sno) --> B(Sdept) B --> C(Sloc) A --> C

BC範式 BCFN

  • 定義: 關係模式 R 中,若每一個決定因素都包含碼,則 R 屬於 BCFN。
  • 理解: 根據定義我們可以得到結論,一個滿足 BC 範式的關係模式有:
    1. 所有非主屬性對每一個碼都是完全函數依賴;
    2. 所有主屬性對每一個不包含它的碼也是完全函數依賴;
    3. 沒有任何屬性完全函數依賴於非碼的任何一組屬性。

例如有關係模式 C (Cno, Cname, Pcno),Cno, Cname, Pcno 依次表示課程號、課程名、先修課。可知關係 C 只有一個碼 Cno,且沒有任何屬性對 Cno 部分函數依賴或傳遞函數依賴,所以關係 C 屬於第三範式,同時 Cno 是 C 中的唯一決定因素,所以 C 也屬於 BC 範式。

第四範式 4NF

  • 定義: 限制關係模式的屬性之間不允許有非平凡且非函數依賴的多值依賴。
  • 理解: 顯然一個關係模式是 4NF,則必為 BCNF。也就是說,當一個表中的非主屬性互相獨立時(3NF),這些非主屬性不應該有多值,若有多值就違反了 4NF。

第五範式 5NF

第五範式有以下要求:

  1. 必須滿足第四範式;
  2. 表必須可以分解為較小的表,除非那些表在邏輯上擁有與原始表相同的主鍵。

第五範式是在第四範式的基礎上做的進一步規範化。第四範式處理的是相互獨立的多值情況,而第五範式則處理相互依賴的多值情況。

落之~

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

-Advertisement-
Play Games
更多相關文章
  • 1、準備材料 正點原子stm32f407探索者開發板V2.4 STM32CubeMX軟體(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP模擬器 XCOM V2.6串口助手 一個滑動變阻器 2、學習目標 本文主要學習 FreeRTOS 信號量的相關知識 ...
  • Linux的shell腳本,有時候我們在運行shell腳本時會給腳本傳入參數,出於邏輯上的嚴謹,在腳本中可能會做一些邏輯判斷或處理,例如判斷腳本傳入參數的個數。一般我們會用$#獲取傳入參數的個數,假如,我們在shell腳本的main函數中去判斷腳本傳入參數的個數,類似如下所示: .........f ...
  • 本文主要學習 FreeRTOS 消息隊列的相關知識,包括消息隊列概述、創建刪除複位隊列、寫入/讀取數據到隊列等關於隊列的基礎知識 ...
  • 一:新建虛擬主機 1. 在tomcat里新建文件夾myapps,在裡面添加ROOT文件,放入網站的首頁文件 新建文本文檔,輸入你想要的內容我這裡的內容是TOM.AI,把文本文檔的名字改成index.htm 2. server.xml下每個host節點就代表一個主機,相當於一個網站。 用記事本打開to ...
  • 哈嘍大家好,我是鹹魚。 今天收到了一個告警,說有台伺服器上的 swap 過高,已經用了 50% 以上了。 登錄機器查看一下記憶體以及 swap 的使用情況。 [root@localhost ~]# free -h total used free shared buff/cache available ...
  • 大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是使用恩智浦GUI Guider快速創建全新LCD屏示例工程的步驟。 在痞子衡舊文 《在i.MXRT1170上快速點亮一款全新LCD屏的方法與步驟》 里,痞子衡介紹了在官方 SDK 裸機驅動 elcdif 示例工程基礎上做修改以支持一款全 ...
  • Linux系統提供了許多命令來分析系統性能。以下是一些常用的Linux系統性能分析命令: top:實時監視系統的運行狀態和進程信息,包括CPU使用率、記憶體使用情況、進程狀態等。 實例:直接在終端中輸入top,即可實時查看系統進程狀態及資源占用情況。 htop:類似於top,但提供更友好的界面和交互, ...
  • 一、下載Nginx安裝包 Nginx官網下載地址 根據需求選擇自己需要的版本下載後上傳至伺服器(路徑自行決定)。 如果伺服器有外網,可以直接在伺服器上下載。 wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、安裝Nginx 解壓安裝包 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...