數據庫結構優化的目的
- 減少數據冗餘
- 儘量避免數據維護中出現更新,插入和刪除異常
插入異常:表中的某個實體隨着另一個實體而存在
更新異常:如果更改表中的某個實體的單獨屬性時,需要對多行進行更新
刪除異常:如果刪除表中的某一實體則會導致其它實體的消失
- 節約數據空間
- 提高查詢效率
數據庫結構設計的步驟
- 需求分析
1. 全面瞭解產品設計的存儲需求
2. 存儲需求
3. 數據處理需求
4. 數據的安全性和完整性
- 邏輯設計
1. 設計數據的邏輯與存儲結構
2. 數據實體之間的邏輯關係,解決數據冗餘和數據維護異常
- 根據所使用的數據庫特點進行表結構設計
- 維護優化
根據實際情況對索引,存儲結構等進行優化
範式
一般滿足前三個範式
第一範式
1. 數據庫表中所有字段都只有單一屬性
2. 單一屬性的列是由基本的數據類型所構成的
3. 設計出來的表都是簡單的二維表
第二範式
要求一個表中只具有一個業務主鍵,也就是說符合第二範式的表中不能存在非主鍵列只對部分主鍵的依賴關係
第三範式
指每一個非主屬性即不部分依賴也不傳遞依賴於業務主鍵。在第二範式的基礎上消除了非主屬性對主鍵的傳遞依賴
字段數據類型設計
首先考慮數字類型,其次是日期或二進制類型,最後是字符類型。
列類型 | 存儲空間 | 是否精確類型 |
---|---|---|
float | 4個字節 | 否 |
double | 8個字節 | 否 |
decimal | 每4個字節存9個數字,小數點佔一個字節 | 是 |
varchar 最大長度(65535)
varchar
1. varchar用於存儲變長字符串,只佔用必要的存儲空間
2. 列的最大長度小於255則只佔用一個額外字節用於記錄字符串長度
3. 列的最大長度大於55則要使用兩個額外字節用於記錄字符串長度
varchar 長度的選擇問題
1. 使用最小的符合需求的長度
2. varchar(5) 和 varchar(200)存儲 'abcde'字符串性能不同
varchar 適用場景
1. 字符串列的最大長度比平均長度大很多
2. 字符串很少被更新
3. 使用了多字節字符集存儲字符串
char
char
1. char類型是定長的
2. 字符串存儲在char類型的列中會刪除末尾的空格(varchar不會刪除)
3. char類型的最大寬度爲255
適合場景
1. 適合存儲索長度近似的值
2. 適合存儲短字符串
3. 適合存儲經常被更新的字符串列
日期類型
datatime類型
datetime = YYYY-MM-DD HH:II:SS
datetime(6) = YYYY-MM-DD HH:II:SS.fraction
datetime 類型與時區無關,佔用8個字節的存儲空間
時間範圍 1000-01-01 00::00:00 到 9999-12-31 23:59:59
TIMESTAMP類型
存儲時間戳(記得之前一直用varchar類型)
時間戳類型佔4個字節
時間範圍1970-01-01 到 2038-01-19
timestamp類型顯示依賴於所指定的時區
在行的數據修改時,可以自動修改timestamp列的值
date類型 YYYY-MM-DD
1. 佔用的字節比使用字符串、datetime、int存儲要少,使用date類型只需要3個字符串
2. 使用date類型還可以使用日期的時間函數進行日期之間的計算
時間範圍 1000-01-01 --- 9999-12-31
time類型 HH:MM:SS 可存儲微秒
存儲時間數據的注意事項
1. 不要使用字符串類型來存儲日期時間數據
1. 日期時間類型通常比字符串佔用的存儲空間小
2. 日期時間類型在進行查找過濾時可以利用日期來進行對比
3. 日期類型有着豐富的處理函數,可以方便的對時間類型進行日期計算
2. int存儲日期時間不如使用timestamp類型