關係型資料庫範式

来源:https://www.cnblogs.com/xtiger/archive/2019/03/25/10597266.html
-Advertisement-
Play Games

設計關係資料庫時,為了設計出合理的資料庫表結構,需要遵從不同的規範要求,這些規範性要求被稱為範式。 目前關係資料庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。 各種範式呈遞次規範,越高的範式 ...



     設計關係資料庫時,為了設計出合理的資料庫表結構,需要遵從不同的規範要求,這些規範性要求被稱為範式

     目前關係資料庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴斯-科德範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)

     各種範式呈遞次規範,越高的範式資料庫冗餘越小。滿足高層次範式的必定滿足低層次範式,如一個資料庫設計如果符合第二範式,一定也符合第一範式。

一、基本概念

     1、實體:現實世界中客觀存在的並可以相互區分的對象或事物。如"公司"、"項目"、"員工"等。

     2、屬性:實體所具有的某一特性。比如"公司名稱"、"公司地址"都是實體"公司"的屬性。

     3、:表中可以唯一確定一行數據的某個屬性[或者屬性組]。如[員工號]、[員工號績效評定月份]。不同的表結構,對應的碼不同。下文表(二)中,[員工號績效評定月份]屬性組就是碼。

     4、主屬性:包含在任何一個碼中的屬性稱為主屬性。下文表(二)中,員工號績效評定月份就是主屬性。

     5、非主屬性:與主屬性相反,沒有在任何候選碼中出現過,這個屬性就是非主屬性。下文表二中,員工姓名、部門、部門人數、績效就是非主屬性。

二、第一範式

     1、概述

     第一範式指的是符合第一範式的關係中的每個屬性都不可再分

     2、實例分析

     下表(一)中,由於部門信息這個屬性可以再分為部門和部門人數這兩個屬性,所以不符合第一範式。

員工號 員工姓名 部門   績效評定月份  績效 
部門 部門人數
10001 張三 開發部 30 201801 90
10001 張三 開發部 30 201802 85
10002 李四 集成部 30 201801 88
10002 李四 集成部 30 201802 87
10003 王五 綜合部 5 201802 89
10004 馬六 綜合部 5 201802 85

表(一)

     將上表修改成如下表,就滿足第一範式。

員工號 員工姓名 部門 部門人數 績效評定月份 績效
10001 張三 開發部 30 201801 90
10001 張三 開發部 30 201802 85
10002 李四 集成部 30 201801 88
10002 李四 集成部 30 201802 87
10003 王五 綜合部 5 201802 89
10004 馬六 綜合部 5 201802 85

     表(二)

     第一範式是所有關係型資料庫的最基本要求,只要在關係型資料庫管理系統(RDBMS)中已經存在的數據表,一定是符合第一範式。

     3、不足

       A、數據冗餘:如上表中,員工號、員工姓名、部門、部門人數數據重覆出現多次。

       B、插入異常:根據三種關係完整性約束中實體完整性的要求,關係中的碼所包含的任意一個屬性都不能為空,所有屬性的組合也不能重覆(可以簡單的理解為表的主鍵)。上表中,為了唯一區分每一條記錄,需要將(員工號績效評定月份)作為碼。如果一個新建的部門還沒有員工的話,那麼就無法將部門和部門人數的信息插入到表中,導致插入異常,無法有效記錄部門的信息。

       C、刪除異常:如果將員工相關的記錄都刪除,那麼部門相關的信息也會刪除,導致了刪除異常。

       D、修改異常:假如張三轉到集成部,為了保證資料庫中數據的一致性,需要修改兩條條記錄中部門與部門人數的數據,導致修改異常。

