数据库设计总结
1.什么是數據庫設計
數據庫設計就是根據業務的具體需求,結合我們所選用的DBMS,為這個業務系統造出最優的數據存儲模型、
并建立好數據庫中的表結構及表與表之間的關聯關系的過程。讓它有效的對應用系統中的數據進行存儲,并可以
高效的對已經存儲的數據進行訪問。
2.為什么要進行數據庫設計
? 1.減少數據冗余2.避免數據維護異常3.節約存儲空間3.高效訪問
3.分析需求
以電商為例子? 核心模塊? 用戶模塊,商品模塊,訂單模塊,購物車模塊,供應商模塊。
用戶模塊
包括的屬性:用戶名,密碼,電話,郵箱,身份證號,地址,姓名,昵稱。。。。。
唯一標識屬性:用戶名,身份證,電話
存儲特點:隨時間增加逐漸增加,但是需要永久儲存
商品模塊
包括屬性:商品編碼,商品名稱,描述,類,重量,有效期,價格。。。。。。
唯一:編碼
存儲特點:對下線的商品可以歸檔存儲,不能刪除,因為購物車或者訂單里面還有該商品
訂單
屬性:訂單號,用戶名,電話,收貨地址,商品。。。。。
唯一標識:訂單號
存儲特點:永久存儲(分表,分庫)
購物車模塊
屬性:用戶名,商品編號,價格,描述,分類,加入時間,數量。。。
唯一標識:用戶名,編號,加入時間
存儲特點:不用永久存儲,設置歸檔,清理規則
4.邏輯設計(ER圖)
關系:一個關系通常就是一張表
元組:表中的一行即為一個元組
屬性:表中的一列即為一個屬性;每一個屬性都有一個名稱,成為屬性名
候選碼:表中的某個屬性組,它可以唯一確定一個元組
主碼:一個關系有多個候選碼,炫動其中一個為主碼
域:屬性的取值范圍
分量:元組中的一個屬性值
5.*******設計范式概要
操作異常:
1.插入異常:如果實體隨著另一個實體存在而存在,即缺少某一個實體時無法表示這個實體,那么這個表就存在插入異常
2.更新異常:如果更改表所對應的某個實體實例的單獨屬性時,需要將多行跟新,那么就說這個表存在更新異常
3.刪除異常:如果刪除表的某一行來反映某實體實例失效時導致另一個不同的實體實例信息丟失
數據冗余:是指數據在多個地方存在,或者說表中的某個列可以有其他列計算得到,這樣表中存在在數據冗余
主要有第一范式 第二范式,第三范式,BC范式
第一范式:數據表中的字段都是單一屬性,不可再分的,這個單一屬性是由基本的數據類型所構成的。簡單地說:第一范式要求數據庫中表都是二維表
?
第二范式:數據庫的表中不存在非關鍵字段對任一候選關鍵字段的不分函數依賴,簡單地說:所有單關鍵字段的表都符合第二范式。
? ? ? ??
第三范式:第三范式存在第二范式基礎之上定義的,如果數據表中不存在非關鍵字段,對任一候選關鍵字段的傳遞函數依賴則符合第三范式
BC范式:在第三范式的基礎上,數據庫表中如果不存在任何字段對任一候選關鍵字段的傳遞函數依賴則符合BC范式,也就是說如果是復合關鍵字,則復合關鍵字之間也不能存在函數依賴關系。
?
?
6.物理設計
1.選擇合適的數據庫管理系統
常見的DBMS:Oracle和SQLServer(只支持windows,適用于.net開發,erp系統)屬于商業數據庫(常用于企業級項目),MySQL和PgSQL是開源數據庫(常用于互聯網項目)
Oracel適用于大的事務操作。
MySQL的存儲引擎:
?
2.定義數據庫,表及字段的名稱規范
英文,顧名思義
3.根據所選的DBMS系統選擇合適的字段類型
?
1.數據查詢比較:同樣的數據,字符串處理比數字慢**
2.數據庫中,數據處理以頁為單位,列長度越小,利于性能提升****
例如char和varchar如何選擇
1.如果列中要存儲的數據長度差不多是一致的。則選擇char
2.如果列中最大數據長度小于50byte,則用char(如果列很少用,基于節省空間和減少I/O的考慮,還是可以考慮varchar)
decimal和float的選擇
1.decimal用于存儲精確數據,而float只能用于存儲非精確數據
2.由于float的存儲空間開銷一般比decimal小(精確到7位數只需要4byte,精確到15位也只有8byte)優先選擇float
時間類型
1.int存儲時間字段的優缺點
優點:字段長度比datetime小
缺點:使用不方便,要進行轉換
限制:只能存儲到2.38-1-19? 2147483648=2^32
2.需要存儲的時間粒度
年 月 日 小時 分 秒 周
如何選擇主鍵
1.區分業務主鍵和數據庫主鍵
業務逐漸標識業務數據,進行表與表的關聯;數據庫主鍵則是為了優化數據存儲(innodeb會生成6個字節的隱含主鍵)
2.跟數據庫的類型,考慮主鍵是否順序增長
有些數據庫是按主鍵的順序邏輯存儲的
3.主鍵的字段類型所占空間盡可能的小
對于使用聚集索引范式存儲的表,每個索引后都會附加主鍵信息
?
避免使用外鍵約束
1.降低數據導入的效率
2.增加維護成本
3.雖然不建議使用外鍵約束,但是相關聯的列上一定要建立索引
避免使用觸發器
1.降低數據導入的效率
2.可能會出現意想不到的數據異常
3.使業務邏輯變得復雜
預留字段
1.無法準確的知道預留字段的類型
2.無法準確的知道預留字段中所存儲的類容
3.后期維護預留字段索要的成本,同增加一個字段所需要的成本相同
4.嚴禁使用預留字段
4.反范式化設計
針對范式化而言,為了性能和讀取效率的考慮而適當的對第三范式的要求進行違反,允許存在少量的數據冗余
空間換時間的操作
ex:符合范式的設計
反范式化的設計:
?
?
?7.維護和優化
1..維護數據字典
1.第三方工具維護
2.利用數據庫本身的備注字段來維護數據字典。以mysql為列子
CREATE TABLE customer(
cust_id INT AUTO_INCHREMENT NOT NULL COMMENT '自增ID'
cust_name VACHAR(10) NOT NULL COMMENT '客戶姓名'
PRIMARY KEY (cust_id)
)COMMENT'客戶表'
2.維護索引
1.出現在WHERE從句GROUP BY從句,ORDER by從句中的列
2.可選擇性高的列要放到索引的前面
3.索引中不要包括太長的數據類型
1.索引不是越多越好,過多的索引會降低寫效率還會降低讀效率
2.定期維護索引碎片
3.在SQL語句中不要使用強制索引關鍵字
3.維護表結構
1.使用在線變更表結構的工具
MYSQL5.5之前可以使用pt-online-schema-change
MYSQL5.6之后本身支持在線表結構的變更
2.同時對數據字典進行維護
3.控制表的寬度和大小
數據庫中適合的操作
1.批量操作VS逐條操作
2.禁止使用Select*這樣的查詢
3.控制用戶自定義函數
4.不要使用數據庫中的全文索引
4.在適當的時候對標進行水平拆分和垂直拆分
? 垂直拆分
1.經常一起查詢的列放在一起
2.text,blob等大字段拆分出道附加表中
水平拆分
?
?
??
轉載于:https://www.cnblogs.com/bigyuanzi/p/9377583.html
總結
- 上一篇: git的团队协作开发
- 下一篇: AE教程:学会这个,你做的Logo就可以