天天看點

超碼、候選碼和主碼有什麼差別?定義

在關系資料庫理論中經常出現超碼、候選碼、主碼等概念,它們間的關系是怎樣的,有什麼差別?

定義

在資料庫系統概念(原書第6版)中對這幾個概念都有詳細的定義。

超碼(SuperKey)

是指一個或多個屬性的集合,這些屬性的組合可以使我們在一個關系中唯一的辨別一個元組(記錄)。一個關系模式中可以有多個超碼。

其形式化描述: 設R表示關系r模式中的屬性集合。如果說R的一個子集K是r的一個超碼,則限制了關系r中任意兩個不同元組不會在K的所有屬性上取值完全相等。即如果t1和t2在r中,且 t1 不等于 t2,則t1.K 不等于 t2.K。

超碼中可能會存在無關緊要的屬性。

舉例說明

假定關系模式,學生(學号,姓名,身份證号)

從分析可知,學号唯一,是以該屬性為超碼,姓名不唯一,不是超碼

身份證号唯一 是以也是一個超碼

(學号,姓名) 組合取值唯一, 是以屬性組是一個超碼

(身份證号,姓名) 組合取值唯一, 是以屬性組是一個超碼

(學号,身份證号,姓名) 組合取值唯一, 是以屬性組也是一個超碼

從以上分析可以看出,隻要屬性或屬性組的組合取值唯一,就為超碼,很明顯,這種唯一可能不是最小的唯一。

候選碼(candidate key)

不含有多餘屬性的超碼稱為候選碼,一個關系模式中可以有多個候選碼。

從超碼的定義和分析可知,超碼中可能包含無關緊要的屬性。如果K是一個超碼,那麼K的任意超集也是超碼。比如在上文中的(學号,姓名)屬性組,學号本身是超碼,是以在學号上的超集也一定是超碼。在資料管理和維護中我們更多的會關系學号這個超碼對于元組的區分。是以最小的超碼稱為候選碼。

舉例說明

在上述關系模式中,學生(學号,姓名,身份證号),

學号是不包含多餘屬性的超碼,是以該屬性為候選碼。

身份證号也是不包含多餘屬性的超碼,是以該屬性為候選碼。

也就是說該關系中有兩個候選碼:學号、身份證号

主碼(primary key)

在關系資料庫設計中,被設計者選中,用來在一個關系模式中區分不同元組的候選碼。一個關系模式中隻有一個主碼。

關系中的任意兩個不同的元組都不允許同時在主碼屬性上具有相同的值。主碼的指定代表了被模組化事物在現實世界中的限制。

舉例說明

在關系模式中,學生(學号,姓名,身份證号),通過分析學号和身份證号都是候選碼,我們可以選擇其中一個作為主碼。

那到底是選擇學号還是身份證号呢?

這裡選擇學号作為主碼。

在主碼的選擇一般要慎重。一般來說身份證作為敏感資訊不用于作為主屬性。這也是這裡不選擇身份證号的主要原因。另外,主碼選擇時會選擇值從不變化或極少變化的屬性。假若關系中有屬性手機号,當然我們知道每個人的手機号碼也是唯一的,是以從分析可知手機号也是候選碼,但一個人可能會因為各種原因更換手機号,是以候選碼手機号也不且作為主碼。