1. 程式人生 > >資料庫一二三BC正規化詳解

資料庫一二三BC正規化詳解

1.正規化說明

1.1 第一正規化(1NF)無重複的列

  所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能同時有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實體由重複的屬性構成,新實體與原實體之間為一對多關係。在第一正規化(1NF)中表的每一行只包含一個例項的資訊。簡而言之,第一正規化就是無重複的列。

  在任何一個關係資料庫中,第一正規化(1NF)是對關係模式的基本要求,不滿足第一正規化(1NF)的資料庫就不是關係資料庫。在當前的任何關係資料庫管理系統(DBMS)中,不可能做出不符合第一正規化的資料庫,因為這些DBMS不允許你把資料庫表的一列再分成二列或多列。因此,你想在現有的DBMS中設計出不符合第一正規化的資料庫都是不可能的。

舉例1:

一張學生表Student(stuNo,stuName,age,age,sex)是不符合第一正規化的,因為有重複列age屬性。去除重複列age以後的Student(stuNo,stuName,age,sex)是符合第一正規化的。

1.2 第二正規化(2NF)屬性完全依賴於主鍵 [ 消除部分子函式依賴 ]

  第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項或行必須可以被唯一地區分。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識。例如員工資訊表中加上了員工編號(emp_id)列,因為每個員工的員工編號是唯一的,因此每個員工可以被唯一區分。這個唯一屬性列被稱為主關鍵字或主鍵、主碼。

  第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識。簡而言之,第二正規化就是屬性完全依賴於主鍵。

  這裡說的主關鍵字可能不只有一個,有些情況下是存在聯合主鍵的,就是主鍵有多個屬性。

舉例2:

以學生選課為例,每個學生都可以選課,並且有這一門課程的成績,那麼如果將這些資訊都放在一張表StuGrade(stuNo,stuName,age,sex,courseNo,courseName,credit,score)。如果不仔細看,我們會以為這張表的主鍵是stuNo,但是當我們看到最後一個score屬性以後,在想想如果沒有課程資訊,那麼哪裡有學生成績資訊呢。所以這張表的主鍵是一個聯合主鍵(stuNo,corseNo)

,這個聯合屬效能夠唯一確定score屬性。那麼再看其他資訊,比如stuName只需要stuNo就能夠唯一確定,courseName只需要courseNo就能夠唯一確定,因此這樣就存在了部分依賴,不符合第二正規化。如果要讓學生課程成績資訊滿足第二正規化,那麼久需要將這張表拆分成多張表,一張學生表Studnet(stuNo,stuName,age,sex),一張課程表Course(courseNo,courseName,credit),還有最後一張學生課程成績表StuGrade(stuNo,courseNo,score)。這樣就符合第二正規化了。

1.3 第三正規化(3NF)屬性不依賴於其它非主屬性 [ 消除傳遞依賴 ]

  滿足第三正規化(3NF)必須先滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊

舉例3:

  每一個員工都有一個所屬部門,假如有一個員工資訊表Employee(emp_id,emp_name,emp_age,dept_id,dept_name,dept_info)。這張員工資訊表的屬性是emp_id,因為這個屬效能夠唯一確定其他所有屬性,比如知道員工編號emp_id以後,肯定能夠知道員工姓名,所屬部門編號,部門名稱和部門介紹。所以這裡dept_id不是主屬性,而是非主屬性。但是,我們又可以發現dept_name,dept_info這兩個屬性也可以由dept_id這個非主屬性決定,即dept_name依賴dept_id,而dept_id依賴emp_id,這樣就存在了傳遞依賴。而且我們可以看出傳遞依賴的一個明顯缺點就是資料冗餘非常嚴重。

  那麼如何解決傳遞依賴問題,其實非常簡單,我們只需要將dept_name,dept_info這連個屬性刪除就可以了,即Employee(emp_id,emp_name,emp_age,dept_id),然後再建立一個部門表Dept(dept_id,dept_name,dept_info)。這樣如果要搜尋某一個員工的部門資訊dept_info,可以通過資料庫連線來實現,查詢語句如下:

select e.emp_id,e.emp_name,d.dept_name from Employee e,Dept d where e.dept_id=d.dept_id

