什麼是數據庫設計?
簡單來講,數據庫設計就是根據業務系統的具體須要,結合咱們所選用的數據庫管理系統,爲這個系統構造出最優的數據存儲模型。並創建好數據庫中的表結構及表與表之間的關聯關係的過程。使之能有效的對應用系統中的數據進行存儲,並能夠高效對已經存儲的數據進行訪問。
經常使用的有關係型數據庫有:mysql、sqlserver、oracle、pgsql
nosql:redis、mangodb、等等mysql
爲何要進行數據庫設計?
數據存儲,高效訪問redis
優良的設計:
減小數據冗餘、避免數據維護異常、節約存儲空間、高效訪問sql
糟糕的設計:
存在大量冗餘、存在數據插入、更新、刪除異常、浪費大量存儲空間、訪問數據低效數據庫
爲何要進行數據庫設計?
需求分析 - 邏輯設計 - 物理設計 - 維護優化oracle
數據庫需求的做用點:nosql
邏輯設計:
使用er圖對數據庫進行邏輯建模數據庫設計
物理設計:
根據數據庫的自身特色將邏輯模型轉換爲物理模型函數
維護優化:工具
爲何要進行需求分析?
1. 瞭解系統中所要存儲的數據
2. 瞭解數據的存儲特色:時效性,不具備時效性(過時、清理、歸檔)
3. 瞭解數據的生命週期:快,數據量很大,但不是核心數據
4. 日誌不適合存在數據庫中。可是必定要存的話,要提早定義好清理和歸檔規則。隨着上線進行歸檔和清理。sqlserver
需求分析最好是在頭腦風暴中進行碰撞而後肯定下來的東西。
需求分析主要討論目標
將需求轉換爲數據庫的邏輯模型
經過ER圖的形式對邏輯模型進行展現
通所選用的數據庫不要緊
名詞解釋:
關係:一個關係對應一般所說的一張表
元組:表中的一行即爲一個元組
屬性:一列就是一個屬性
候選碼:表中的某個屬性組
主碼:一個關係中有多個候選碼,選定其中一個作爲主碼
域: 屬性的取值範圍【男,女】
份量:元組中的一個屬性值,男和女
矩形:表示實體集,矩形內寫實體集的名字
菱形:表示聯繫集(將原先多對多的關係,轉換爲一對多的關係)
橢圓:表示實體的屬性,加下標的就是主鍵
線段:將屬性鏈接到實體集,或將實體集鏈接到聯繫集
操做異常:
插入異常:若是實體隨着另外一個實體的存在而存在,既缺乏某個實體時沒法表示這個實體,這個表就存在插入異常
更新異常:若是更改表所對應的某個實體實例的單獨屬性時,須要將多行進行更新,那麼久說這個表存在更新異常
刪除異常:若是刪除表的某一行來反映實例失效時致使拎一個不一樣實例信息丟失,那麼這個表中就存在刪除異常
數據冗餘:相同的數據在多個地方存在,或者說表中的某個列可以由其餘列計算獲得,這樣就存在數據冗餘
數據庫設計通常遵循的範式:第一範式、第二範式、第三範式、Dc範式、反範式設計、第四範式和第五範式通常不涉及。
插入異常、刪除異常、更新異常、數據冗餘(通常設計,是在反範式設計中爲了提升性能,以及查詢的方便程度來確認的)
通常互聯網應用查詢和更新的比例是4筆1或者3比1
全部字段都是單一屬性,不可再分,這個單一屬性是由基本的數據類型所構成的
定義:數據庫中表不存在非關鍵字對於候選關鍵字的部分函數依賴
對於單主鍵必定符合第二範式
不存在非關鍵字段對任意候選字段的傳遞函數依賴則符合第三範式
第一第二第三範式都是實體設計不合理,冗餘數據,傳遞主鍵依賴,致使插入修改刪除的異常。
表中若是不存在任何字段對任一候選關鍵字段的傳遞函數依賴,則符合bc範式。
候選關鍵字的傳遞函數依賴。a 決定b b 決定a 可是都是候選關鍵字。
設計的時候最好都是單關鍵字的表,組合主鍵的最好少創建。
通常如今都是默認innodb,支持事務、行級表鎖定,ndb cluster(是內存形式的,通常都不用)
archive使用場景適合日誌
表及字段的命名規範:
生日:char、varchar、日期時間、Int時間戳
字段選擇原則:優先選擇數字類型、再次選擇date類型、其次是char、最後纔是varchar
以上選擇原則:
同類型:佔用空間小的。整形優先
char仍是varchar來存儲?
decimal與float如何選擇
時間類型如何存儲
如何選擇主鍵
爲了性能和讀取效率對於第三範式進行違反,容許少許的數據冗餘,提升讀取效率。換句話說就是以空間換時間。
如何維護索引
表結構維護:
爲了控制表的寬度,能夠進行表的垂直拆分:大表拆分小表(數據量是沒有變化的)
必需要有的字段:1. Id、2. 建立時間、3. 修改時間、4. 版本號、5. 邏輯刪除標記
對更新比較信任,通常不會出現同時更新的狀況
同時讀取到舊數據,同時對於數據進行更新
對更新不信任,在進行更新的時候,會將表數據鎖住,不容許讀取,等到更新完畢後,在放開當前的鎖。
可以保證在更新的時候,系統數據都是正確的。
要求改前將數據鎖住,別人都不可以讀取,將數據進行修改,提交後釋放鎖,別人纔可以讀取。