第一章 需求分析
設計簡介
根據業務需要,結合選用的DBMS,設計出最有的數據存儲模型並建立好數據庫中的表結構及表與表之間的關係使之有效的存儲和高效的訪問。
在系統設計開始就應該對數據庫進行良好的設計,這樣才能保證以後對業務發展的需要進行改進,保證系統的穩定性。
設計步驟
需求分析:數據庫需求的作用點(數據是什麼,數據有哪些屬性,數據屬性的特點)
邏輯設計:用ER圖進行建模
物理設計:選擇數據庫管理系統,根據數據庫自身的特點把邏輯設計轉換爲物理設計
維護優化:對新需求進行見表,索引優化,大表拆分
需求分析重要性
1、瞭解系統中所要存儲的數據
2、瞭解數據存儲的特點
3、瞭解數據的生命週期
需要了解的問題:
實體與實體之間的關係(一對一,一對多,多對多)
實體所包含的屬性
哪些屬性或屬性的組合可以唯一標識一個實體
實例:小型電子商務網站
模塊:用戶模塊,商品模塊,訂單模塊,購物車模塊,供應商模塊
用戶模塊:用於記錄註冊用戶信息
包括屬性:用戶名、密碼、電話、郵箱、身份證號、地址、姓名、暱稱
可選唯一標識屬性:用戶名、身份證、電話
存儲特點:隨系統上線時間逐漸增加,需要永久存儲
商品模塊:用於記錄網站中所有銷售的商品信息
包括屬性:商品編碼、商品名稱、商品描述、商品品類、供應商名稱、重量、有效期、價格。。。
可選唯一標識屬性:(商品名稱、供應商名稱)組合、(商品編碼)
存儲特點:對於下線商品可以歸檔存儲
訂單模塊:用於用戶訂購商品的信息
包括屬性:訂單號、用戶姓名、用戶電話、收貨地址、商品編號、商品名稱、數量、價格、訂單狀態、支付狀態、訂單類型。。。
可選唯一標識屬性:訂單號
存儲特點:永久存儲(分表、分庫存儲)
購物車模塊:用於 保存用戶購物時選擇的商品
包括屬性:用戶名、商品編號、商品名稱、商品價格、商品描述、商品分類、加入時間、商品數量。。。
可選唯一標識:(用戶名、商品編號、加入時間)、(購物車編號)
存儲特點:不用永久存儲(設置歸檔、清理規則)
供應商模塊:用於保存所銷售商品的供應商信息
包括屬性:供應商編號、供應商名稱、聯繫人、電話、營業執照號、地址、法人。。。
可選唯一標識:(供應商編號),(營業執照號)
存儲特點:永久存儲
第二章 邏輯設計
E-R圖
邏輯設計是做什麼的
1、將需求轉化爲數據庫的邏輯模型
2、通過E-R圖的形式對邏輯模型進行展示
3、同所選用的具體的DBMS系統無關
名詞解釋
關係:一個關係對應通常所說的一張表
元組:表中的一行即爲一個元組
屬性:表中的一列即爲一個屬性;每一個屬性都有一個名稱,稱爲屬性名
候選碼:表中的某個屬性組,它可以確定一個元組
主碼:一個關係有多個候選碼,選定其中一個爲主碼
域:屬性的取值範圍
分量:元組中的一個屬性值
設計範式概要
什麼是數據庫設計範式
常見的數據庫設計範式包括:第一範式,第二範式,第三範式,BC範式,第四、第五範式
這也是目前我們大多數數據庫設計所要遵循的範式
數據操作異常及數據冗餘
操作異常:
插入異常:如果某實體隨着另一個實體的存在而存在,即缺少某個實體時無法表示這個實體,那麼這個表就存在插入異常
更新異常:如果更改表所對應的某個實體實例的單獨屬性時,需要將多行更新,那麼就說這個表存在更新異常。
刪除異常:如果刪除表中的某一行來反應某實體實例,失效時導致另一個不同實體實例信息丟失,那麼這個表中就存在刪除異常。
數據冗餘:
是指相同的數據在多個地方存在,或者說表中的某個列可以由其他列計算得到,這樣就說表中存在着數據冗餘。
第一範式(1NF):
定義:數據庫表中的所有字段都是單一屬性,不可再分的。這個單一屬性是由基本的數據類型所構成的,如整數,浮點數,字符串等;
換句話說 第一範式要求數據庫中的表都是二維表。
第二範式(2NF)
定義:數據庫中的表中不存在非關鍵字段對任一候選關鍵字段的部分函數依賴。
部分函數依賴是指存在着組合關鍵字中的某一關鍵字決定非關鍵字的情況。
換句話說:所有單關鍵字段的表都符合第二範式
由於供應商和商品之間是多對多的關係,所以只有使用商品名稱和供應商名稱纔可以唯一標識出一件商品。也就是商品名稱和供應商名稱是一組組合關鍵字。
上表中存在以下的部分函數依賴關係
(商品名稱)->(價格,描述,重量,商品有效期)
(供應商名稱)->(供應商電話)
存在的問題:插入異常、刪除異常、更新異常、數據冗餘
第三範式(3NF)
定義:第三範式是在第二範式的基礎上定義的,如果數據表中不存在非關鍵字段,對任意候選關鍵字段的傳遞函數依賴則符合第三範式。
存在以下傳遞函數依賴關係:
(商品名稱)->(分類)->(分類描述)
也就是說存在非關鍵字段“分類描述”
對關鍵字段“商品名稱”的傳遞函數依賴
存在問題:(分類,分類描述)對於每一個商品都會進行記錄,所以存在着數據冗餘。同時也存在着數據的插入,更新及刪除異常
BC範式
Boyce.Codd範式(BCNF)
定義:在第三範式的基礎上,數據庫表中如果不存在任何字段對任一候選關鍵字段的傳遞函數依賴則符合BC範式。
也就是說如果是複合關鍵字,則複合關鍵字之間也不能存在函數依賴關係。
(以商品同供應商的關係表來說明BCNF)
假定:供應商聯繫人只能受僱於一家供應商,每家供應商可以供應多個商品,則存在如下決定關係:
(供應商,商品ID)->(聯繫人,商品數量)
(聯繫人,商品ID)->(供應商,商品數量)
存在下列關係因此不符合BCNF要求:
(供應商)->(供應商聯繫人)
(供應商聯繫人)->(供應商)
並且存在數據操作異常及數據冗餘
第三章 物理設計
物理設計要做什麼
1、選擇合適的數據庫管理系統
2、定義數據庫、表及字段的命名規範
3、根據所選的DBMS系統選擇合適的字段類型(效率,功能,需求)
4、反範式化設計(冗餘)
選擇哪種數據庫
成本、版權、功能(性能)、操作系統、開發語言、應用場景
mysql常用的存儲引擎
開源數據庫,只要符合mysql存儲協議,任何人都可以開發存儲引擎
主要使用Innodb存儲引擎
表及字段的命名規範
所有對象命名應該遵循下述原則:
1、可讀性原則:使用大寫和小寫格式化的庫對象名字已獲得良好的可讀性。
例如:使用CustAddress而不是custaddress來提高可讀性。
(這裏要注意有些DBS系統對錶名的大小寫是敏感的)
2、表意性原則:對象的名字應該能夠描述它所標識的對象。
例如:對於表,表的名稱應該能夠體現表中存儲的數據內容;
對於存儲過程,存儲過程名稱應該能夠體現存儲過程的功能。
3、長名原則:儘可能少使用或者不使用縮寫,適用於數據庫(DATABASE)名之外的任一對象。
字段類型選擇原則
列的數據類型一方面影響數據存儲空間的開銷,另一方面也會影響數據查詢性能。當一個列可以選擇多種數據類型時,應該優先考慮數字類型,其次是日期或者二進制類型,最後是字符類型。對於相同級別的數據類型,應該優先選擇佔用空間小的數據類型。
如何具體選擇字段類型
char與varchar如何選擇
原則:
1、如果列中要存儲的數據長度差不多是一致的,則應該考慮用char;否則應該考慮用varchar。
2、如果劣種的最大數據長度小於50Byte,則一般也考慮用char。
3、一般不宜定義大於50Byte的char類型列。
utf8每個字符佔三個字節
decimal與float類型如何選擇
原則:
1、decimal用於存儲精確數據,而float只能用於存儲非精確數據。
2、由於float的存儲空間開銷一般比decimal小(精確到7位小數只需要4個字節,而精確到15位小數只需要8字節)故非精確數據優先選擇float類型。
數據庫設計的其他注意事項
時間類型存儲:
1、使用int來存儲時間字段的優缺點
優點:字段長度比datetime小。
缺點:使用不方便,要進行函數轉換。
限制:只能存儲到2038-1-19 11:14:07即2^32爲2147483648
2、需要存儲的時間粒度
年 月 日 時 分 秒 周
數據庫設計其他注意事項
如何選擇主鍵
1、區分業務主鍵和數據庫主鍵,業務主鍵用於標識業務數據,進行表與表之間的關聯;數據庫主鍵爲了優化數據存儲(Inoodb會生成6個字節的隱含主鍵)
2、根據數據庫的類型,考慮主鍵是否要順序增長,有些數據庫是按主鍵的順序邏輯存儲的
3、逐漸的字段類型所佔空間要儘可能的小,對於使用聚集索引方式存儲的表,每個索引後都會附加主鍵信息。
避免使用外鍵約束
1、降低數據導入的效率
2、增加維護成本
3、雖然不建議使用外鍵約束,但是相關聯的列上一定要建立索引
避免使用觸發器
1、降低數據導入的效率
2、可能會出現意想不到的數據異常。
3、使業務邏輯變得複雜
關於預留字段
1、無法準確的知道預留字段的類型。
2、無法準確的知道預留字段中所存儲的內容。
3、後期維護預留字段所需要的成本,同增加一個字段所需要的成本是相同的。
4、嚴禁使用預留字段
反範式化表設計
什麼是反範式化
反範式化是針對範式化而言的,所謂的反範式化就是爲了性能和讀取效率的考慮而適當的對第三範式的要求進行違反,而允許存在少量的數據冗餘。換句話說反範式化就是使用空間來換取時間。
爲什麼反範式化
1、減少表的關聯數量
2、增加數據的讀取效率
3、反範式化一定要適度
第四章 維護和優化
維護和優化要做什麼
1、維護數據字典
2、維護索引
3、維護表結構
4、在適當的時候對錶進行水平拆分或垂直拆分
如何維護數據字典
1、使用第三方工具對數據字典進行維護
2、利用數據庫本身的備註字段來維護數據字典。以mysql爲例
CREATE TABLE costomer(
cust_id INT AUTO_INCREMENT NOT NULL COMMENT '自增ID',
cust_name VARCHAR(10) NOT NULL COMMENT '客戶姓名',
PRIMARY KEY (cust_id)
) COMMENT '客戶表'
3、導出數據字典
SELECT
a.table_name,b.TABLE_COMMENT,a.COLUMN_NAME,
a.COLUMN_TYPE,a.COLUMN_COMMENTFROM
information_schema.COLUMENS a JOIN information_schema.
TABLE b ON a.table_schema=b.table_schema AND
a.table_name=b.table_name
WHERE a.table_name='customer'
如何維護索引
如何選擇合適的列建立索引?
1、出現在WHERE從句,GROUP BY 從句,ORDER BY 從句中的列
2、可選擇性高的列要放到索引的前面
3、索引中不要包括太長的數據類型
注意事項
1、索引並不是越多越好,過多的索引不但會降低寫效率,而且會降低讀的效率
2、頂起維護索引碎片
3、在SQL語句中不要使用強制索引關鍵字
數據庫中適合的操作
如何維護表結構
注意事項:
1、使用在線變更表結構的工具
MySql5.5之前可以使用pt-online-schema-change
MySql5.6之後本身支持在線表結構的變更
2、同時對數據字典進行維護
3、控制表的寬度和大小
數據庫中適合的操作
1、批量操作VS逐條操作
2、禁止使用SELECT *這樣查詢
3、控制使用用戶自定義函數
4、不要使用數據庫中的全文索引