數據庫範式
先說明範式中涉及兩個索引概念:主鍵和複合主鍵。
- 主鍵: 創建表時可以不設置主鍵 , 但是沒有設置主鍵的表 ,底層會認爲所有的鍵都是主鍵 ,所以在創建時使用了所有的字段創建索引 , 在查詢時索引的存在幾乎沒有意義 。
- 複合主鍵: 兩個或兩個以上的字段作爲評價一條數據記錄的唯一性標誌 。
第一範式:
- 確保每一列的原子性(列不可再分):保證數據表中每個字段都是不可再分的最小數據單元,則滿足第一範式(一般關係型數據庫都遵循第一範式原則)。例如:address地區表,包含字段id,address
原則上,該表address字段還可以再繼續拆分成下表,
但是最終還是得根據用戶需求來設計,所以兩表都可以說是遵循第一範式原則。
第二範式:
- 在第一範式的基礎上,確保表中的非主鍵的每列完全依賴於主鍵:是指每個表必須有且僅有一個數據元素爲主鍵(Primary key),其他數據元素與主關鍵字一一對應。換而言之,如果數據表中只有一個主鍵,則都符合第二範式原則。
貨物類型 | 貨物ID | 貨物名稱 |
瓷碗 | 1 | 白色瓷碗 |
瓷碗 | 2 | 青花瓷碗 |
瓷碗 | 3 | 雕花瓷碗 |
三合板 | 1 | 普通三合板 |
在該表中的主鍵依然是(貨物類型、貨物ID),非主鍵字段“貨物名稱”,完全依賴於這兩個主鍵,那麼我們就可以說,該表是符合數據庫第二範式的。
第三範式:
- 在第二範式的基礎上更進一步,目標是確保表中的列都和主鍵直接相關,而不是間接相關:一個數據表中不包含 其他數據表中的非主鍵字段
不符合第三範式例子:
學生表ID | 學生 | 所在院系 | 院系地址 |
1 | 張三 | 計算機系 | 行政樓1號 |
2 | 李四 | 數學系 | 行政樓2號 |
3 | 王五 | 計算機系 | 行政樓1號 |
符合第三範式例子:
學生表ID | 學生 | 院系ID |
1 | 張三 | 1 |
2 | 李四 | 2 |
3 | 王五 | 1 |
院系表ID | 所在院系 | 院系地址 |
1 | 計算機系 | 行政樓1樓 |
2 | 數學系 | 行政樓2樓 |
反範式:
- 通過增加冗餘或重複的數據來提高數據庫的讀性能(以內存換時間)。例如,學生表中的“所在院系”字段,本來應該通過關聯院系表再進行查詢的,實際情況綜合考慮後,想節省關聯查詢的時間成本不惜付出數據冗餘的內存成本爲代價,使用了反範式原則。
學生表ID | 學生 | 院系ID | 所在院系 |
1 | 張三 | 1 | 計算機系 |
2 | 李四 | 2 | 數學系 |
3 | 王五 | 1 | 計算機系 |
院系表ID | 所在院系 | 院系地址 |
1 | 計算機系 | 行政樓1樓 |
2 | 數學系 | 行政樓2樓 |
優點與缺點:
範式的優點:更新數據快,重複數據少,修改數據少,表很小可以在內存中執行,查詢時需要更少的distinct或group by
範式的缺點:查詢時需要更多的關聯,可能引起索引策略無效
反範式的優點:所有的數據可以在一張表上顯示,可以避免關聯,可以設計有效的索引
反範式的缺點:冗餘字段較多,刪除記錄會造成有用數據丟失