範式通俗理解:1NF、2NF、3NF和BNCF

来源:https://www.cnblogs.com/kungfupanda/archive/2020/02/25/12362152.html
-Advertisement-
Play Games

https://blog.csdn.net/wyh7280/article/details/83350722 範式通俗理解:1NF、2NF、3NF和BNCF原創hongiii 最後發佈於2018-10-24 21:03:43 閱讀數 14993 收藏展開範式通俗理解:1NF、2NF、3NF和BNCF ...


https://blog.csdn.net/wyh7280/article/details/83350722

 

範式通俗理解:1NF、2NF、3NF和BNCF
原創hongiii 最後發佈於2018-10-24 21:03:43 閱讀數 14993 收藏
展開
範式通俗理解:1NF、2NF、3NF和BNCF
準備知識
超鍵、候選鍵、主鍵
函數依賴
部分依賴
傳遞依賴
範式
1NF
2NF
3NF
BCNF
參考
準備知識
超鍵、候選鍵、主鍵
超鍵
超鍵(super key):在關係中能唯一標識元組的屬性集稱為關係模式的超鍵

候選鍵
候選鍵(candidate key):不含有多餘屬性的超鍵稱為候選鍵。也就是關係中的一個屬性組,其值能唯一標識一個元組。若從屬性組中去掉任何一個屬性,它就不具有這一性質了,這樣的屬性組稱作候選鍵。

主屬性:任何一個候選鍵中的屬性稱作主屬性。(請記住這個概念)

主鍵
主鍵(primary key):用戶從一個關係的多個候選鍵中,選定一個作為主鍵。

結合具體的例子進行解釋,現有學生表如下:
學生(學號,姓名,性別,身份證號)

學號 姓名 性別 身份證號
1 小王 男 344
2 小吳 女 354
3 小麗 女 364
4 小張 男 374
超鍵
由超鍵的定義可知,在學生表中含有學號或者身份證號的任意組合都可以唯一標識一個學生,那麼它們就是此表的超鍵。如:(學號)、(身份證號)、(學號,姓名)、(身份證號,性別)等。

候選鍵
候選鍵屬於超鍵,它是最小的超鍵,就是說如果再去掉候選鍵中的任何一個屬性它就不再是超鍵了。對於(學號、姓名)來說,去掉姓名後仍是一個超鍵,那麼它就不是候選鍵。其中,學生表中的候選鍵為:(學號)、(身份證號),主屬性就是學號、身份證號。

主鍵
主鍵就是候選鍵裡面的一個,用戶可以選擇,那麼在這裡我們選擇(學號)作為學生表的主鍵。

鍵 = 碼,英文key。

函數依賴
這裡先給出數學描述,再進行通俗解釋。

數學描述

通俗理解
函數依賴的英文定義是:
The value of one or a group attributes can decide the value of other
attributes.

很容易理解,也就是一個或者一組屬性的值可以決定其他屬性的值。候選鍵都可以做到。

部分依賴
數學描述