三、第二範式

     1、概述

     第二範式是為瞭解決第一範式所帶來的問題而設定的規則,它是在第一範式的基礎之上,消除了非主屬性對於碼的部分函數依賴。簡單地說,第二範式要求每個非主屬性完全依賴於主鍵,而不是僅依賴於主鍵其中的一部分屬性。

     2、相關概念

     A、函數依賴

     在一張表中,如果在屬性(或屬性組)X的值確定的情況下,必定能確定屬性Y的值,那麼就可以說Y函數依賴於X,寫作 X → Y。也就是說,在數據表中,不存在任意兩條記錄,它們在X屬性(或屬性組)上的值相同,而在Y屬性上的值不同。

     在上表(二)中,存在著以下的函數依賴:

      ★ 員工號 → 員工姓名

    ★ 部門 → 部門人數

    ★ (員工號,績效評定月份) → 績效

    以下的函數依賴則不成立:

    ★ 員工號 → 績效評定月份

    ★ 員工號 → 績效

     B、完全函數依賴

     如果X → Y是一個函數依賴,且對X的任何一個真子集X',都不存在X' → Y,則稱X → Y是一個完全函數依賴。為了方便表述,寫作X>>Y(非正式方式)。

     在上表中,存在著以下的完全函數依賴:

    ★ 員工號>>員工姓名

    ★ (員工號,績效評定月份)>>績效(員工號對應的績效不確定,績效評定月份對應的績效也不確定)

     C、部分函數依賴

     如果X → Y是一個函數依賴,並且存在X的一個真子集X',使得X' → Y,則稱X → Y是一個部分函數依賴。為了方便表述,寫作X>Y(非正式方式)。

     在上表中,存在著以下的部分函數依賴:

    ★ (員工號,績效評定月份)>員工姓名

     D、傳遞函數依賴

     如果X→Y,Y→Z,且Y不屬於X,Y → X不成立,則稱Z傳遞函數依賴於X。為了方便表述,寫作X>>>Z(非正式方式)。(限定Y不屬於X,Y→X不成立,是因為如果Y屬於X,那麼Z部分函數依賴於X,此時X中存在多餘屬性;若Y → X成立,則有X和Y等價,則關係中沒有必要同時存在X和Y)

     在上表中,存在著以下的傳遞函數依賴:

    ★ 員工號>>>部門人數(員工號 → 部門,部門 → 部門人數)

     3、實例分析

     根據定義,我們可以知道:第二範式就是判斷是否存在非主屬性對於碼的部分函數依賴,如果存在,則不滿足第二範式。

     判斷一個表是否符合第二範式,可以通過以下步驟進行判斷:

    ★ 找出表中所有的碼;

    ★ 根據第一步找出的碼,找出所有的主屬性;

    ★ 根據主屬性,找出所有的非主屬性;

    ★ 判斷是否存在非主屬性對於碼的部分函數依賴,由此判定是否符合第二範式;

     我們根據以上步驟來分析一下上表(二):

    ★ 該表的碼為:(員工號,績效評定月份)

    ★ 該表的主屬性為:員工號、績效評定月份

    ★ 該表的非主屬性為:員工姓名、部門、部門人數、績效

    ★ 該表的非主屬性對於碼的函數依賴關係如下:

      [員工號,績效評定月份] → 績效,完全函數依賴;

        [員工號,績效評定月份]→ 員工姓名,部分函數依賴;因為存在:員工號 → 員工姓名

        [員工號,績效評定月份]→ 部門,部分函數依賴;因為存在:員工號 → 部門

        [員工號,績效評定月份]→ 部門人數,傳遞函數依賴;因為存在:員工號 → 部門,部門 → 部門人數

     由於存在非主屬性對於碼的部分函數依賴,所以上表不符合第二範式。

     為了符合第二範式的要求,我們必須消除這些部分函數依賴,將大表拆分成更多個更小的表。

     我們將上表拆分成如下的兩個表:

員工號 績效評定月份 績效
10001 201801 90
10001 201802  85
10002  201801  88
10002  201802  87
10003  201802  89
10004  201802  85

表(三)

員工號 員工姓名 部門 部門人數
10001 張三 開發部 30
10002 李四 集成部 30
10003 王五 綜合部 5
10004 馬六 綜合部 5

表(四)

     兩個表的非主屬性對於碼的函數依賴關係如下:

    ★ [員工號,績效評定月份]→ 績效,完全函數依賴;

      ★ 員工號 → 員工姓名,完全函數依賴;

      ★ 員工號 → 部門,完全函數依賴;

      ★ 員工號 → 部門人數,完全函數依賴和傳遞函數依賴;因為存在:員工號 → 部門,部門 → 部門人數

      由於兩個表都符合完全函數依賴,所以兩個表都符合第二範式。

     那麼第二範式是否解決了第一範式的不足呢?

        A、數據冗餘:除部門人數數據重覆外,其餘無冗餘。有改進。

        B、插入異常:根據三種關係完整性約束中實體完整性的要求,關係中的碼所包含的任意一個屬性都不能為空,所有屬性的組合也不能重覆(可以簡單的理解為表的主鍵)。員工-部門表中,為了唯一區分每一條記錄,需要將員工號作為碼。如果一個新建的部門還沒有員工的話,那麼就無法將部門和部門人數的信息插入到表中,導致插入異常,無法記錄部門的信息。無改進

        C、刪除異常:表(四)中,如果將員工相關的記錄都刪除,那麼部門相關的信息也會刪除,導致了刪除異常。無改進

        D、修改異常:假如張三轉到集成部,只需要改動對應的部門即可。有改進。

     所以,僅僅符合第二範式的要求,很多情況下還是不夠的,為了能進一步解決這些問題,我們還需要將符合第二範式要求的表改進為符合第三範式的要求。而導致這些的原因是傳遞函數依賴。

三、第三範式

     1、概述

     第三範式是在第二範式的基礎之上,消除非主屬性對於碼的傳遞函數依賴。

     2、實例分析

     在上述例子中,由於存在員工號與部門人數的傳遞函數依賴,所以需要將表(四)進行再次拆分,拆分後所有表如下:

員工號 績效評定月份 績效
10001 201801 90
10001 201802 85
10002 201801 88
10002 201802 87
10003 201802 89
10004 201802 85

表(五)

員工號 員工姓名 部門
10001 張三 開發部
10002 李四 集成部
10003 王五 綜合部
10004 馬六 綜合部

表(六)

部門 部門人數
開發部 30
集成部 30
綜合部 5

表(七)

     以上三個表均滿足第三範式,那麼第三範式是否解決了第二範式的不足呢?

        A、數據冗餘:無冗餘。有改進。

        B、插入異常:可以插入部門信息。有改進。

        C、刪除異常:刪除員工信息,部門信息不會刪除。有改進

        D、修改異常:假如張三轉到集成部,只需要改動對應的部門即可。有改進。

     所以第三範式基本解決了數據冗餘、插入異常、刪除異常、修改異常等問題。

四、其它範式(待補充細化)

     A、BCNF範式

   1、所有非主屬性都完全函數依賴於每個候選鍵

   2、所有主屬性都完全函數依賴於每個不包含它的候選鍵

   3、沒有任何屬性完全函數依賴於非候選鍵的任何一組屬性

     B、第四範式

     解決多值依賴問題,要求把同一表內的多對多關係刪除。表示在多對多關係中,實體本身並不存儲關係,而關係都記錄在另一個中間關係表中,要選擇倆個多對多實體間的數據,必須通過中間關係表來得到,實體本身沒有存儲任何與另外一個實體的關係的記錄。

     C、第五範式

     也稱投影-連接範式,是資料庫規範化的一個級別,以去除多個關係之間的語義相關。一張表滿足第五範式當且僅當它的每個連接依賴可由候選鍵推出。

五、總結

     範式就是在資料庫表設計時移除數據冗餘的過程。隨著範式級別的提升,數據冗餘越來越少,但資料庫的效率也越來越低。

     一般情況下,資料庫設計滿足第三範式即可。


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

-Advertisement-
Play Games
更多相關文章
  • SVN 簡介: Subversion(SVN) 是一個開源的版本控制系統, 也就是說 Subversion 管理著隨時間改變的數據。 這些數據放置在一個中央資料檔案庫(repository) 中。 這個檔案庫很像一個普通的文件伺服器, 不過它會記住每一次文件的變動。 這樣你就可以把檔案恢復到舊的版本 ...
  • 監控項目及使用模板 監控http和https: Template App HTTP Service Template App HTTPS Service 監控cpu,記憶體,網路等: Template OS Linux (Template App Zabbix Agent) 監控埠: Templat ...
  • 今天登錄遠程windows2008系統主機發現出現如下錯誤:要登錄到這台遠程電腦,您必須被授予允許通過終端服務登錄的許可權。預設地,"遠程桌面用戶"組的成員擁有該許可權。如果您不是"遠程桌面用戶"組或其它擁有該許可權的組的成員,或者如 果"遠程桌面用戶"組沒有該許可權,您必須手動授予這些許可權。經過查找中找 ...
  • TMUX天下第一 全世界所有用CLI Linux的人都應該用TMUX,我愛它! 以下是正文 Linux下麵常用的搜索命令有這些:find locate grep which whereis。其中在我用的SuSE上,並沒有locate,所以也不能用它神奇的手動更新資料庫和"高速"索引查找,而grep是 ...
  • 按道理來說zabbix就自帶的MySQL插件來監控mysql資料庫,但是你會發現,自帶的mysql監控項是很少的,根本滿足不了公司的需求。由於它本身自帶的模板太過簡單了,所以需要做更詳細的監控,而percona就提供了這個詳細監控的模版以及腳本,解決了監控不全面的問題。percona插件是安裝在za ...
  • Github 入門 什麼是 Github? github是一個基於git的代碼托管平臺,付費用戶可以建私人倉庫,我們一般的免費用戶只能使用公共倉庫,也就是代碼要公開。 Github 由Chris Wanstrath, PJ Hyett 與Tom Preston-Werner三位開發者在2008年4月 ...
  • 一、playbook介紹 playbook 是 Ansible 管理配置、部署應用的核心所在,一個playbook由有多“play組成”,而一個play實際就是一個task,每個task是由多個ansible基本模塊構成,這樣我們可以用 playbook 來描述想在遠程主機執行的一些列操作,包括安裝 ...
  • 在 Oracle 之中數據表就被稱為資料庫對象,而對象的操作語法一共有三種:· 創建對象:CREATE 對象類型 對象名稱 [選項];· 刪除對象:DROP 對象類型 對象名稱 [選項];· 修改對象:ALTER 對象類型 對象名稱 [選項]。 創建表 一般而言,預設值是為了防止用戶在增加數據時為 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...