筆者能力有限,總結(jié)有誤的地方,請讀者協(xié)作更正。
1.三范式
- 第一范式(1NF):數(shù)據(jù)庫表中的字段都是單一屬性的,不可再分。這個單一屬性由基本類型構(gòu)成,包括整型、實數(shù)、字符型、邏輯型、日期型等。
- 第二范式(2NF):數(shù)據(jù)庫表中不存在非關(guān)鍵字段對任一候選關(guān)鍵字段的部分函數(shù)依賴(部分函數(shù)依賴指的是存在組合關(guān)鍵字中的某些字段決定非關(guān)鍵字段的情況),也即所有非關(guān)鍵字段都完全依賴于任意一組候選關(guān)鍵字。
- 第三范式(3NF):在第二范式的基礎(chǔ)上,數(shù)據(jù)表中如果不存在非關(guān)鍵字段對任一候選關(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)系的依賴的。要是符合這種就是第三范式;
- 范式可以避免數(shù)據(jù)冗余,減少數(shù)據(jù)庫的空間,減輕維護(hù)數(shù)據(jù)完整性的麻煩。
- 范式再給我們帶來的上面的好處時,同時也伴隨著一些不好的地方:按照范式的規(guī)范設(shè)計出來的表,等級越高的范式設(shè)計出來的表越多。
- 如第一范式可能設(shè)計出來的表可能只有一張表而已,再按照第二范式去設(shè)計這張表時就可能出來兩張或更多張表,如果再按第三范式或更高的范式去設(shè)計這張表會出現(xiàn)更多比第二范式多的表。
- 表的數(shù)量越多,當(dāng)我們?nèi)ゲ樵円恍?shù)據(jù),必然要去多表中去查詢數(shù)據(jù),這樣查詢的時間要比在一張表中查詢中所用的時間要高很多。也就是說我們所用的范式越高,對數(shù)據(jù)操作的性能越低。
- 所以我們在利用范式設(shè)計表的時候,要根據(jù)具體的需求再去權(quán)衡是否使用更高范式去設(shè)計表。在一般的項目中,我們用的最多也就是第三范式,第三范式也就可以滿足我們的項目需求,性能好而且方便管理數(shù)據(jù);
- 當(dāng)我們的業(yè)務(wù)所涉及的表非常多,經(jīng)常會有多表發(fā)生關(guān)系,并且我們對表的操作要時間上要盡量的快,這時可以考慮我們使用“反范式”。
關(guān)于反范式
不滿足范式的模型,就是反范式模型。
- 反范式跟范式所要求的正好相反,在反范式的設(shè)計模式,我們可以允許適當(dāng)?shù)臄?shù)據(jù)的冗余,用這個冗余去取操作數(shù)據(jù)時間的縮短。本質(zhì)上就是用空間來換取時間,把數(shù)據(jù)冗余在多個表中,當(dāng)查詢時可以減少或者是避免表之間的關(guān)聯(lián);