通俗理解
部分依賴是什麼情況呢?
舉個例子,現有一關於學生的關係模式Student(學生編號 , 學生姓名, 班級編號, 院系, 課程編號 , 成績)
學生編號 學生姓名 班級編號 院系 課程編號 成績
S01 楊明 D01 思齊 C01 90
S02 李婉 D01 思齊 C01 87
S01 楊明 D01 思齊 C02 92
S03 劉海 D02 述聖 C01 95
S04 安然 D02 述聖 C02 78
S05 樂天 D03 省身 C01 82
(學生編號#、課程編號#)作為主鍵,可以唯一標識每條元組,但是對於學生姓名、學生所屬的班級編號、院系,這三個屬性可以直接通過學生編號來確定,在這裡課程編號#顯得很多餘。於是稱,學生姓名、班級編號、院系對(學生編號#、課程編號#)部分函數依賴。

即,非主屬性對鍵有部分函數依賴。

主屬性:任何一個候選鍵中的屬性稱作主屬性。
鍵在這裡理解成候選鍵

傳遞依賴
數學描述

通俗理解
繼續以Student表為例,
學生編號 學生姓名 班級編號 院系 課程編號 成績
S01 楊明 D01 思齊 C01 90
S02 李婉 D01 思齊 C01 87
S01 楊明 D01 思齊 C02 92
S03 劉海 D02 述聖 C01 95
S04 安然 D02 述聖 C02 78
S05 樂天 D03 省身 C01 82
學生編號可以唯一確定他所在的院系,但是註意到這中間存在傳遞過程,即學生編號唯一確定該學生所對應的班級編號,班級編號對應唯一的院系。我們稱,院系對學生編號傳遞函數依賴。

即,非主屬性對鍵有部分函數依賴。

主屬性:任何一個候選鍵中的屬性稱作主屬性。

範式
關係資料庫中的模式設計要滿足一定的規範,引入了範式這一概念。
不管做哪種範式的設計,最終要的思想是“one fact in one place”,也就是“一事一地”。

1NF
定義:關係中每一分量不可再分。即不能以集合、序列等作為屬性。(也就是不能表中套表,要保證數據的原子性。)

舉例

學生編號 課程編號
S01 {C1,C2,C3}
S02 {C1,C4}
它就不滿足1NF,因為{C1,C2,C3}和{C1,C4}是集合。

修改為符合1NF:

學生編號 課程編號
S01 C1
S01 C2
S01 C3
S02 C1
S02 C4
2NF
定義:在1NF基礎上,消除非主屬性對鍵的部分依賴,則稱它符合2NF。
根據上面對部分依賴的分析,對於Student表:

學生編號 學生姓名 班級編號 院系 課程編號 成績
S01 楊明 D01 思齊 C01 90
S02 李婉 D01 思齊 C01 87
S01 楊明 D01 思齊 C02 92
S03 劉海 D02 述聖 C01 95
S04 安然 D02 述聖 C02 78
S05 樂天 D03 省身 C01 82
對於學生姓名、學生所屬的班級編號、院系,這三個屬性可以直接通過學生編號來確定,在這裡課程編號#顯得很多餘。也就是,學生姓名、班級編號、院系對(學生編號#、課程編號#)部分函數依賴。把Student表進行拆分,可以消除部分依賴。

其中,學生表Student如下:

學生編號 學生姓名 班級編號 院系
S01 楊明 D01 思齊
S02 李婉 D01 思齊
S01 楊明 D01 思齊
S03 劉海 D02 述聖
S04 安然 D02 述聖
S05 樂天 D03 省身
學生-課程表如下:

學生編號 課程編號 成績
S01 C01 90
S02 C01 87
S01 C02 92
S03 C01 95
S04 C02 78
S05 C01 82
符合2NF。

3NF
定義:在2NF基礎上,消除非主屬性對鍵的傳遞依賴,則稱它符合3NF。

根據上面對傳遞依賴的分析,對於Student表,學生編號可以唯一確定他所在的院系,但是註意到這中間存在傳遞過程,即學生編號唯一確定該學生所對應的班級編號,班級編號對應唯一的院系。我們稱,院系對學生編號傳遞函數依賴。

把Student表繼續進行拆分,可以消除傳遞依賴。

其中,學生表Student如下:

學生編號 學生姓名 班級編號
S01 楊明 D01
S02 李婉 D01
S01 楊明 D01
S03 劉海 D02
S04 安然 D02
S05 樂天 D03
班級-院系表如下:

班級編號 院系
D01 思齊
D02 述聖
D03 省身
符合2NF。

BCNF
我當時在看BCNF的時候,這塊是最懵的地方,網上找的例子五花八門……解釋和過程感覺沒有比較詳細的,最後反正得到了一個結果orz。我本來想把這個範式按照類似的定義來寫的……但是到BNCF發現不能直接寫成“在3NF基礎上,消除主屬性對鍵的部分依賴、傳遞依賴,則稱它符合BCNF。”

因為這樣不太好解釋,故而調整了方案。我認為,理解更重要。

先給個文縐縐的定義


換言之,對於關係模式R,如果每一個函數依賴的決定因素都包含鍵,則R屬於BCNF範式。

現在舉例,現有關係模式:通訊(城市名,街道名,郵政編碼)

函數依賴關係集為:
F={(城市名,街道名)-> 郵政編碼,郵政編碼 -> 城市名}
也就是一個城市名和一個街道名,對應一個郵政編碼;一個郵政編碼對應一個城市名。

此時,候選鍵(城市名,街道名)非主屬性郵政編碼完全依賴於候選鍵,且無傳遞依賴,屬於3NF。

那麼它是否屬於BCNF呢?我們按照下麵的定義來看一下,

換言之,對於關係模式R,如果每一個函數依賴的決定因素都包含鍵,則R屬於BCNF範式。

對於決定因素(城市名,街道名),它包含鍵(城市名,街道名),其實它本身就是鍵了,沒問題;
對於決定因素郵政編碼,它不包含鍵(城市名,街道名)

所以它不屬於BCNF。在關係模式R中,如果每一個決定因素都包含碼,則R屬於BCNF。
————————————————
版權聲明:本文為CSDN博主「hongiii」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wyh7280/article/details/83350722


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

-Advertisement-
Play Games
更多相關文章
  • rpm | 升級軟體包 檢查已安裝包 rpm -qa | grep samba samba-common-3.6.9-164.el6.x86_64 samba-3.6.9-164.el6.x86_64 samba-winbind-clients-3.6.9-164.el6.x86_64 samba- ...
  • 筆者今天升級了VSCode,安裝完後發現Dock(程式塢)沒有VSCode的圖標了,導致切換應用非常不方便。 具體情況就像下麵這張圖,VSCode明明開著,但是在Dock找不到VSCode了。 解決辦法就是在終端執行以下命令就可以了: 其實就相當於重啟Dock。在看VSCode的圖標已經回來了。 原 ...
  • 最近需要開發一些內核模塊,進行探究linux內核的一些特征,現在把一些遇到的比較好的文章和知識點,進行簡要記錄和備忘; 內核模塊開發相關鏈接: https://www.thegeekstuff.com/2013/07/write-linux-kernel-module/ 入門教程;insmod, r ...
  • SRAM 即靜態RAM.它也由晶體管組成,SRAM的高速和靜態特性使它們通常被用來作為Cache存儲器。電腦的主板上都有Cache插座。 下圖所示的是一個SRAM的結構框圖。 由上圖看出SRAM一般由五大部分組成,即存儲單元陣列、地址解碼器(包括行解碼器和列解碼器)、靈敏放火器、控制電路和緩衝/驅 ...
  • 有線等效加密(WEP)標準是802.11無線安全早期的解決方案,WEP並不安全。 既然WEP並不安全,為什麼還要學習WEP呢? 1. WEP簡單,相比後續出現的加密協議,它不要求有多麼強大的計算能力。一些老的設備,特別是缺乏足夠處理能力的手持設備,WEP已經是最佳選擇; 2. 較新的技術,如TKIP ...
  • 1.MySQL版本: mysql> select @@version;+ +| @@version |+ +| 8.0.18 |+ +1 row in set (0.00 sec) 2.Centos操作系統版本 [root@Hadoop-00 /]# cat /etc/redhat-releaseC ...
  • 背景 ​ SQL作為一門標準的、通用的、簡單的DSL,在大數據分析中有著越來越重要的地位;Spark在批處理引擎領域當前也是處於絕對的地位,而Spark2.0中的SparkSQL也支持ANSI SQL 2003標準。因此SparkSQL在大數據分析中的地位不言而喻。 本文將通過分析一條SQL在Spa ...
  • https://blog.csdn.net/sumaliqinghua/article/details/86246762 【通俗易懂】關係模式範式分解教程 3NF與BCNF口訣!小白也能看懂原創置頂 沃茲基.碩德 最後發佈於2019-01-10 18:26:14 閱讀數 13082 收藏展開本來是為 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...