數(shù)據(jù)庫原理與應(yīng)用(2)數(shù)據(jù)模型、關(guān)系模式、實體間聯(lián)系、E-R圖、主鍵、外鍵、約束
【概念】
實體:實體是客觀存在且具有公共性質(zhì)的可相互區(qū)別的現(xiàn)實世界對象的集合,像是學(xué)生、商品、學(xué)位、職稱、選課等。
實例:實體中每個具體的記錄都叫做示例,像是一頭牛、一匹馬等。

屬性:實體具有的某一特征或性質(zhì),像是性別、年齡等。屬性是區(qū)分不同實體的依據(jù)。
型:對實體中數(shù)據(jù)結(jié)構(gòu)和屬性的說明,比如說學(xué)生實體具有由學(xué)號、姓名、性別、出生日期等屬性構(gòu)成的記錄型。
值:具體的一條示例所有屬性集合(1534677781343,李明,男,2001.1.3)就是學(xué)生李明數(shù)據(jù)記錄的值。


鍵:唯一標(biāo)識實體的屬性集,也叫做碼或關(guān)鍵字。例如,學(xué)號是學(xué)生實體的鍵,對于實例:1534677781343,李明,男,2001.1.3,通過學(xué)號1534677781343唯一指定李明。
候選碼:關(guān)系中的一個屬性可以唯一標(biāo)識一個數(shù)據(jù)記錄,像是我們可以通過學(xué)號1534677781343唯一指定李明,那么學(xué)號就可以作為候選碼;而我們不可以通過性別男來唯一指定李明,因為男生不止他一個,所以性別就不可以作為候選碼。一個關(guān)系中候選碼可以有多個,候選碼不可以為空,也沒有多余屬性。
一個關(guān)系模式中可以有多個候選碼。
主鍵:分為單字段主鍵和組合主鍵。其中組合主鍵可由表中多個字段(屬性)組合而成。在這里僅介紹單字段主鍵,也叫做主碼或主關(guān)鍵字。它是某個能夠唯一標(biāo)識一條記錄的屬性,是從候選碼中人為挑選的一個。
一個關(guān)系模式中只有一個主鍵。主鍵不能為空值。
主鍵的功能主要體現(xiàn)在唯一(UNIQUE)和非空(NOT NULL)功能上,定義為主鍵即默認(rèn)唯一且非空。
主鍵的刪除只是刪除了指定的主鍵約束,并不能夠刪除字段。
關(guān)系表中不允許存在無主碼、主碼值相同的記錄。
外鍵:子數(shù)據(jù)表中出現(xiàn)的父數(shù)據(jù)表的主鍵,稱為子數(shù)據(jù)表的外鍵。外鍵要么與父表主碼的值相同,要么取空值。
子數(shù)據(jù)表中出現(xiàn)的父數(shù)據(jù)表的主鍵與父數(shù)據(jù)表原有主鍵的字段名可以不同,只要定義在相同的域即可。
創(chuàng)建外鍵時,設(shè)置的字段和關(guān)聯(lián)的字段必須具有相同的數(shù)據(jù)類型。
外鍵約束中,主表和從表(也可以叫父表和子表)可以是1張表,也可以是2張表。
在這里舉一個例子。
【例1】borrow表(子表)的讀者編號(rID)需要出現(xiàn)reader表(父表)的reader_ID主鍵作為它的外鍵,從而為borrow表添加參照完整性約束。
1.建表代碼:
2. 在borrow表中添加外鍵。

外鍵名:可以不填, 系統(tǒng)自動生成,也可以自己寫一個上去。
字段:子表中設(shè)置為外鍵的字段,也就是要在子表中出現(xiàn)的父表的主鍵。
被引用的模式:兩張表所在的數(shù)據(jù)庫名。
被引用的表(父):父表名。
被引用的字段:父表中要出現(xiàn)在子表中的主鍵名。
刪除時/更新時:設(shè)置為CASCADE,也就是關(guān)聯(lián)的表更新后,此表同步更新。
*提示:如果rID不允許為空則當(dāng),選擇刪除時SET NULL就會出現(xiàn)Cannot add foreign key constraint的提示,這是因為刪除置空有條件,必須滿足字段允許為空。
3.兩張表外觀。


4. 外鍵約束
district:嚴(yán)格模式(默認(rèn)),父表不能刪除或更新一個已經(jīng)被子表數(shù)據(jù)引用的記錄;
cascade:級聯(lián)模式,父表的操作,對應(yīng)子表關(guān)聯(lián)的數(shù)據(jù)也跟著被刪除;
set null:置空模式,父表的操作之后,子表對應(yīng)的數(shù)據(jù)(外鍵字段)被置空。

域:屬性的取值范圍。例如性別的域為(男,女),手機號域為11位整數(shù)。
實體型:用實體名和屬性名集合來抽象和刻畫同類實體,例如學(xué)生(學(xué)號、姓名、性別、出生日期)就是一個實體型。
實體集:同類實體的集合。例如全體學(xué)生就是學(xué)生實體的一個實體集。

