1.什么是碼?
碼是數據系統中的基本概念。所謂碼就是能唯一標識實體(數據庫中的實體:對應現實生活中某樣事物或者人物)的屬性,他是整個實體集的性質,而不是單個實體的性質。它包括超碼,候選碼,主碼。
下面我以學生表為例,給大家分享我對碼的理解,比如有一個學生表:student(id,student_number,name,sex)
,即:ID、學號、姓名、性別,這里的實體是student
,實體的屬性有id
、student_number
、name
、sex
。
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:使用id
和student_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
來作為主碼來用於標識唯一的某一條數據。
感謝您的閱讀!