1. 程式人生 > >六天帶你玩轉mysql資料庫--第三天筆記(中)

六天帶你玩轉mysql資料庫--第三天筆記(中)

索引:

幾乎所有的索引都是建立在欄位之上。
索引:系統根據某種演算法將已有的資料(未來可能新增的資料),單獨建立一個檔案,檔案能夠實現快速的匹配資料,
並且能夠快速的找到對應表中的記錄。索引的意義在於:
1.提升查詢資料的效率
2.約束資料的有效性(唯一性等)
增加索引有前提條件:索引本身會產生索引檔案(有時候可能比資料檔案還大),會非常消耗磁碟空間。
如果某個欄位需要作為查詢的條件經常使用,那麼可以使用索引;
如果某個欄位需要進行資料的有效性約束,也可能使用索引(主鍵,唯一鍵等)

mysql裡面提供了很多索引:

1.主鍵索引:primary    key
2.唯一索引:unique    key
3.全文索引:fulltext    key
4.普通索引:index

全文索引:

全文索引:針對文章內部的關鍵字進行索引,全文索引最大的問題在於如何確定關鍵字,英文單詞很容易,英文單詞
與單詞之間有空格,中文很難沒有空格,而且中文可以各種隨意組合。(分詞:sphinx)

關係:

將實體與實體的關係,反映到最終資料庫表的設計上來:將關係分為三種:一對一,一對多(多對一)和多對多。所有的
關係都是表與表之間的關係。
一對一:一張表的一條記錄一定只能與另外一張表的一條記錄進行對應:反之亦然。
例如:學生表:姓名,性別,年齡,身高,體重,婚姻狀況,籍貫,家庭住址,緊急聯絡人。可以設計成如下方式

在這裡插入圖片描述

表設計成以上的這種形式符合要求,但是姓名,性別,年齡,身高,體重屬於常用資料;但是婚姻,籍貫,地址
和聯絡人屬於不常用資料,如果每次查詢都是查詢所有資料,不常用的資料就會影響效率,實際又不用。
解決方案:將常用的和不常用的資訊分離儲存,分成兩張表。

在這裡插入圖片描述

但是存在沒辦法匹配的問題,保證不常用資訊與常用資訊一定能夠對應上,找一個具有唯一性(確定記錄)的欄位來共同連線兩張表

一個常用表中的一條記錄:永遠只能在一張不常用表中匹配一條記錄,反過來,一個不常用表中的一條記錄在常用表中也只能
匹配一條記錄,一對一的關係。

在這裡插入圖片描述

一對多:

一對多:一張表中有一條記錄可以對應另外一張表中的多條記錄,但是返回過,另外一張表的一條記錄只能對應第一張表中的
一條記錄,這種關係就是一對多或者多對一。
例如:母親與孩子的關係:母親和孩子兩個實體
以下關係:一個媽媽可以在孩子表中找到多條記錄(也有可能是一條),但是一個孩子只能找到一個媽媽,是一種典型的一對多的關係

在這裡插入圖片描述

但是以上設計:解決了實體的設計表問題,但是沒有解決關係問題;媽媽找不到孩子,孩子也找不到媽媽。
解決方案:在某一張表中增加一個欄位,能夠找到另外一張表中的記錄,應該在孩子表中增加一個欄位指向媽媽
表,因為孩子表的記錄只可以匹配到一條媽媽表的記錄。

在這裡插入圖片描述

多對多:

多對多:一張表中(A)中的一條記錄可以對應另外一張表中的(B)的多條記錄,反之也成立。
例如:老師教學:老師和學生

在這裡插入圖片描述

以上設計方案:實現了實體的設計,但是沒有維護實體的關係。
因為一個老師教過很多學生,一個學生有很多老師。
解決方案:在哪張表中增加欄位,都會出現一個欄位儲存多個數據。而且是與其他表有關聯,不符合表設計規範,增加一張
新表,專門維護兩者的關係。增加中間表之後:中間表與老師形成了一對多的關係,而且中間表是多表,維護了唯一找到一
表的關係。同樣的學生表與中間表是一對多的關係,一對多的關係可以匹配到關聯表之間的資料。
學生找老師:找出學生ID--> 中間表尋找匹配記錄(多條)-->老師表匹配(一條)
老師找學生:找出老師ID--> 中間表尋找匹配記錄(多條)-->學生表匹配(一條)

在這裡插入圖片描述

正規化:

正規化:Nomal Format,是一種離散數學中的為了解決一種資料的儲存與優化的問題的知識,儲存資料的儲存之後,凡是能夠通過
關係尋找出來的資料,堅決不再重複儲存,終極目標是減少資料的冗餘。
正規化是一種分層結構的規範,分為六層,每一層都比上一層嚴格,若要滿足下一層正規化,前提是滿足上一層正規化。
六層正規化:1NF,2NF,3NF..6NF,1NF是最底層要求最低的,6NF是在最高層,要求也是最嚴格的。
MYSQL屬於關係型資料庫,有空間浪費也是致力於節省儲存空間,與正規化所有解決的問題不謀而合;在設計資料庫的時候,會利用
到正規化來指導設計。但是資料庫不只要解決空間問題要保證效率問題。正規化只為了解決空間問題,所以資料庫的設計又不能完全按照
正規化的要求來做,所以一般情況下只有前三種正規化需要滿足,滿足3NF即可。
正規化在資料庫的設計當中是有指導意義,但不是強制規範。

1NF:第一正規化

第一正規化:在設計表儲存資料的時候,如果表中設計的欄位儲存的資料,在取出來使用之前還需要額外的處理(拆分),那麼
說表的設計不滿足第一正規化,第一正規化要求所有欄位的資料具有原子性,不可以再次拆分。

2NF:第二正規化

第二正規化:是指在資料表設計的過程中如果有複合主鍵(多欄位主鍵),且表中有欄位並不是由整個主鍵來確定,而是依賴
主鍵中的某個欄位(主鍵的某個部分),存在欄位依賴主鍵的部分的問題稱之為部分依賴,第二正規化 就是要解決不允許出現
部分依賴。

3NF:

要滿足第三正規化,必須滿足第一和第二正規化,第三正規化理論上講,應該一張表中的所有欄位應該直接依賴於主鍵(邏輯主鍵:
代表的是業務主鍵,邏輯主鍵除外),如果表設計中存在一個欄位並不直接依賴主鍵,而是通過某個非主鍵欄位依賴,最終
實現依賴主鍵,把這種不是直接依賴主鍵而是通過依賴非關鍵欄位的依賴關係稱為傳遞依賴,第三正規化就是來解決傳遞依賴的
問題。

正規化(逆規範化):

有時候在設計表的時候,如果一張表中有幾個欄位需要分別向其他表中去獲取資訊,理論上講的確可以獲取到指定的資訊,但是
效率相對低下,會刻意的在某些表中,不去儲存另外表的主鍵(邏輯主鍵),而是直接儲存想要的資料,這樣一來,在查詢資料
的時候,一張表可以直接提供資料,而不需要多表查詢(效率低),但是會導致資料冗餘增加。
逆規範化:磁碟利用率與效率的對抗。