實體間的聯(lián)系:
一對一聯(lián)系(1:1):例如班級和班長之間就是一對一聯(lián)系,一個班級只有一個班長。
一對多聯(lián)系(1:n):例如一個班級有一個輔導(dǎo)員,但擔(dān)任輔導(dǎo)員的老師可以同時擔(dān)任其他班級的輔導(dǎo)員,所以輔導(dǎo)員和班級之間就是一對多聯(lián)系。
多對多聯(lián)系(m:n):例如一個學(xué)生可以學(xué)習(xí)多門課程,每門課程也可以有多個學(xué)生,那么學(xué)生和課程之間的關(guān)系就是多對多聯(lián)系。
【例2】某校學(xué)生、教師和課程實體對應(yīng)的關(guān)系模式如下:學(xué)生(學(xué)號,姓名,性別,年齡,家庭住址,電話)課程(課程號,課程名)教師(職工號,姓名,年齡,家庭住址,電話)如果一個學(xué)生可以選修多門課程,一個課程可以多個學(xué)生選修;一個教師只能講授一門課程,但是一門課程可以由多個教師講授。則學(xué)生和課程之間是一個的關(guān)系模式。
A.?不需要增加一個新的關(guān)系模式,不需做其他改變
B.?不需要增加一個新的關(guān)系模式,只需要將1端的碼插入到多端
C.?需要增加一個新的選課關(guān)系模式,該模式的主鍵為課程號
D.?需要增加一個新的選課關(guān)系模式,該模式的主鍵為課程號和學(xué)號
在這里,每個學(xué)生和課程是一對多關(guān)系,課程和教師是多對多關(guān)系。那么問題中學(xué)生和課程的表述就應(yīng)該理解為一個學(xué)生選擇課程,那學(xué)生就是1端,課程就是多端,如果把1端的碼插入到多端的話,插過去的碼(學(xué)號、姓名、性別)沒有對應(yīng)的值,這時候就需要增加一個新的選課關(guān)系模式,用兩個主鍵對兩端中包含的元組進(jìn)行標(biāo)識,主鍵需要可以做到唯一標(biāo)識一條數(shù)據(jù)記錄,那就選擇課程號和學(xué)號作為主鍵。
【例3】某醫(yī)院數(shù)據(jù)庫的部分關(guān)系模式為:科室(科室號,科室名,負(fù)責(zé)人,電話)、病患(病歷號、姓名、住址、聯(lián)系電話)和醫(yī)生(職工號、醫(yī)生姓名、科室號、住址,聯(lián)系電話)。假設(shè)每個科室有一名負(fù)責(zé)人和一部電話,每個科室有若干醫(yī)生,一名醫(yī)生只能屬于一個科室;一個醫(yī)生可以為多個病患看病;一個病患可以由多個醫(yī)生診治。則就診關(guān)系的主鍵是_________。
?這里如果想實現(xiàn)唯一標(biāo)識一條數(shù)據(jù)記錄的話就需要選擇病歷號、職工號、就診時間作為主鍵。因為一個病患可以在不同時間來多次就診,可能是不同的醫(yī)生為他進(jìn)行診治,一個醫(yī)生一天也可以為很多病患進(jìn)行診治,為了排除這些不確定性,我們就需要三個屬性作為主鍵。

【E-R圖】
實體用矩形表示,屬性用橢圓形表示,聯(lián)系用菱形表示。
過程:確定實體集、確定聯(lián)系和聯(lián)系類型、設(shè)計局部及整體的E-R圖、確定屬性、優(yōu)化E-R圖。

E-R圖可將現(xiàn)實世界的信息抽象地表示為實體及實體間的聯(lián)系。
E-R用于描述數(shù)據(jù)庫的概念模型。

