數據庫設計學習筆記!數據庫
先謝慕課網。數據庫設計
什麼是數據庫設計?
數據庫設計就是根據業務系統的具體須要,結合咱們所選用的DBMS(數據庫管理系統),爲這個業務系統構造出最優的數據存儲模型。並建好數據庫中的表結構及表與表之間的關聯關係的過程。使之能有效地對應系統中的數據進行存儲,並能夠高效的對已經存儲的數據進行訪問。
NoSQL系統:Mongo/ Memcache/ Redis
爲何要進行數據庫設計?
優良的設計:
減小數據冗餘
避免數據維護異常
結構存儲空間
高效的訪問
糟糕的設計:
存在大量的數據冗餘
存在數據插入,更新,刪除異常
存在大量空間浪費
訪問數據低效
數據庫設計步驟
需求分析---->邏輯分析---->物理設計---->維護優化
需求分析:
數據是什麼?
術具備哪些屬性?
數據和屬性各自的特色有哪些?
邏輯設計:
主要是經過ER圖對數據庫進行邏輯建模
物理設計:
充分的考慮到每一種數據庫管理系統的特色;
根據數據庫自身的特色把邏輯設計轉換成物理設計
維護優化:
新的需求進行建表
索引優化
大表拆分
需求分析:
爲何要進行需求分析?
1.瞭解系統中所要存儲的數據
2.瞭解數據的存儲特色
3.瞭解數據的生命週期
實體及實體之間的關係(1對1,1對多,多對多)
實體所包含的屬性有什麼?
那些屬性或屬性的組合能夠惟一標識一個實體?
需求分析舉例(小型電子商務網站)
用戶模塊、商品模塊、訂單模塊、購物車模塊、供應商模塊
用戶模塊:
包括屬性;
可選惟一標識屬性
存儲特色:隨系統上線時間增長,須要永久保存
商品模塊:
存儲特色:對於下線商品能夠歸檔存儲
訂單模塊:
存儲特色:永久存儲
購物車模塊:
存儲特色:不用永久存儲(設置歸檔,清理規則)
供應商模塊:
存儲特色:隨系統上線時間增長,須要永久保存(數量可能有限制)
邏輯設計:
邏輯設計是作什麼的
1.將需求轉化爲數據庫的邏輯模型
2.經過ER圖的形式對邏輯模型進行展現
3.同所選的具體的數據庫管理系統無關
名詞解釋:
關係:一個關係對應一般所說的一張表
元組:表中的一行即爲一個元組
屬性:表中的一列即爲一個屬性;每個屬性都有一個名稱,成爲屬性名
候選碼:表中的某個屬性組,它能夠惟一肯定一個元組
主碼:一個關係有多個候選碼,選中其中一個爲主碼
域:屬性的取值範圍
份量:元組中的一個屬性值
設計範式概要:
常見的數據庫設計範式包括:
第一範式,第二範式,第三範式及BC範式
重點放在前三個範式上面;
數據操做異常及數據冗餘
插入異常、更新異常、刪除異常;
相同的數據在多個地方存在,或者某個列能夠有其餘列計算獲得,就是數據冗餘
第一範式:數據庫中的全部字段都是單一屬性,不可再分的。表都是二維表
第二範式:數據庫的表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴。
部分函數依賴是指存在着組合關鍵字中的某一關鍵字決定非關鍵字的情況。
第三範式:第三範式是在第二範式的基礎上定義的,若是數據表中不存在非關鍵字段對任意候選關鍵字段的傳遞函數依賴則符合第三範式。
BC範式:在第三範式的基礎之上,數據表中若是不存在任何字段對任一候選關鍵字段的傳遞函數依賴則符合BC範式。
物理設計:
物理設計要作什麼
1.選擇合適的數據庫管理系統;
2.定義數據庫、表以及字段的命名規範;
3.根據所算的DBMS系統選擇合適的字段類型;
4.反範式化的設計。
選擇那種數據庫?
Oracle、SQLsercer、MySQL、PgSQL
成本上:
Oracle和SQLServer屬於商業數據庫,須要考慮成本;
MySQL和PgSQL是開源數據庫
功能上:
Oracle功能比較強,事務處理好
因此使用的操做系統:
SQLServer只能在Windows上
開發所使用的語言:
PHP使用MySQL
應用的場景:
Oracle和SQLServer更適合企業級項目
MySQL和PgSQL適用於互聯網項目
MySQL經常使用的存儲引擎
MyiSAM 寫不多,讀不少可使用,讀寫都很頻繁不要使用
MRG_MYISAN 能夠把多個結構相同的MyiSAM表合併到一個表處理,不支持行級鎖,不支持事物,不適用於全局查到過多的場景
Innodb MySQL5.5以後MySQL默認的存儲引擎,支持事務,支持行級鎖,大多數場景均可以使用;讀寫也是很高效的;
Archive 也是行級鎖,適用於日誌這種場景,支持insert,select,須要隨機讀取,更新刪除的場景
Ndb cluster 要在使用MySQL集羣的場景下才可使用
主要使用、建議Innodb,相比來講是一個比較好的選擇
表及字段的命名規範:
1.可讀性原則
2.表意性原則
3.長命原則(儘可能不要使用縮寫)
字段類型選擇:
列的數據類型一方面影響數據存儲空間的開銷,另外一方面也會影響數據查詢性能。當一個列能夠選擇多種數據類型時,應該優先考慮數字類型,其次是日期和二進制類型,最後是字符串類型。對於相同級別的數據類型,優選選擇佔用空間小的數據類型。
TINYINT-->SMALLINT-->MIDIUMINT-->INT-->BINGINT-->DATE-->DATETIME-->TIMESTAMP-->CHAR(M)-->VARCHER(M)
在對數據進行操做時,一樣的數據,字符處理每每比數字處理慢。
數據庫中數據處理是以頁爲單位,MySQL在Innodb中16k一頁;
數據庫最大的瓶頸是磁盤的I/O瓶頸。
char與varchar如何選擇:
原則:
1.若是列中要存儲的長度差很少是一致的,應該考慮使用char,好比電話號
2.若是列中的最大數據長度小於50Byte,通常考慮用char
3.通常不宜定義大於50Byte的char類型類。
decimal和float如何選擇:
原則:
1.decimal適用於存儲精確數據,而float只能用於存儲非精確數據;
2.因爲float的存儲空間開銷通常比decimal小,因此非精確的數據優先選擇float類型。
時間類型如何存儲:
1.int長度、其使用不方便、限制
2.須要存儲的時間粒度
數據庫設計的其餘注意:
如何選擇主鍵:
1.區分業務主鍵和數據庫主鍵
業務主鍵用於表示業務數據,進行表與表之間的關聯;
數據庫主鍵爲了優化數據存儲
2.根據數據庫的類型,考慮主鍵是否要順序增加
3.轉的字段類型所佔空間要儘量的小
避免使用外鍵約束
1.下降數據導入的效率
2.增長維護成本
2.雖不建議使用外鍵約束,可是相關聯的列上必定要創建索引;
避免使用觸發器
1.下降數據導入的效率
2.可能會出現意想不到的數據異常
3.是業務邏輯表的複雜
嚴禁使用預留字段
反範式化設計:
反範式化是針對範式化而言的,爲了性能和讀取效率的考慮而是當的對第三範式的要求進行違反,而存在少許的數據冗餘,使用空間來換時間;
維護優化:
維護和優化要作些什麼:
1.維護數據字典
2.維護索引
3.維護表結構物
4.在適當的時候對錶進行水平拆分或垂直拆分
如何維護數據字典
information_schema表中的TABLES表和COLUMN表
如何維護索引
如何選擇合適的列創建索引?
1.出如今WHERE從句,GROUP BY從句,ORDER BY從句中的列
2.可選擇性高的列要放到索引的前面
3.索引中不要包括太長的數據類型
注意事項:
1.索引並非越多越好的,過多的索引不但會下降寫效率,並且會下降讀的效率;
2.按期維護索引碎片;
3.SQL中不要使用強制索引關鍵字。
如何維護表結構
1.使用在線變動表結構的工具;
2.同時對數據字典進行維護;
3.控制表的寬度和大小。
數據庫中適合的操做:
1.批量操做和逐條操做,批量操做好
2.禁止使用SELECT *這樣的查詢
3.控制用戶使用自定義函數
4.不要使用數據庫中的全文索引
表的垂直和水平拆分
垂直拆分:把一張表的列進行拆分
當咱們的需求變得愈來愈多,可能對列進行增長
一張表很是寬的時候,一頁中搜索的行數少。
1.常常一塊兒查詢的列放到一塊兒;
2.text、blod等大字段拆分到附加表中;
水平拆分:經過主鍵hash的方式拆分,取模。函數
2.瞭解數據的存儲特色
3.瞭解數據的生命週期
實體及實體之間的關係(1對1,1對多,多對多)
實體所包含的屬性有什麼?
那些屬性或屬性的組合能夠惟一標識一個實體?工具