筆者能力有限,總結(jié)有誤的地方,請(qǐng)讀者協(xié)作更正。
1.三范式
- 第一范式(1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個(gè)單一屬性由基本類型構(gòu)成,包括整型、實(shí)數(shù)、字符型、邏輯型、日期型等。
- 第二范式(2NF):數(shù)據(jù)庫表中不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的部分函數(shù)依賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。
- 第三范式(3NF):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對(duì)任一候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。所謂傳遞函數(shù)依賴,指的是如 果存在"A → B → C"的決定關(guān)系,則C傳遞函數(shù)依賴于A。因此,滿足第三范式的數(shù)據(jù)庫表應(yīng)該不存在如下依賴關(guān)系: 關(guān)鍵字段 → 非關(guān)鍵字段 x → 非關(guān)鍵字段y
2. 反范式
- 第二范式:非主鍵列是否依賴主鍵(包括一列通過某一列間接依賴主鍵),要是有依賴關(guān)系的就是第二范式;
- 第三范式:非主鍵列是否是直接依賴主鍵,不能是那種通過傳遞關(guān)系的依賴的。要是符合這種就是第三范式;
- 使用范式有哪些優(yōu)點(diǎn)和缺點(diǎn)?
- 范式可以避免數(shù)據(jù)冗余,減少數(shù)據(jù)庫的空間,減輕維護(hù)數(shù)據(jù)完整性的麻煩。
- 范式再給我們帶來的上面的好處時(shí),同時(shí)也伴隨著一些不好的地方:按照范式的規(guī)范設(shè)計(jì)出來的表,等級(jí)越高的范式設(shè)計(jì)出來的表越多。
- 如第一范式可能設(shè)計(jì)出來的表可能只有一張表而已,再按照第二范式去設(shè)計(jì)這張表時(shí)就可能出來兩張或更多張表,如果再按第三范式或更高的范式去設(shè)計(jì)這張表會(huì)出現(xiàn)更多比第二范式多的表。
- 表的數(shù)量越多,當(dāng)我們?nèi)ゲ樵円恍?shù)據(jù),必然要去多表中去查詢數(shù)據(jù),這樣查詢的時(shí)間要比在一張表中查詢中所用的時(shí)間要高很多。也就是說我們所用的范式越高,對(duì)數(shù)據(jù)操作的性能越低。
- 所以我們?cè)诶梅妒皆O(shè)計(jì)表的時(shí)候,要根據(jù)具體的需求再去權(quán)衡是否使用更高范式去設(shè)計(jì)表。在一般的項(xiàng)目中,我們用的最多也就是第三范式,第三范式也就可以滿足我們的項(xiàng)目需求,性能好而且方便管理數(shù)據(jù);
- 當(dāng)我們的業(yè)務(wù)所涉及的表非常多,經(jīng)常會(huì)有多表發(fā)生關(guān)系,并且我們對(duì)表的操作要時(shí)間上要盡量的快,這時(shí)可以考慮我們使用“反范式”。
關(guān)于反范式
不滿足范式的模型,就是反范式模型。
- 反范式跟范式所要求的正好相反,在反范式的設(shè)計(jì)模式,我們可以允許適當(dāng)?shù)臄?shù)據(jù)的冗余,用這個(gè)冗余去取操作數(shù)據(jù)時(shí)間的縮短。本質(zhì)上就是用空間來換取時(shí)間,把數(shù)據(jù)冗余在多個(gè)表中,當(dāng)查詢時(shí)可以減少或者是避免表之間的關(guān)聯(lián);
3. 事物
- 事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂的事務(wù),它是一個(gè)操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)不可分割的工作單位。事務(wù)是數(shù)據(jù)庫維護(hù)數(shù)據(jù)一致性的單位,在每個(gè)事務(wù)結(jié)束時(shí),都能保持?jǐn)?shù)據(jù)一致性。
- 事務(wù)的特性,要想成為事務(wù),必須滿足:ACID(原子性,一致性,隔離性,持久性)四特性,事務(wù)是恢復(fù)和并發(fā)控制的基本單位。原子性指的是事務(wù)是數(shù)據(jù)庫的邏輯工作單位,事務(wù)中操作要么都做,要么都不做;一致性指的是事務(wù)的執(zhí)行結(jié)果必須是使數(shù)據(jù)庫從一個(gè)一致性狀態(tài)變大另一個(gè)一致性狀態(tài),一致性和原子性是密切相關(guān)的;隔離性指的是一個(gè)事務(wù)執(zhí)行不能被其他事務(wù)干擾;持久性指的是一個(gè)事務(wù)一旦提交,他對(duì)數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的。
4. 鎖
- 數(shù)據(jù)庫鎖有“共享鎖”,“排它鎖”,“互斥鎖”,“寫鎖”,“讀鎖”,“悲觀鎖”,“樂觀鎖”,“行級(jí)鎖”,“表級(jí)鎖”,“頁級(jí)鎖”等,同時(shí)我們還會(huì)??吹健皝G失修改“,”不可重復(fù)讀“,”讀臟數(shù)據(jù)“這三個(gè)術(shù)語
- 并發(fā)控制一般采用三種方法,分別是樂觀鎖和悲觀鎖以及時(shí)間戳。
- 樂觀鎖認(rèn)為一個(gè)用戶讀數(shù)據(jù)的時(shí)候,別人不會(huì)去寫自己所讀的數(shù)據(jù);
- 悲觀鎖就剛好相反,覺得自己讀數(shù)據(jù)庫的時(shí)候,別人可能剛好在寫自己剛讀的數(shù)據(jù),其實(shí)就是持一種比較保守的態(tài)度;
- 時(shí)間戳就是不加鎖,通過時(shí)間戳來控制并發(fā)出現(xiàn)的問題。
- 悲觀鎖就是在讀取數(shù)據(jù)的時(shí)候,為了不讓別人修改自己讀取的數(shù)據(jù),就會(huì)先對(duì)自己讀取的數(shù)據(jù)加鎖,只有自己把數(shù)據(jù)讀完了,才允許別人修改那部分?jǐn)?shù)據(jù),或者反過來說,就是自己修改某條數(shù)據(jù)的時(shí)候,不允許別人讀取該數(shù)據(jù),只有等自己的整個(gè)事務(wù)提交了,才釋放自己加上的鎖,才允許其他用戶訪問那部分?jǐn)?shù)據(jù)。
- 樂觀鎖就比較簡單了,就是不做控制,這只是一部分人對(duì)于并發(fā)所持有的一種態(tài)度而已。
- 時(shí)間戳就是在數(shù)據(jù)庫表中單獨(dú)加一列時(shí)間戳,比如“TimeStamp”,每次讀出來的時(shí)候,把該字段也讀出來,當(dāng)寫回去的時(shí)候,把該字段加1,提交之前 ,跟數(shù)據(jù)庫的該字段比較一次,如果比數(shù)據(jù)庫的值大的話,就允許保存,否則不允許保存,這種處理方法雖然不使用數(shù)據(jù)庫系統(tǒng)提供的鎖機(jī)制,但是這種方法可以大大提高數(shù)據(jù)庫處理的并發(fā)量,因?yàn)檫@種方法可以避免了長事務(wù)中的數(shù)據(jù)庫加鎖開銷(操作員A 和操作員B操作過程中,都沒有對(duì)數(shù)據(jù)庫數(shù)據(jù)加鎖),大大提升了大并發(fā)量下的系 統(tǒng)整體性能表現(xiàn)。
- 悲觀鎖所說的加“鎖”,其實(shí)分為幾種鎖,分別是:排它鎖和共享鎖,其中排它鎖又稱為寫鎖,共享鎖又稱為讀鎖
5. 視圖
- 視圖是一種虛擬的表,具有和物理表相同的功能。可以對(duì)視圖進(jìn)行增,改,查,操作,試圖通常是有一個(gè)表或者多個(gè)表的行或列的子集。對(duì)視圖的修改不影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢。
- 只暴露部分字段給訪問者,所以就建一個(gè)虛表,就是視圖。
- 查詢的數(shù)據(jù)來源于不同的表,而查詢者希望以統(tǒng)一的方式查詢,這樣也可以建立一個(gè)視圖,把多個(gè)表查詢結(jié)果聯(lián)合起來,查詢者只需要直接從視圖中獲取數(shù)據(jù),不必考慮數(shù)據(jù)來源于不同表所帶來的差異
6. 索引
- 索引是對(duì)數(shù)據(jù)庫表中一或多個(gè)列的值進(jìn)行排序的結(jié)構(gòu),是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
- 你也可以這樣理解:索引就是加快檢索表中數(shù)據(jù)的方法。數(shù)據(jù)庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個(gè)書就能迅速地找到所需要的信息。在數(shù)據(jù)庫中,索引也允許數(shù)據(jù)庫程序迅速地找到表中的數(shù)據(jù),而不必掃描整個(gè)數(shù)據(jù)庫。
更多建議: