超碼、主碼、候選碼的概念與區分


1.什么是碼?

碼是數據系統中的基本概念。所謂碼就是能唯一標識實體(數據庫中的實體:對應現實生活中某樣事物或者人物)的屬性,他是整個實體集的性質,而不是單個實體的性質。它包括超碼,候選碼,主碼。

下面我以學生表為例,給大家分享我對碼的理解,比如有一個學生表:student(id,student_number,name,sex),即:ID、學號、姓名、性別,這里的實體是student,實體的屬性有idstudent_numbernamesex

2.超碼

超碼也叫做“超級碼”,是一個或多個屬性的集合,這些屬性可以讓我們在一個實體集(所謂的實體集就是student表中多條記錄的集合)中唯一地標識一個實體。如果K是一個超碼,那么K的任意超集也是超碼,也就是說如果K是超碼,那么所有包含K的集合也是超碼。

所謂超集是集合論的術語,A ⊇ B,則 A 集是 B 的超集,也就是說 B 的所有元素 A 里都有,但 A 里的元素 B 就未必有

2.1例子:
因為通過id可以找到唯一一個學生,所以{id}是一個超碼,同理{id,student_number}{id,student_number,name}{id,student_number,name,sex}{student_number}{student_number,name}{student_number,name,sex}也是超碼.

3.候選碼

超碼包括候選碼,雖然超碼可以唯一標識一個實體,但是可能大多數超碼中含有多余的屬性,所以我們需要候選碼。若關系中的一個屬性或屬性組的值能夠唯一地標識一個元組,且它的真子集不能唯一的標識一個元組,則稱這個屬性或屬性組做候選碼。

子集比真子集范圍大,子集是包括本身的元素的集合,真子集是除本身的元素的集合

3.1例子:
在上例中,只有{id}或者{student_number}是候選碼。如果sex和name可以唯一標識一個學生,則{name,sex}也為候選碼,但是,sex和name並不能唯一標識一個學生,這與現實生活是違反的,因為現實有同名同姓的人,則{name,sex}不能作為候選碼。

4.主碼

一個表的候選碼可能有多個,從這些個候選碼中選擇一個做為主碼,至於選擇哪一個候選碼,這個是無所謂的,只要是從候選碼中選的就行。

5.總結

所有碼都是一個集合。所有可以用來在實體集中標識唯一一個實體的集合,都是超碼。如果任意超碼的真子集不能包括超碼(換句話說就是:它的真子集不能唯一的標識一個元組),則稱其為候選碼。被數據庫設計者選中的,用來在同一實體集中區分不同實體的候選碼就是主碼,可以是一個屬性或者多個屬性的集合。

簡單的說,超碼包括候選碼,候選碼包括主碼。

例子1:使用id屬性作為主碼,MySQL表定義代碼如下:

create table student
(
	id int primary key,
	student_number varchar(10),
	name varchar(10),
	sex varchar(4)
)

例子2:使用idstudent_number屬性集合作為主碼,MySQL表定義代碼如下:

create table student
(
	id int,
	student_number varchar(10),
	name varchar(10),
	sex varchar(4),
	constraint student_primary primary key(id,student_number)
)

當然,在現實開發中,我更喜歡使用一個屬性來作為主碼。比如我管理的網站 “極客開發者”(jkdev.cn),網站的各種數據集合,大多是用一個 id 來作為主碼來用於標識唯一的某一條數據。

感謝您的閱讀!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM