获取系统版本号_数据库系统原理
一、事務(wù)
概念
事務(wù)指的是滿足 ACID 特性的一組操作,可以通過(guò) Commit 提交一個(gè)事務(wù),也可以使用 Rollback 進(jìn)行回滾。
ACID
1. 原子性(Atomicity)
事務(wù)被視為不可分割的最小單元,事務(wù)的所有操作要么全部提交成功,要么全部失敗回滾。
回滾可以用回滾日志來(lái)實(shí)現(xiàn),回滾日志記錄著事務(wù)所執(zhí)行的修改操作,在回滾時(shí)反向執(zhí)行這些修改操作即可。
2. 一致性(Consistency)
數(shù)據(jù)庫(kù)在事務(wù)執(zhí)行前后都保持一致性狀態(tài)。在一致性狀態(tài)下,所有事務(wù)對(duì)一個(gè)數(shù)據(jù)的讀取結(jié)果都是相同的。
3. 隔離性(Isolation)
一個(gè)事務(wù)所做的修改在最終提交以前,對(duì)其它事務(wù)是不可見(jiàn)的。
4. 持久性(Durability)
一旦事務(wù)提交,則其所做的修改將會(huì)永遠(yuǎn)保存到數(shù)據(jù)庫(kù)中。即使系統(tǒng)發(fā)生崩潰,事務(wù)執(zhí)行的結(jié)果也不能丟失。
使用重做日志來(lái)保證持久性。
事務(wù)的 ACID 特性概念簡(jiǎn)單,但不是很好理解,主要是因?yàn)檫@幾個(gè)特性不是一種平級(jí)關(guān)系:
- 只有滿足一致性,事務(wù)的執(zhí)行結(jié)果才是正確的。
- 在無(wú)并發(fā)的情況下,事務(wù)串行執(zhí)行,隔離性一定能夠滿足。此時(shí)只要能滿足原子性,就一定能滿足一致性。
- 在并發(fā)的情況下,多個(gè)事務(wù)并行執(zhí)行,事務(wù)不僅要滿足原子性,還需要滿足隔離性,才能滿足一致性。
- 事務(wù)滿足持久化是為了能應(yīng)對(duì)數(shù)據(jù)庫(kù)崩潰的情況。
AUTOCOMMIT
MySQL 默認(rèn)采用自動(dòng)提交模式。也就是說(shuō),如果不顯式使用START TRANSACTION語(yǔ)句來(lái)開(kāi)始一個(gè)事務(wù),那么每個(gè)查詢都會(huì)被當(dāng)做一個(gè)事務(wù)自動(dòng)提交。
二、并發(fā)一致性問(wèn)題
在并發(fā)環(huán)境下,事務(wù)的隔離性很難保證,因此會(huì)出現(xiàn)很多并發(fā)一致性問(wèn)題。
丟失修改
T1 和 T2 兩個(gè)事務(wù)都對(duì)一個(gè)數(shù)據(jù)進(jìn)行修改,T1 先修改,T2 隨后修改,T2 的修改覆蓋了 T1 的修改。
讀臟數(shù)據(jù)
T1 修改一個(gè)數(shù)據(jù),T2 隨后讀取這個(gè)數(shù)據(jù)。如果 T1 撤銷了這次修改,那么 T2 讀取的數(shù)據(jù)是臟數(shù)據(jù)。
不可重復(fù)讀
T2 讀取一個(gè)數(shù)據(jù),T1 對(duì)該數(shù)據(jù)做了修改。如果 T2 再次讀取這個(gè)數(shù)據(jù),此時(shí)讀取的結(jié)果和第一次讀取的結(jié)果不同。
幻影讀
T1 讀取某個(gè)范圍的數(shù)據(jù),T2 在這個(gè)范圍內(nèi)插入新的數(shù)據(jù),T1 再次讀取這個(gè)范圍的數(shù)據(jù),此時(shí)讀取的結(jié)果和和第一次讀取的結(jié)果不同。
產(chǎn)生并發(fā)不一致性問(wèn)題主要原因是破壞了事務(wù)的隔離性,解決方法是通過(guò)并發(fā)控制來(lái)保證隔離性。并發(fā)控制可以通過(guò)封鎖來(lái)實(shí)現(xiàn),但是封鎖操作需要用戶自己控制,相當(dāng)復(fù)雜。數(shù)據(jù)庫(kù)管理系統(tǒng)提供了事務(wù)的隔離級(jí)別,讓用戶以一種更輕松的方式處理并發(fā)一致性問(wèn)題。
三、封鎖
封鎖粒度
MySQL 中提供了兩種封鎖粒度:行級(jí)鎖以及表級(jí)鎖。
應(yīng)該盡量只鎖定需要修改的那部分?jǐn)?shù)據(jù),而不是所有的資源。鎖定的數(shù)據(jù)量越少,發(fā)生鎖爭(zhēng)用的可能就越小,系統(tǒng)的并發(fā)程度就越高。
但是加鎖需要消耗資源,鎖的各種操作(包括獲取鎖、釋放鎖、以及檢查鎖狀態(tài))都會(huì)增加系統(tǒng)開(kāi)銷。因此封鎖粒度越小,系統(tǒng)開(kāi)銷就越大。
在選擇封鎖粒度時(shí),需要在鎖開(kāi)銷和并發(fā)程度之間做一個(gè)權(quán)衡。
封鎖類型
1. 讀寫鎖
- 排它鎖(Exclusive),簡(jiǎn)寫為 X 鎖,又稱寫鎖。
- 共享鎖(Shared),簡(jiǎn)寫為 S 鎖,又稱讀鎖。
有以下兩個(gè)規(guī)定:
- 一個(gè)事務(wù)對(duì)數(shù)據(jù)對(duì)象 A 加了 X 鎖,就可以對(duì) A 進(jìn)行讀取和更新。加鎖期間其它事務(wù)不能對(duì) A 加任何鎖。
- 一個(gè)事務(wù)對(duì)數(shù)據(jù)對(duì)象 A 加了 S 鎖,可以對(duì) A 進(jìn)行讀取操作,但是不能進(jìn)行更新操作。加鎖期間其它事務(wù)能對(duì) A 加 S 鎖,但是不能加 X 鎖。
鎖的兼容關(guān)系如下:
| - | X | S | | :--: | :--: | :--: | | X |×|×| | S |×|√|
2. 意向鎖
使用意向鎖(Intention Locks)可以更容易地支持多粒度封鎖。
在存在行級(jí)鎖和表級(jí)鎖的情況下,事務(wù) T 想要對(duì)表 A 加 X 鎖,就需要先檢測(cè)是否有其它事務(wù)對(duì)表 A 或者表 A 中的任意一行加了鎖,那么就需要對(duì)表 A 的每一行都檢測(cè)一次,這是非常耗時(shí)的。
意向鎖在原來(lái)的 X/S 鎖之上引入了 IX/IS,IX/IS 都是表鎖,用來(lái)表示一個(gè)事務(wù)想要在表中的某個(gè)數(shù)據(jù)行上加 X 鎖或 S 鎖。有以下兩個(gè)規(guī)定:
- 一個(gè)事務(wù)在獲得某個(gè)數(shù)據(jù)行對(duì)象的 S 鎖之前,必須先獲得表的 IS 鎖或者更強(qiáng)的鎖;
- 一個(gè)事務(wù)在獲得某個(gè)數(shù)據(jù)行對(duì)象的 X 鎖之前,必須先獲得表的 IX 鎖。
通過(guò)引入意向鎖,事務(wù) T 想要對(duì)表 A 加 X 鎖,只需要先檢測(cè)是否有其它事務(wù)對(duì)表 A 加了 X/IX/S/IS 鎖,如果加了就表示有其它事務(wù)正在使用這個(gè)表或者表中某一行的鎖,因此事務(wù) T 加 X 鎖失敗。
各種鎖的兼容關(guān)系如下:
| - | X | IX | S | IS | | :--: | :--: | :--: | :--: | :--: | | X |× |× |× | ×| | IX |× |√ |× | √| | S |× |× |√ | √| | IS |× |√ |√ | √|
解釋如下:
- 任意 IS/IX 鎖之間都是兼容的,因?yàn)樗鼈冎皇潜硎鞠胍獙?duì)表加鎖,而不是真正加鎖;
- S 鎖只與 S 鎖和 IS 鎖兼容,也就是說(shuō)事務(wù) T 想要對(duì)數(shù)據(jù)行加 S 鎖,其它事務(wù)可以已經(jīng)獲得對(duì)表或者表中的行的 S 鎖。
封鎖協(xié)議
1. 三級(jí)封鎖協(xié)議
一級(jí)封鎖協(xié)議
事務(wù) T 要修改數(shù)據(jù) A 時(shí)必須加 X 鎖,直到 T 結(jié)束才釋放鎖。
可以解決丟失修改問(wèn)題,因?yàn)椴荒芡瑫r(shí)有兩個(gè)事務(wù)對(duì)同一個(gè)數(shù)據(jù)進(jìn)行修改,那么事務(wù)的修改就不會(huì)被覆蓋。
| T1 | T2 | | :--: | :--: | | lock-x(A) | | | read A=20 | | | | lock-x(A) | | | wait | | write A=19 |. | | commit |. | | unlock-x(A) |. | | | obtain | | | read A=19 | | | write A=21 | | | commit | | | unlock-x(A)|
二級(jí)封鎖協(xié)議
在一級(jí)的基礎(chǔ)上,要求讀取數(shù)據(jù) A 時(shí)必須加 S 鎖,讀取完馬上釋放 S 鎖。
可以解決讀臟數(shù)據(jù)問(wèn)題,因?yàn)槿绻粋€(gè)事務(wù)在對(duì)數(shù)據(jù) A 進(jìn)行修改,根據(jù) 1 級(jí)封鎖協(xié)議,會(huì)加 X 鎖,那么就不能再加 S 鎖了,也就是不會(huì)讀入數(shù)據(jù)。
| T1 | T2 | | :--: | :--: | | lock-x(A) | | | read A=20 | | | write A=19 | | | | lock-s(A) | | | wait | | rollback | .| | A=20 |. | | unlock-x(A) |. | | | obtain | | | read A=20 | | | unlock-s(A)| | | commit |
三級(jí)封鎖協(xié)議
在二級(jí)的基礎(chǔ)上,要求讀取數(shù)據(jù) A 時(shí)必須加 S 鎖,直到事務(wù)結(jié)束了才能釋放 S 鎖。
可以解決不可重復(fù)讀的問(wèn)題,因?yàn)樽x A 時(shí),其它事務(wù)不能對(duì) A 加 X 鎖,從而避免了在讀的期間數(shù)據(jù)發(fā)生改變。
| T1 | T2 | | :--: | :--: | | lock-s(A) | | | read A=20 | | | |lock-x(A) | | | wait | | read A=20| . | | commit | .| | unlock-s(A) |. | | | obtain | | | read A=20 | | | write A=19| | | commit | | | unlock-X(A)|
2. 兩段鎖協(xié)議
加鎖和解鎖分為兩個(gè)階段進(jìn)行。
可串行化調(diào)度是指,通過(guò)并發(fā)控制,使得并發(fā)執(zhí)行的事務(wù)結(jié)果與某個(gè)串行執(zhí)行的事務(wù)結(jié)果相同。
事務(wù)遵循兩段鎖協(xié)議是保證可串行化調(diào)度的充分條件。例如以下操作滿足兩段鎖協(xié)議,它是可串行化調(diào)度。
lock-x(A)...lock-s(B)...lock-s(C)...unlock(A)...unlock(C)...unlock(B)但不是必要條件,例如以下操作不滿足兩段鎖協(xié)議,但是它還是可串行化調(diào)度。
lock-x(A)...unlock(A)...lock-s(B)...unlock(B)...lock-s(C)...unlock(C)MySQL 隱式與顯示鎖定
MySQL 的 InnoDB 存儲(chǔ)引擎采用兩段鎖協(xié)議,會(huì)根據(jù)隔離級(jí)別在需要的時(shí)候自動(dòng)加鎖,并且所有的鎖都是在同一時(shí)刻被釋放,這被稱為隱式鎖定。
InnoDB 也可以使用特定的語(yǔ)句進(jìn)行顯示鎖定:
SELECT ... LOCK In SHARE MODE; SELECT ... FOR UPDATE;四、隔離級(jí)別
未提交讀(READ UNCOMMITTED)
事務(wù)中的修改,即使沒(méi)有提交,對(duì)其它事務(wù)也是可見(jiàn)的。
提交讀(READ COMMITTED)
一個(gè)事務(wù)只能讀取已經(jīng)提交的事務(wù)所做的修改。換句話說(shuō),一個(gè)事務(wù)所做的修改在提交之前對(duì)其它事務(wù)是不可見(jiàn)的。
可重復(fù)讀(REPEATABLE READ)
保證在同一個(gè)事務(wù)中多次讀取同樣數(shù)據(jù)的結(jié)果是一樣的。
可串行化(SERIALIZABLE)
強(qiáng)制事務(wù)串行執(zhí)行。
需要加鎖實(shí)現(xiàn),而其它隔離級(jí)別通常不需要。
| 隔離級(jí)別 | 臟讀 | 不可重復(fù)讀 | 幻影讀 | | :---: | :---: | :---:| :---: | | 未提交讀 | √ | √ | √ | | 提交讀 | × | √ | √ | | 可重復(fù)讀 | × | × | √ | | 可串行化 | × | × | × |
五、多版本并發(fā)控制
多版本并發(fā)控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存儲(chǔ)引擎實(shí)現(xiàn)隔離級(jí)別的一種具體方式,用于實(shí)現(xiàn)提交讀和可重復(fù)讀這兩種隔離級(jí)別。而未提交讀隔離級(jí)別總是讀取最新的數(shù)據(jù)行,無(wú)需使用 MVCC。可串行化隔離級(jí)別需要對(duì)所有讀取的行都加鎖,單純使用 MVCC 無(wú)法實(shí)現(xiàn)。
版本號(hào)
- 系統(tǒng)版本號(hào):是一個(gè)遞增的數(shù)字,每開(kāi)始一個(gè)新的事務(wù),系統(tǒng)版本號(hào)就會(huì)自動(dòng)遞增。
- 事務(wù)版本號(hào):事務(wù)開(kāi)始時(shí)的系統(tǒng)版本號(hào)。
隱藏的列
MVCC 在每行記錄后面都保存著兩個(gè)隱藏的列,用來(lái)存儲(chǔ)兩個(gè)版本號(hào):
- 創(chuàng)建版本號(hào):指示創(chuàng)建一個(gè)數(shù)據(jù)行的快照時(shí)的系統(tǒng)版本號(hào);
- 刪除版本號(hào):如果該快照的刪除版本號(hào)大于當(dāng)前事務(wù)版本號(hào)表示該快照有效,否則表示該快照已經(jīng)被刪除了。
Undo 日志
MVCC 使用到的快照存儲(chǔ)在 Undo 日志中,該日志通過(guò)回滾指針把一個(gè)數(shù)據(jù)行(Record)的所有快照連接起來(lái)。
實(shí)現(xiàn)過(guò)程
以下實(shí)現(xiàn)過(guò)程針對(duì)可重復(fù)讀隔離級(jí)別。
當(dāng)開(kāi)始一個(gè)事務(wù)時(shí),該事務(wù)的版本號(hào)肯定大于當(dāng)前所有數(shù)據(jù)行快照的創(chuàng)建版本號(hào),理解這一點(diǎn)很關(guān)鍵。數(shù)據(jù)行快照的創(chuàng)建版本號(hào)是創(chuàng)建數(shù)據(jù)行快照時(shí)的系統(tǒng)版本號(hào),系統(tǒng)版本號(hào)隨著創(chuàng)建事務(wù)而遞增,因此新創(chuàng)建一個(gè)事務(wù)時(shí),這個(gè)事務(wù)的系統(tǒng)版本號(hào)比之前的系統(tǒng)版本號(hào)都大,也就是比所有數(shù)據(jù)行快照的創(chuàng)建版本號(hào)都大。
1. SELECT
多個(gè)事務(wù)必須讀取到同一個(gè)數(shù)據(jù)行的快照,并且這個(gè)快照是距離現(xiàn)在最近的一個(gè)有效快照。但是也有例外,如果有一個(gè)事務(wù)正在修改該數(shù)據(jù)行,那么它可以讀取事務(wù)本身所做的修改,而不用和其它事務(wù)的讀取結(jié)果一致。
把沒(méi)有對(duì)一個(gè)數(shù)據(jù)行做修改的事務(wù)稱為 T,T 所要讀取的數(shù)據(jù)行快照的創(chuàng)建版本號(hào)必須小于 T 的版本號(hào),因?yàn)槿绻笥诨蛘叩扔?T 的版本號(hào),那么表示該數(shù)據(jù)行快照是其它事務(wù)的最新修改,因此不能去讀取它。除此之外,T 所要讀取的數(shù)據(jù)行快照的刪除版本號(hào)必須大于 T 的版本號(hào),因?yàn)槿绻∮诘扔?T 的版本號(hào),那么表示該數(shù)據(jù)行快照是已經(jīng)被刪除的,不應(yīng)該去讀取它。
2. INSERT
將當(dāng)前系統(tǒng)版本號(hào)作為數(shù)據(jù)行快照的創(chuàng)建版本號(hào)。
3. DELETE
將當(dāng)前系統(tǒng)版本號(hào)作為數(shù)據(jù)行快照的刪除版本號(hào)。
4. UPDATE
將當(dāng)前系統(tǒng)版本號(hào)作為更新前的數(shù)據(jù)行快照的刪除版本號(hào),并將當(dāng)前系統(tǒng)版本號(hào)作為更新后的數(shù)據(jù)行快照的創(chuàng)建版本號(hào)。可以理解為先執(zhí)行 DELETE 后執(zhí)行 INSERT。
快照讀與當(dāng)前讀
1. 快照讀
使用 MVCC 讀取的是快照中的數(shù)據(jù),這樣可以減少加鎖所帶來(lái)的開(kāi)銷。
select * from table ...;2. 當(dāng)前讀
讀取的是最新的數(shù)據(jù),需要加鎖。以下第一個(gè)語(yǔ)句需要加 S 鎖,其它都需要加 X 鎖。
select * from table where ? lock in share mode; select * from table where ? for update; insert; update; delete;六、Next-Key Locks
Next-Key Locks 是 MySQL 的 InnoDB 存儲(chǔ)引擎的一種鎖實(shí)現(xiàn)。
MVCC 不能解決幻影讀問(wèn)題,Next-Key Locks 就是為了解決這個(gè)問(wèn)題而存在的。在可重復(fù)讀(REPEATABLE READ)隔離級(jí)別下,使用 MVCC + Next-Key Locks 可以解決幻讀問(wèn)題。
Record Locks
鎖定一個(gè)記錄上的索引,而不是記錄本身。
如果表沒(méi)有設(shè)置索引,InnoDB 會(huì)自動(dòng)在主鍵上創(chuàng)建隱藏的聚簇索引,因此 Record Locks 依然可以使用。
Gap Locks
鎖定索引之間的間隙,但是不包含索引本身。例如當(dāng)一個(gè)事務(wù)執(zhí)行以下語(yǔ)句,其它事務(wù)就不能在 t.c 中插入 15。
SELECT c FROM t WHERE c BETWEEN 10 and 20 FOR UPDATE;Next-Key Locks
它是 Record Locks 和 Gap Locks 的結(jié)合,不僅鎖定一個(gè)記錄上的索引,也鎖定索引之間的間隙。例如一個(gè)索引包含以下值:10, 11, 13, and 20,那么就需要鎖定以下區(qū)間:
(-∞, 10] (10, 11] (11, 13] (13, 20] (20, +∞)七、關(guān)系數(shù)據(jù)庫(kù)設(shè)計(jì)理論
函數(shù)依賴
記 A->B 表示 A 函數(shù)決定 B,也可以說(shuō) B 函數(shù)依賴于 A。
如果 {A1,A2,... ,An} 是關(guān)系的一個(gè)或多個(gè)屬性的集合,該集合函數(shù)決定了關(guān)系的其它所有屬性并且是最小的,那么該集合就稱為鍵碼。
對(duì)于 A->B,如果能找到 A 的真子集 A',使得 A'-> B,那么 A->B 就是部分函數(shù)依賴,否則就是完全函數(shù)依賴。
對(duì)于 A->B,B->C,則 A->C 是一個(gè)傳遞函數(shù)依賴。
異常
以下的學(xué)生課程關(guān)系的函數(shù)依賴為 {Sno, Cname} -> {Sname, Sdept, Mname, Grade},鍵碼為 {Sno, Cname}。也就是說(shuō),確定學(xué)生和課程之后,就能確定其它信息。
| Sno | Sname | Sdept | Mname | Cname | Grade | | :---: | :---: | :---: | :---: | :---: |:---:| | 1 | 學(xué)生-1 | 學(xué)院-1 | 院長(zhǎng)-1 | 課程-1 | 90 | | 2 | 學(xué)生-2 | 學(xué)院-2 | 院長(zhǎng)-2 | 課程-2 | 80 | | 2 | 學(xué)生-2 | 學(xué)院-2 | 院長(zhǎng)-2 | 課程-1 | 100 | | 3 | 學(xué)生-3 | 學(xué)院-2 | 院長(zhǎng)-2 | 課程-2 | 95 |
不符合范式的關(guān)系,會(huì)產(chǎn)生很多異常,主要有以下四種異常:
- 冗余數(shù)據(jù):例如 學(xué)生-2 出現(xiàn)了兩次。
- 修改異常:修改了一個(gè)記錄中的信息,但是另一個(gè)記錄中相同的信息卻沒(méi)有被修改。
- 刪除異常:刪除一個(gè)信息,那么也會(huì)丟失其它信息。例如刪除了 課程-1 需要?jiǎng)h除第一行和第三行,那么 學(xué)生-1 的信息就會(huì)丟失。
- 插入異常:例如想要插入一個(gè)學(xué)生的信息,如果這個(gè)學(xué)生還沒(méi)選課,那么就無(wú)法插入。
范式
范式理論是為了解決以上提到四種異常。
高級(jí)別范式的依賴于低級(jí)別的范式,1NF 是最低級(jí)別的范式。
1. 第一范式 (1NF)
屬性不可分。
2. 第二范式 (2NF)
每個(gè)非主屬性完全函數(shù)依賴于鍵碼。
可以通過(guò)分解來(lái)滿足。
分解前
| Sno | Sname | Sdept | Mname | Cname | Grade | | :---: | :---: | :---: | :---: | :---: |:---:| | 1 | 學(xué)生-1 | 學(xué)院-1 | 院長(zhǎng)-1 | 課程-1 | 90 | | 2 | 學(xué)生-2 | 學(xué)院-2 | 院長(zhǎng)-2 | 課程-2 | 80 | | 2 | 學(xué)生-2 | 學(xué)院-2 | 院長(zhǎng)-2 | 課程-1 | 100 | | 3 | 學(xué)生-3 | 學(xué)院-2 | 院長(zhǎng)-2 | 課程-2 | 95 |
以上學(xué)生課程關(guān)系中,{Sno, Cname} 為鍵碼,有如下函數(shù)依賴:
- Sno -> Sname, Sdept
- Sdept -> Mname
- Sno, Cname-> Grade
Grade 完全函數(shù)依賴于鍵碼,它沒(méi)有任何冗余數(shù)據(jù),每個(gè)學(xué)生的每門課都有特定的成績(jī)。
Sname, Sdept 和 Mname 都部分依賴于鍵碼,當(dāng)一個(gè)學(xué)生選修了多門課時(shí),這些數(shù)據(jù)就會(huì)出現(xiàn)多次,造成大量冗余數(shù)據(jù)。
分解后
關(guān)系-1
| Sno | Sname | Sdept | Mname | | :---: | :---: | :---: | :---: | | 1 | 學(xué)生-1 | 學(xué)院-1 | 院長(zhǎng)-1 | | 2 | 學(xué)生-2 | 學(xué)院-2 | 院長(zhǎng)-2 | | 3 | 學(xué)生-3 | 學(xué)院-2 | 院長(zhǎng)-2 |
有以下函數(shù)依賴:
- Sno -> Sname, Sdept
- Sdept -> Mname
關(guān)系-2
| Sno | Cname | Grade | | :---: | :---: |:---:| | 1 | 課程-1 | 90 | | 2 | 課程-2 | 80 | | 2 | 課程-1 | 100 | | 3 | 課程-2 | 95 |
有以下函數(shù)依賴:
- Sno, Cname -> Grade
3. 第三范式 (3NF)
非主屬性不傳遞函數(shù)依賴于鍵碼。
上面的 關(guān)系-1 中存在以下傳遞函數(shù)依賴:
- Sno -> Sdept -> Mname
可以進(jìn)行以下分解:
關(guān)系-11
| Sno | Sname | Sdept | | :---: | :---: | :---: | | 1 | 學(xué)生-1 | 學(xué)院-1 | | 2 | 學(xué)生-2 | 學(xué)院-2 | | 3 | 學(xué)生-3 | 學(xué)院-2 |
關(guān)系-12
| Sdept | Mname | | :---: | :---: | | 學(xué)院-1 | 院長(zhǎng)-1 | | 學(xué)院-2 | 院長(zhǎng)-2 |
八、ER 圖
Entity-Relationship,有三個(gè)組成部分:實(shí)體、屬性、聯(lián)系。
用來(lái)進(jìn)行關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)的概念設(shè)計(jì)。
實(shí)體的三種聯(lián)系
包含一對(duì)一,一對(duì)多,多對(duì)多三種。
- 如果 A 到 B 是一對(duì)多關(guān)系,那么畫個(gè)帶箭頭的線段指向 B;
- 如果是一對(duì)一,畫兩個(gè)帶箭頭的線段;
- 如果是多對(duì)多,畫兩個(gè)不帶箭頭的線段。
下圖的 Course 和 Student 是一對(duì)多的關(guān)系。
表示出現(xiàn)多次的關(guān)系
一個(gè)實(shí)體在聯(lián)系出現(xiàn)幾次,就要用幾條線連接。
下圖表示一個(gè)課程的先修關(guān)系,先修關(guān)系出現(xiàn)兩個(gè) Course 實(shí)體,第一個(gè)是先修課程,后一個(gè)是后修課程,因此需要用兩條線來(lái)表示這種關(guān)系。
聯(lián)系的多向性
雖然老師可以開(kāi)設(shè)多門課,并且可以教授多名學(xué)生,但是對(duì)于特定的學(xué)生和課程,只有一個(gè)老師教授,這就構(gòu)成了一個(gè)三元聯(lián)系。
表示子類
用一個(gè)三角形和兩條線來(lái)連接類和子類,與子類有關(guān)的屬性和聯(lián)系都連到子類上,而與父類和子類都有關(guān)的連到父類上。
參考資料
- AbrahamSilberschatz, HenryF.Korth, S.Sudarshan, 等. 數(shù)據(jù)庫(kù)系統(tǒng)概念 [M]. 機(jī)械工業(yè)出版社, 2006.
- 施瓦茨. 高性能 MYSQL(第3版)[M]. 電子工業(yè)出版社, 2013.
- 史嘉權(quán). 數(shù)據(jù)庫(kù)系統(tǒng)概論[M]. 清華大學(xué)出版社有限公司, 2006.
- The InnoDB Storage Engine
- Transaction isolation levels
- Concurrency Control
- The Nightmare of Locking, Blocking and Isolation Levels!
- Database Normalization and Normal Forms with an Example
- The basics of the InnoDB undo logging and history system
- MySQL locking for the busy web developer
- 淺入淺出 MySQL 和 InnoDB
- Innodb 中的事務(wù)隔離級(jí)別和鎖的關(guān)系
總結(jié)
以上是生活随笔為你收集整理的获取系统版本号_数据库系统原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python pip 安装与使用_Pyt
- 下一篇: 用pos机刷信用卡影响