關系模型中有三類完整性約束,分別是:實體完整性,參照完整性,用戶定義完整性
實體完整性
定義:實體完整性是用於保證關系數據庫中每個元組都是可區分的,唯一的。
它的意思就是說數據表中每一行都應該有辦法將其唯一區分開來,這自然指的就是主鍵了,而且主鍵必須不能為空或部分為空。
那么它大可以直接叫一些諸如“要有主鍵”等通俗的名字,但是為何要叫實體完整性呢?
首先第一點,“實體完整性”這個名字聽起來就很高大上,嘿嘿;
好了不開玩笑了,說認真的。
- 一個基本表實際上是對應了現實生活中的一個實體集的,比如學生關系就對應了學生的集合,因此我們所謂的表,其實就相當於現實生活中的某一種實體的集合。
- 而現實生活中的實體都是可以唯一區分的,他們本身就都具有了某種唯一性標識,比如學生的學號,人的身份證等等。
- 所以既然我們的表是相對於實體集的,那么表中必然需要一個主鍵來作為這個實體在被抽象后的唯一標識
- 而主鍵不能為空就更好理解了,主鍵要是為空了那還拿什么來唯一標識這個實體呢?即這樣就會存在不可區分的實體了,那就和我們上面講的矛盾了。
- 因此,這個規則就叫做實體完整性,私下里(不正式啊,只是輔助理解與記憶)可以理解為主鍵完整性。
參照完整性
參照完整性中的參照,說白了就是數據表里的外鍵。
舉個例子,下面有三個關系:
學生(學號,姓名)
課程(課程號,課程名)
選修(學號,課程號,成績)
顯然,在選修關系中的學號,必須是學生表里真正存在的學號,且選修表里的課程號,也必須是課程表里真正存在的課程號。這就是參照完整性的一個典型表現了。
在上面的例子中,選修表中的學號就稱為選修表的一個外碼,它對應的是學生表中的學號。並且稱選修關系為參照關系,而學生關系為被參照關系。
但是僅僅這么說還有很多細節沒有講到,下面我們理一理外碼的定義。
首先要知道,外碼不能是這個關系(參照關系)的主碼,但是是它參照的關系(被參照關系)的主碼。
什么意思呢,就是說學號這個屬性在學生表中是主碼,而在選修表中不是,這就稱學號是選修表中的一個外鍵(課程號同理)。
而且參照關系和被參照關系可以是同一個關系,比如:
學生(學號,姓名,班級,班長)
在上面的關系中,班長屬性保存的是班長的學號,那么這就是自己參照自己了。
即“班長”是外碼,而學號是主碼。
而參照完整性,就是指如果屬性(或屬性組)F是關系R的外碼,且對應了關系S的主碼K(R和S可以是同一個關系),那么對於R中的每個元組中的F上的值,必須滿足:
(1) 要么F取空值
(2) 要么等於S中某個元組的主碼的值
比如上面那個學生的例子,或許那個班級還沒有選出班長,則班長屬性為空。而如果選出了班長,那么班長必然是某一個學生,則他的學號一定是在所有的學號中的某一個。
用戶定義的完整性
任何關系型數據庫,都一定要支持實體完整性和參照完整性。
但同時往往在不同的情況下,我們還需要一些特殊的約束條件,比如性別只能是男或女,年齡不能超過150歲等等。
這種針對某一具體關系數據庫的約束條件稱為用戶定義的完整性,它反映某一具體應用所涉及的數據必須滿足的語意要求。
Additionally
另外,還有一種說法,說關系模型有四種完整性約束,而另外那種完整性約束即為—— 域完整性
域完整性:(Domain Integrity)是指數據庫表中的列必須滿足某種特定的數據類型或約束。其中約束又包括取值范圍、精度等規定
不過我覺得,域完整性其實就是所謂的用戶定義的完整性…