BC正規化

  設關係模式R<U,F>∈1NF,如果對於R的每個函式依賴X→Y,若Y不屬於X,則X必含有候選碼,那麼R∈BCNF。   解釋一下:對於關係模式R,若 R中的所有非平凡的、完全的函式依賴的決定因素是碼,則R屬於BCNF。   若R∈BCNF   每一個決定屬性集(因素)都包含(候選)碼   R中的所有屬性(主,非主屬性)都完全函式依賴於碼   R∈3NF(證明)   若R∈3NF 則 R不一定∈BCNF   在關係模式STJ(S,T,J)中,S表示學生,T表示教師,J表示課程。   每一教師只教一門課。每門課由一名教師教,某一學生選定某門課,就確定了一個固定的教師。某個學生選修某個教師的課就確定了所選課的名稱 : (S,J)→T,(S,T)→J,T→J   由關係模式的定義可以得到如下結論,若R屬於BCNF,則R有:   1.所有非主屬性對每一個碼都是完全函式依賴。   2.所有的主屬性對每一個不包含它的碼,也是完全函式依賴。   3.沒有任何屬性完全函式依賴於非碼的任何一組屬性。   由於R∈BCNF,按定義排除了任何屬性對碼的傳遞依賴與部分依賴,所以R∈3NF。但是若R∈3NF,則R未必屬於BCNF。
1.第一正規化:資料庫的欄位是單一屬性,不可再分。
 解釋:
  • 不能是複合屬性,如果存在,應該拆分為多個屬性
  • 不能是多值屬性,如果存在,應該建立一個實體,而讓此屬性與其存在1對多的關係)
  • 不能是重複屬性
2.第二正規化:任何非關鍵欄位不能部分依賴任一侯選關鍵字(即必須完全依賴)
 解釋:
  • 表中必須存在侯選關鍵字,即每一行不同於其他任一行,是惟一區分的
  • 任何非關鍵欄位不能依賴於侯選關鍵字的一部分
3.第三正規化:任何非關鍵欄位不能傳遞依賴任一侯選關鍵字
 解釋:
  • 非關鍵字欄位必須直接依賴任一侯選關鍵字
  • 非關鍵欄位C不能依賴非侯選關鍵字B,因為樣會形成傳遞依賴:侯選關鍵字A=>B=>C,因為這時的B往往是外來鍵,即其他表的主鍵,也就是說表中不能含有其他表的非主屬性
4.BC正規化:任何欄位都不能傳遞依賴任一侯選關鍵字
解釋:
  • 與第三正規化相比,一個是“任何非關鍵欄位不能”,一個是“任何欄位不能”,顯然更嚴格了
  • 侯選關鍵字或其部分欄位不能傳遞依賴其他的侯選關關鍵字
註釋:
侯選關鍵字:又叫侯選碼,惟一標識一行資料,其真子集不能是侯選關鍵字,一個表可以存在多個侯選關鍵字,如使用者表的username,userid
主關鍵字:又叫主鍵,主碼,被選中的用來區分其它行的侯選關鍵字,一個表只有一個主關鍵字
部分依賴:(A,B)->C,D,如A->C,則C部分依賴A
傳遞依賴:A->B->C,則C傳遞依賴A

注意點:

  1. 資料庫連線會帶來一部分的效能損失
  2. 並不是資料庫正規化越高越好
  3. 有時會在資料冗餘與正規化之間做出權衡,在實際的資料庫開發過程中,往往會允許一部分的資料冗餘來減少資料庫連線。

相關推薦

資料庫一二BC正規化

1.正規化說明 1.1 第一正規化(1NF)無重複的列   所謂第一正規化(1NF)是指資料庫表的每一列都是不可分割的基本資料項,同一列中不能同時有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。如果出現重複的屬性,就可能需要定義一個新的實體,新的實

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

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

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

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

資料庫三大正規化(通俗易懂)

◆ 第一正規化(1NF):     強調的是列的原子性,即列不能夠再分成其他幾列。考慮這樣一個表:【聯絡人】(姓名,性別,電話)如果在實際場景中,一個聯絡人有家庭電話和公司電話,那麼這種表結構設計就沒有達到 1NF。要符合 1NF 我們只需把列(電話)拆分,即:【聯絡人】(

資料庫三大正規化

正規化:英文名稱是 Normal Form,它是英國人 E.F.Codd(關係資料庫的老祖宗)在上個世紀70年代提出關係資料庫模型後總結出來的,正規化是關係資料庫理論的基礎,也是我們在設計資料庫結構過程中所要遵循的規則和指導方法。目前有跡可尋的共有8種正規化,依次是:1NF,

資料庫正規化】1NF-BCNF

關係型資料庫,由於資料分別儲存在不同的表中,因此設計不當就會造成嚴重的資料冗餘。 而如果表的粒度設計得太小,又會放大關係型資料庫讀寫很慢的缺點,表的連線操作會帶來很大的開銷。 因此在設計庫表時,有1NF、2NF、3NF、BCNF、4NF、5NF這些正規化,從前到後要求依次提

Struts2學習第課 Struts2

request end apach -1 sso struts2 input div available 接著上次的課程 這次我們看struts.xml 修改如下:這裏是加上命名空間,默認的是不加,我們手動加上時就要在訪問時加上命名空間。 <?xml version

TCP次握手及釋放連接過程

alt 信息 情況 序列號 丟失 浪費 需要 nbsp image TCP在傳輸之前會進行三次溝通,一般稱為“三次握手”,傳完數據斷開的時候要進行四次溝通,一般稱為“四次揮手”。 兩個序號和三個標誌位: (1)序號:seq 序號,占 32 位,用來標識從 TCP

new和delete的種形式

分別是 額外 ID 調用 pre else class code alloc 一、new操作符、delete操作符 class String { public: String(const char *str="") { if

elasticsearch系列:索引(分詞器、文檔管理、路由

ces com dex 合並 pda ams 最新 case dbi 一、分詞器 1. 認識分詞器 1.1 Analyzer 分析器 在ES中一個Analyzer 由下面三種組件組合而成: character filter :字符過濾器,對文本進行字符過濾處理,

關係型資料庫全表掃描分片

導讀:資料匯流排(DBus)專注於資料的實時採集與實時分發,可以對IT系統在業務流程中產生的資料進行匯聚,經過轉換處理後成為統一JSON的資料格式(UMS),提供給不同資料使用方訂閱和消費,充當數倉平臺、大資料分析平臺、實時報表和實時營銷等業務的資料來源。在上一篇關於DBus的文章中,我們主要介紹了在DBus

mysql乾貨——資料庫字符集和校對規則

一、什麼是字符集 字元是多個文字和符號的總稱,包括各個國家的文字、標點符號、圖形符號、數字等。字符集多個字元的集合。 字元集合種類較多,每個字符集包含的字元的個數不同。對於字符集不支援的字元,則以亂碼顯示。 常見的字符集有ASCII字符集、GBK字符集、GB2312字符集、GB18030字

Mysql:Java程式碼實現資料庫定時備份與還原

一、目的 使用java程式碼實現定時執行Mysql備份與還原。 二、思路 先寫好一個定時器,每隔多少時間執行一次備份 備份方法為,通過java向命令列寫入命令執行 首先在cmd中模擬備份,測試成功後 使用java程式碼實現資料備份功能

thinking in java (十三) ----- String

String介紹 String是java中的字串,繼承於CharSequence。 String類包含的API介面非常多,我們對其進行了分類,並且都給出了演示程式。 String個CharSequence關係 String繼承於CharSequence,也就是

Java 爬蟲實戰案例之 HttpClient

Java 爬蟲實戰案例三之 HttpClient 詳解 1. 程式碼 package httpClient; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHt

資料庫實體轉換的過程

如何應用反射設定實體的值 首先需要建立實體的例項 public class ConfigEntity { public string ConnectionStr { get; set; } public string Name{ get;

java程式設計思想讀書筆記(HashMap

Map Map介面規定了一系列的操作,作為一個總規範它所定義的方法也是最基礎,最通用的。 AbstractMap AbstractMap是HashMap、TreeMap,、ConcurrentHashMap 等類的父類。當我們巨集觀去理解Map時會發現,其實Map就是一

SQL Server中通用資料庫角色許可權的處理

SQL Server中通用資料庫角色許可權的處理詳解 前言 安全性是所有資料庫管理系統的一個重要特徵。理解安全性問題是理解資料庫管理系統安全性機制的前提。 最近和同事在做資料庫許可權清理的事情,主要是刪除一些賬號;取消一些賬號的較大的許可權等,例如,有一些有db_owner許可權,我們取消賬號的資料庫角

排列硬幣 arrange coins 種解法

* 排列硬幣 * https://leetcode-cn.com/problems/arranging-coins/description/ * 你總共有 n 枚硬幣,你需要將它們擺成一個階梯形狀,第

深入淺出Mybatis原始碼系列()---配置之properties與environments(mybatis原始碼篇)

上篇文章《深入淺出Mybatis原始碼系列(二)---配置簡介(mybatis原始碼篇)》我們通過對mybatis原始碼的簡單分析,可看出,在mybatis配置檔案中,在configuration根節點下面,可配置properties、typeAliases、plugins、