正規化是資料表設計的基本原則。
目前關係型資料庫一共有六種正規化,從低到高分別是:1nf(第一正規化)、2nf(第二正規化)、3nf(第三正規化)、bcnf(巴斯-科德正規化)、4nf(第四正規化)和5nf(第五正規化,也稱完美正規化)。
一般來講,資料表的設計應該滿足3nf。但也並非絕對,所以有時還需要破壞正規化規則,也就是反規範化。
正規化的定義會使用到主鍵和候選鍵(因為主鍵和候選鍵可以唯一標識元組),資料庫中的鍵(key)由乙個或者多個屬性組成。我總結了下資料表中常用的幾種鍵和屬性的定義:
超鍵:能唯一標識元組的屬性集叫做超鍵。
候選鍵:如果超鍵不包括多餘的屬性,那麼這個超鍵就是候選鍵。
主鍵:使用者可以從候選鍵中選擇乙個作為主鍵。
外來鍵:如果資料表 r1 中的某屬性集不是 r1 的主鍵,而是另乙個資料表 r2 的主鍵,那麼這個屬性集就是資料表 r1 的外來鍵。
主屬性:包含在任一候選鍵中的屬性稱為主屬性。
非主屬性:與主屬性相對,指的是不包含在任何乙個候選鍵中的屬性。
我們以 nba 的球員表(player)和球隊表(team)為例。這裡我可以把球員表定義為包含球員編號、姓名、身份證號、年齡和球隊編號;球隊表包含球隊編號、主教練和球隊所在地。
對於球員表來說,超鍵就是包括球員編號或者身份證號的任意組合,比如(球員編號)(球員編號,姓名)(身份證號,年齡)等。
候選鍵就是最小的超鍵,對於球員表來說,候選鍵就是(球員編號)或者(身份證號)。
主鍵是我們自己選定,也就是從候選鍵中選擇乙個,比如(球員編號)。
外來鍵就是球員表中的球隊編號。
在 player 表中,主屬性是(球員編號)(身份證號),其他的屬性(姓名)(年齡)(球隊編號)都是非主屬性。
1nf 指的是資料庫表中的任何屬性都是原子性的,不可再分。這很好理解,我們在設計某個欄位的時候,對於字段 x 來說,就不能把字段 x 拆分成字段 x-1 和字段 x-2。事實上,任何的 dbms 都會滿足第一正規化的要求,不會將字段進行拆分。
2nf 指的資料表裡的非主屬性都要和這個資料表的候選鍵有完全依賴關係。所謂完全依賴不同於部分依賴,也就是不能僅依賴候選鍵的一部分屬性,而必須依賴全部屬性。
3nf 在滿足 2nf 的同時,對任何非主屬性都不傳遞依賴於候選鍵。也就是說不能存在非主屬性 a 依賴於非主屬性 b,非主屬性 b 依賴於候選鍵的情況。
總結為一句話,那就是
資料表三大設計正規化
第一正規化 inf資料表中所有欄位都是不可分割的原子值 create table student2 id int primary key,name varchar 20 address varchar 30 insert into student2 values 1,li 四川省成都市武侯大道100...
MySQL資料表設計,三大正規化
個人筆記,僅供參考 三大正規化即三個建立資料表的準則,根據自己的實際需求決定是否遵守即可 資料表中的所有欄位都是不可分割的原子值 例如乙個位址資訊,如果全部存在乙個欄位中就不符合第一正規化,需要把國家,省份這些資訊盡可能拆分到不同欄位才滿足。這樣可以方便以後檢索。舉例 create table st...
(Mysql 八)資料表設計的三大正規化
目錄 基礎知識 一 第一正規化 每一列都是不可分割的原子資料項 存在問題 二 第二正規化 在第一正規化的基礎上,非碼屬性必須完全依賴於碼 三 第三正規化 在第二正規化的基礎上,消除傳遞依賴 四 表與表之間的對應關係 1.多對一 2.多對多 設計資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,...