【關(guān)系的完整性】
實體完整性:關(guān)系的主碼不能重復(fù)也不能取空值。實體完整性通過主鍵實現(xiàn)。
參照完整性:參照完整性是定義主碼和外碼間的引用規(guī)則。
外碼要么與父表主碼的值相同,要么取空值。參照完整性通過外鍵實現(xiàn)。
用戶定義完整性:用戶自定義的約束條件。
非空約束、唯一約束、默認(rèn)約束、自增約束、檢查約束均屬于用戶自定義完整性約束。
關(guān)系的完整性約束僅包括實體完整性、參照完整性、用戶定義完整性。
默認(rèn)約束:DEFAULT約束。每個字段只能定義一個默認(rèn)約束,不能在設(shè)置為自動編號的屬性的字段上創(chuàng)建默認(rèn)約束,默認(rèn)約束可以為空值。
默認(rèn)值約束字段,其默認(rèn)值可以由用戶自定義。
唯一約束:UNIQUE約束是列約束或表約束,它定義了將列或列組中的值約束為唯一的規(guī)則。定義了該約束的字段,所有記錄都不能是重復(fù)的。
非空約束:指字段的值不能為空。 對于使用了非空約束的字段,如果用戶在添加數(shù)據(jù)時沒有指定值,數(shù)據(jù)庫系統(tǒng)就會報錯。
非空約束限制是指該字段中的內(nèi)容不能為空,但可以是空白字符串(NULL)或0。
沒有設(shè)置非空的唯一性約束字段,可以有零個或者多個NULL數(shù)據(jù)。
自增約束:當(dāng)主鍵定義為自增長后,這個主鍵的值就不再需要用戶輸入數(shù)據(jù)了,而由數(shù)據(jù)庫系統(tǒng)根據(jù)定義自動賦值。每增加一條記錄,主鍵會自動以相同的步長進(jìn)行增長。
默認(rèn)情況下,AUTO_INCREMENT 的初始值是 1,每新增一條記錄,字段值自動加 1。
一個表中只能有一個字段定義自增約束。
定義自增約束的字段的數(shù)據(jù)類型必須是整數(shù)類型,像TINYINT、SMALLINT、INT、BIGINT之類。
定義自增約束的字段必須具有NOT NULL屬性。
自增約束的最大值受數(shù)據(jù)類型限制,達(dá)到上限后自增約束失效。
有外鍵約束的字段不可添加自增約束。
檢查約束:檢查約束(CHECK)是用來檢查數(shù)據(jù)表中字段值有效性的一種手段,可以通過 CREATE TABLE 或 ALTER TABLE 語句實現(xiàn)。設(shè)置檢查約束時要根據(jù)實際情況進(jìn)行設(shè)置,這樣能夠減少無效數(shù)據(jù)的輸入。
完整性檢查和控制的防范對象是非法用戶、非法操作和符合語義的數(shù)據(jù)。

【關(guān)系模式、數(shù)據(jù)模型】
關(guān)系模式分為外模式(用戶數(shù)據(jù)庫)、模式(概念模式或邏輯模式,用于描述一個數(shù)據(jù)庫的整體邏輯結(jié)構(gòu)和特征)和內(nèi)模式(描述數(shù)據(jù)在存儲介質(zhì)上的存儲方式和物理結(jié)構(gòu))。
關(guān)系模式是對關(guān)系結(jié)構(gòu)的表示。模式的表示方式通常形式是:關(guān)系名(屬性1,屬性2,....,屬性n)。關(guān)系模式中,屬性的順序可以發(fā)生變化。
關(guān)系中元組的先后順序可以顛倒,但是不能出現(xiàn)重復(fù)元組。
關(guān)系模型中,一個碼由一個或多個屬性組成,其值能夠惟一標(biāo)識關(guān)系中一個元組。
關(guān)系模型是一種邏輯模型。
數(shù)據(jù)庫中的數(shù)據(jù)是不斷更新的,但關(guān)系模式不變。
數(shù)據(jù)模型要容易被用戶看懂,不必過于專業(yè)。
數(shù)據(jù)模型的特征主要有能比較真實地模擬現(xiàn)實世界、容易為人所理解、便于在計算機上實現(xiàn)。
數(shù)據(jù)模型的要素有數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)約束條件和數(shù)據(jù)操作。
數(shù)據(jù)結(jié)構(gòu)是對數(shù)據(jù)類型、數(shù)據(jù)類型之間的聯(lián)系的描述。
概念模型是現(xiàn)實世界的第一層抽象,這一類模型中最著名的模型是實體-關(guān)系模型。
對于現(xiàn)實世界中事物的特征,在實體-聯(lián)系模型中屬性來描述。
1:1關(guān)系模式的轉(zhuǎn)換,直接將一個實體的主鍵插入到另一實體中作為外鍵產(chǎn)生聯(lián)系。
1:n這種關(guān)系模式轉(zhuǎn)換,一般是將1的主鍵插入到n的表中作為外鍵,以此產(chǎn)生聯(lián)系。
m:n關(guān)系模式轉(zhuǎn)換,一般會因為聯(lián)系產(chǎn)生新的屬性,聯(lián)系會轉(zhuǎn)化成關(guān)系模型,要將兩個實體的主鍵都插入到新的關(guān)系模式中。

【數(shù)據(jù)庫】
關(guān)系數(shù)據(jù)庫的基本特征是不同列應(yīng)有不同的列名、與行和列的次序無關(guān)。
表中的行稱為一個元組,也稱一個記錄;表的每一列叫做字段或屬性;表的每一列的所有取值范圍稱為域。
關(guān)系數(shù)據(jù)庫采用關(guān)系模型對數(shù)據(jù)庫的概念模式進(jìn)行描述。
在一個關(guān)系中,記錄(元組)不可重復(fù),字段名(屬性名)不可重復(fù),屬性的順序可以任意調(diào)換,行的順序也可以任意調(diào)換。
使用二維表存儲數(shù)據(jù)的數(shù)據(jù)庫是關(guān)系型數(shù)據(jù)庫。