關係鍵
關係鍵是關聯式資料庫的重要組成部分。關係鍵是一個表中的一個或幾個屬性,用來標識該表的每一行或與另一個表產生聯絡。
主鍵
編輯主鍵,又稱主碼(英語: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)與代理鍵相反,是在自然(真實)生活中唯一確定一個事物的標識。身分證號(理論上,假設沒有因技術原因造成的重複)就是一個自然鍵,用於確定一個人。