3. 事物
- 事務(wù)(Transaction)是并發(fā)控制的基本單位。所謂的事務(wù),它是一個操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個不可分割的工作單位。事務(wù)是數(shù)據(jù)庫維護(hù)數(shù)據(jù)一致性的單位,在每個事務(wù)結(jié)束時,都能保持?jǐn)?shù)據(jù)一致性。
- 事務(wù)的特性,要想成為事務(wù),必須滿足:ACID(原子性,一致性,隔離性,持久性)四特性,事務(wù)是恢復(fù)和并發(fā)控制的基本單位。原子性指的是事務(wù)是數(shù)據(jù)庫的邏輯工作單位,事務(wù)中操作要么都做,要么都不做;一致性指的是事務(wù)的執(zhí)行結(jié)果必須是使數(shù)據(jù)庫從一個一致性狀態(tài)變大另一個一致性狀態(tài),一致性和原子性是密切相關(guān)的;隔離性指的是一個事務(wù)執(zhí)行不能被其他事務(wù)干擾;持久性指的是一個事務(wù)一旦提交,他對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的。
4. 鎖
- 數(shù)據(jù)庫鎖有“共享鎖”,“排它鎖”,“互斥鎖”,“寫鎖”,“讀鎖”,“悲觀鎖”,“樂觀鎖”,“行級鎖”,“表級鎖”,“頁級鎖”等,同時我們還會??吹健皝G失修改“,”不可重復(fù)讀“,”讀臟數(shù)據(jù)“這三個術(shù)語
- 并發(fā)控制一般采用三種方法,分別是樂觀鎖和悲觀鎖以及時間戳。
- 樂觀鎖認(rèn)為一個用戶讀數(shù)據(jù)的時候,別人不會去寫自己所讀的數(shù)據(jù);
- 悲觀鎖就剛好相反,覺得自己讀數(shù)據(jù)庫的時候,別人可能剛好在寫自己剛讀的數(shù)據(jù),其實就是持一種比較保守的態(tài)度;
- 時間戳就是不加鎖,通過時間戳來控制并發(fā)出現(xiàn)的問題。
- 悲觀鎖就是在讀取數(shù)據(jù)的時候,為了不讓別人修改自己讀取的數(shù)據(jù),就會先對自己讀取的數(shù)據(jù)加鎖,只有自己把數(shù)據(jù)讀完了,才允許別人修改那部分?jǐn)?shù)據(jù),或者反過來說,就是自己修改某條數(shù)據(jù)的時候,不允許別人讀取該數(shù)據(jù),只有等自己的整個事務(wù)提交了,才釋放自己加上的鎖,才允許其他用戶訪問那部分?jǐn)?shù)據(jù)。
- 樂觀鎖就比較簡單了,就是不做控制,這只是一部分人對于并發(fā)所持有的一種態(tài)度而已。
- 時間戳就是在數(shù)據(jù)庫表中單獨加一列時間戳,比如“TimeStamp”,每次讀出來的時候,把該字段也讀出來,當(dāng)寫回去的時候,把該字段加1,提交之前 ,跟數(shù)據(jù)庫的該字段比較一次,如果比數(shù)據(jù)庫的值大的話,就允許保存,否則不允許保存,這種處理方法雖然不使用數(shù)據(jù)庫系統(tǒng)提供的鎖機(jī)制,但是這種方法可以大大提高數(shù)據(jù)庫處理的并發(fā)量,因為這種方法可以避免了長事務(wù)中的數(shù)據(jù)庫加鎖開銷(操作員A 和操作員B操作過程中,都沒有對數(shù)據(jù)庫數(shù)據(jù)加鎖),大大提升了大并發(fā)量下的系 統(tǒng)整體性能表現(xiàn)。
- 悲觀鎖所說的加“鎖”,其實分為幾種鎖,分別是:排它鎖和共享鎖,其中排它鎖又稱為寫鎖,共享鎖又稱為讀鎖
5. 視圖
- 視圖是一種虛擬的表,具有和物理表相同的功能??梢詫σ晥D進(jìn)行增,改,查,操作,試圖通常是有一個表或者多個表的行或列的子集。對視圖的修改不影響基本表。它使得我們獲取數(shù)據(jù)更容易,相比多表查詢。
- 只暴露部分字段給訪問者,所以就建一個虛表,就是視圖。
- 查詢的數(shù)據(jù)來源于不同的表,而查詢者希望以統(tǒng)一的方式查詢,這樣也可以建立一個視圖,把多個表查詢結(jié)果聯(lián)合起來,查詢者只需要直接從視圖中獲取數(shù)據(jù),不必考慮數(shù)據(jù)來源于不同表所帶來的差異
6. 索引
- 索引是對數(shù)據(jù)庫表中一或多個列的值進(jìn)行排序的結(jié)構(gòu),是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
- 你也可以這樣理解:索引就是加快檢索表中數(shù)據(jù)的方法。數(shù)據(jù)庫的索引類似于書籍的索引。在書籍中,索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息。在數(shù)據(jù)庫中,索引也允許數(shù)據(jù)庫程序迅速地找到表中的數(shù)據(jù),而不必掃描整個數(shù)據(jù)庫。

更多建議: