網頁

關聯資料表正規化(Normalization)--鍵,Key

在進入正規化之前,我們還必須先了解關聯式資料庫中一個非常重要的觀念:「鍵,Key」。

Key

  1. Super Keys(超鍵):包含Candidate Key(候選鍵)、Primary Key(主鍵)、Alternate Keys(替代鍵)、Foreign Keys(外來鍵)
  2. Candidate Keys:包含Primary Key(主鍵)、Alternate Keys(替代鍵)
  3. Primary Key與Alternate Keys可能包含Foreign Keys

這些Key有點多,但學起來絕對有好處。

Super Keys,超鍵

Super Keys是關聯表Schema的單一屬性或屬值的集合,但Super Keys需滿足「唯一性」。
唯一性(Uniqueness):在關聯表中絕不會有兩個值組擁有相同的值。

省級  一級      二級      區域  行政區
内蒙古 呼和浩特市   清水河县    华北  自治区
内蒙古 呼伦贝尔市   新巴尔虎右旗  华北  自治区
山西  吕梁市     中阳县     华北  省级
河北  衡水市     武邑县     华北  省级
内蒙古 锡林郭勒盟   锡林浩特市   华北  自治区
河北  衡水市     深州市     华北  省级
河北  石家莊市    行唐县     华北  省级
山西  临汾市     大宁县     华北  省级
河北  邢台市     南和县     华北  省级
内蒙古 乌兰察布市   察哈尔右翼后旗 华北  自治区

以我們的資料表為例,「省級」「區域」「行政區」就不是超鍵,因為他們沒有唯一性。但如果是「省級+一級」「省級+一級+二級」…就成為一個有唯一性的超鍵。

符合的超鍵有:
(省級,一級)
(省級,二級)
(省級,一級,二級)
(一級)
(二級)


一般而言,超鍵是相當多。(以上面的資料而言,一級確實是超鍵,但當你開始Key資料後會發現一級重覆的資料也是非常多。為了範例的講解,這個必須小心注意。)

Candidate Keys,候選鍵

Candidate Keys是一個超鍵,在每一個關聯表至少擁有一個候選鍵,不只要滿足唯一性,還需要滿足最小性。
最小性(Minimality):最小數性數的超鍵。即在超鍵中沒有一個屬性可以刪除,否則將違反性一性。

例如(省級,一級)中,我們將一級去除,(省級)就不是超鍵,所以(省級,一級)就不是候選鍵。(一級)、(二級)這種單一屬性超鍵一定是候選鍵,因為單一屬性同時滿足唯一性及最小性。

候選鍵也能是多個屬性的集合,以上述關聯表,以(一級,二級)的複合鍵為最好,因為兩者都是不重覆性最高。

Primary Key,主鍵

Primary Key是候選鍵的其中一個,而且只能有一個。因為關聯表可能有多個候選鍵,所以在選擇有一些原則:
  1. 不可有空值(Not Null)
  2. 永遠不會改變(Never Change)
    例如我們的身份證字號,就是一個很好例子,在網路技術裡像MAC也是一個不會改變代表性的值。(永遠是形容詞,或許用不易改變比較好,身份證字號是能改變的,MAC就很好,每張NIC都不會改變)
  3. 非識別值(Nonidentifying Value)
    即「值」本身沒有意義。例如買電子產品都會有一個「序號」,假設第一碼代表供應商麼,第二碼代表所在地區(台北、台中…),有一天供應商搬家了,從台北搬到台中,那第二碼就不會符合現況。
  4. 簡短且簡單的值(Brevity and Simplicity)
    資料庫通常會使用主鍵建立索引資料,主鍵越短,能節省空間,更能加快資料查詢。所以儘量選單一屬性候選鍵。
舉列來說,我們有一個員工關聯表(員工編號, 身分證字號, 姓名, 電子郵件),我們可以發現,員工編號與身分證都很合適當主鍵,不過我們應該選擇「員工編號」來當主鍵,因為員工編號在這裡有「代表性」,也就是說雖然身份證字號也可以代表這個人,但這是「員工」關聯表而不是「個人」關聯表,所以以員工編號來當主鍵是比較合適的。

以我們大陸地區關聯表來看,目前是(一級)比較合適。

Alternate Keys,替代鍵

在候選鍵中不是主鍵的其他候選鍵都是替代鍵。
以主鍵範例來看,身分證字號就是替代鍵。我大陸地區關聯表來看,目前的替代鍵是(二級)。

Foreign Keys,外來鍵

關聯表的單一或多個屬性的集合,它的屬性值是參考其他關聯表的主鍵
目前大陸地區關聯表並無外來鍵,我們擴充一下主鍵的範例來說明:

A個人資料表(身份證字號, 姓, 名, 性別, 出生, 連絡電話)
B員工資料表(員工編號, 身份證字號, 抬頭, 部門, 電子郵件, 分機)

B.身份證字號是從A.身份證字號而來,所以在B關聯表的身份證字號稱「外來鍵」。以圖來看是這樣:


另外外來鍵有一些特性:
  • 外來鍵一定參考其他關聯表的主鍵。
  • 外來鍵在關聯表內不一定是主鍵。例如Employee中的PID就不是主鍵。
  • 外來鍵(Employee.PID)與參考的主鍵(Person.PID)屬於相同定義域。即Employee.PID的值應該都包含在Person.PID之中(或子集)。
  • 外來鍵(Employee.PID)與參考的主鍵(Person.PID),如果是單一屬性,那外來鍵就是單一屬性,如果是複合屬性,那外來鍵就是單一屬性。
  • 外來鍵可以參考同一關聯表的主鍵。(這在留言版、討論區之類的程式常看到這樣的設計)

最重要的Key是?

以上最重要的Key是主鍵外來鍵,通常整個關聯表都是由主鍵與外來鍵所來建構而成,所以你要了解每個種Key,才有辦法接下去去設計正規化的關聯表。

5 則留言:

  1. 所以所有superkey都是key的子集嗎?

    回覆刪除
  2. 「唯一性」是super key條件,只要滿足唯一性,即是super key。

    回覆刪除
  3. 不好意思 你的候選鍵 最小性 似乎寫錯了!!

    ---最小性---
    是指除了符合「唯一性」的條件之外,還必須要在該「屬性子集」中移除任一個屬性之後,不再符合唯一性。亦即鍵值欄位個數為最小。
    例如: {縣市+區域}組合成來符合「唯一性」的條件。並且在移除任一個屬性{區域}之後, {縣市}不再符合唯一性。因此, {縣市+區域}就是候選鍵。

    ---最簡性--(irreducibility)
     由多欄位組成的「候選鍵」,其中的任何欄位組合都不能具有唯一性。同樣以上表為例,「身分證字號+姓名」不可以做為候選鍵,因為「身分證字號」本身即具有唯一性了。

    ----->所以說 應該是要 欄位組合中任何組合或單個都要 "不"具唯一性
    而你所說得剛好相反

    "以上述關聯表,以(一級,二級)的複合鍵為最好,因為兩者都是不重覆性最高。"--摘自本文章
    -->應該是(一級,二級)最不好

    感謝~

    回覆刪除
  4. 作者已經移除這則留言。

    回覆刪除
  5. Bruce,您好,
    外來鍵(Employee.PID)與參考的主鍵(Person.PID),如果是單一屬性,那外來鍵就是單一屬性,如果是複合屬性,那外來鍵就是單一屬性。
    最後面那句話是不是有打錯,是否應該為"那外來鍵就是複合屬性"?
    很謝謝你的文章。受益良多。

    回覆刪除

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。