關係鍵
關係鍵是關係數據庫的重要組成部分。關係鍵是一個表中的一個或幾個屬性,用來標識該表的每一行或與另一個表產生聯繫。
主鍵
編輯主鍵,又稱主碼(英語:primary key或unique key)。數據庫表中對儲存數據對象予以唯一和完整標識的數據列或屬性的鍵。一個數據表只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值(Null)。
從技術的角度來看,primary key和unique key有很多相似之處。但還是有以下區別:
- 作為primary key的域/域組不能為Null。而unique key可以。
- 一個表只能有一個primary key,但可有多個unique key。
- 更大的區別在邏輯設計。primary key一般在邏輯設計中用作記錄標識,這也是設置primary key的本意;而unique key只是為了保證域/域組的唯一性。
超鍵
編輯超鍵(英語:superkey),有的文獻稱「超碼」,是在數據庫關係模式設計中能夠唯一標示多元組(即「行」)的屬性集。
包含所有屬性的集叫做明顯(平凡)超鍵。
候選鍵
編輯在關係模型中,候選鍵或候選碼(英語:candidate key)是某個關係變量的一組屬性所組成的集合,它需要同時滿足下列兩個條件:
滿足第一個條件的屬性集合稱為超鍵,因此我們也可以把候選鍵定義為「最小超鍵」,也就是不含有多餘屬性的超鍵。
候選鍵的重要性是它們能夠在關係中唯一標識出不同的元組,因此超鍵也是在設計數據庫模式時需要指定的最重要的約束之一。由於在關係模型中,每個關係都是一個集合(沒有重複的元素),所以每個關係都至少有一個候選鍵(因為所有屬性組合必然是個超鍵)。但是在某些關係型數據庫中表也能代表多重集,所以在每個關係中都顯式地定義至少一個候選鍵是一條很重要的設計原則。數據庫管理系統通常都需要將每個關係中的某個候選鍵定義為主鍵,亦即這個候選鍵是區分不同元組時首選的識別方式,例如外鍵通常就是引用主鍵而非其他候選鍵。
外鍵
編輯外來鍵(英語:foreign key,中國大陸譯外鍵,又稱外部鍵)。其實在關聯式資料庫中,每個資料表都是由關聯來連繫彼此的關係,父資料表(Parent Entity)的主鍵(primary key)會放在另一個資料表,當做屬性以建立彼此的關聯,而這個屬性就是外來鍵。
比如,學生跟老師之間是教學的關聯,學生資料表會有個屬性叫指導老師(FK),而這個值就是對應到老師資料表的老師代號(PK),學生的指導老師就是外來鍵。
代理鍵
編輯在關係型數據庫設計中,代理鍵(英語:surrogate key)是在當資料表中的候選鍵都不適合當主鍵時,例如資料太長,或是意義層面太多,就會請一個無意義的但唯一的字段來代為作主鍵。
代理鍵是:
- Surrogate (1) – Hall, Owlett and Codd (1976)
- 一個代理鍵值確定了外部世界的一個實體。代理鍵值是數據庫生成的,從來不顯示給用戶或應用程序看。
- Surrogate (2) – Wieringa and De Jonge (1991)
- 一個代理鍵值確定了數據庫中的一個對象。代理鍵值是數據庫生成的,用戶或應用程序看不到它。
在實踐中,代理鍵值通常是個自動遞增的數字。在Sybase或SQL Server,用identity column標識代理鍵,PostgreSQL用serial,Oracle用SEQUENCE,在MySQL用標記有AUTO_INCREMENT的字段。
何時使用代理鍵
編輯以中華人民共和國的十八位身份證號為例,從左往右為六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。
一家公司想要將它的客戶記入數據庫,以客戶的身份證號作為主鍵當然是可以的;但是這18位身份證號是用於標識大陸13多億人口的,一家公司的客戶顯然沒有這麼多,所以用18位的數字作為主鍵有點浪費空間。
另外,身份證號中包含了地區、生日信息,若以身份證號為主鍵,要不要另開字段記錄客戶的地區、生日也是個問題。如果不另開字段,從主鍵(身份證號)中提取地區、生日有點麻煩;如果開字段,主鍵和地區、生日字段的數據存在冗餘。
所以,一般的做法是,根本不記錄客戶的身份證號(除非有其他需求),用一個代理鍵作為主鍵,另開字段記錄客戶的地區、生日等信息。
自然鍵
編輯自然鍵(英語:natural key)與代理鍵相反,是在自然(真實)生活中唯一確定一個事物的標識。身份證號(理論上,假設沒有因技術原因造成的重複)就是一個自然鍵,用於確定一個人。