資料庫架構設計規範

2021-10-01 15:16:54 字數 2406 閱讀 4693

資料庫架構設計

做架構到底是在做什麼?

抽象能力

抽象->具象

資料庫架構設計分為以下三種:

1.具體內容設計資料庫的乙個邏輯結構。與具體的dbms無關,主要反映業務邏輯

2.設計步驟:用關係模型

3.使用工具來模型化: e-r圖。   

4.實體關係模型

5.至少滿足3nf

第一正規化(1nf):要求資料庫表的每一列都是不可分割的原子資料項。

第二正規化需要確保資料庫表中的每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)

第三正規化需要確保資料表中的每一列資料都和主鍵直接相關,而不能間接相關。

1. 對具體資料庫進行選型:oracle、mysql、db2

2. 表的字段及儲存結構

3.1 資料庫命名規範

mysql物件名稱在預設情況下是大小寫敏感

mysql的物件其實都是乙個檔案,而linux檔名是大小寫敏感                  

不同的寫法dbname/ dbname, mytable/mytable,會導致資料庫表錯誤

大小寫不同布會導致開發非常麻煩

一定要提前準備乙份對應版本的關鍵字標

關鍵可能導致無法建表;或者建表的時候沒問題,但sql查詢就掛了

order: product_title

erp_instock: product_title

3.2資料庫設計規範

utf-8格式

統一字符集避免亂碼

utf-8的字符集是1個漢字佔3個位元組:varchar(255)  utf-8 255*3=765位元組

對於日誌資料,進行歸檔

對於業務資料進行分庫分表

雖然表沒有行限制,但是列最多4096

如果列多了,占用記憶體和i/o會非常大

varchar型別占用空間大,影響效率

違背上面的命名規則

時間久了,不看業務**,完全是魔鬼字段

如果要用blob、text存大檔案,select columns...

如何避免select *,外來鍵表

3.3資料庫索引設計規範

索引過多:sql在進行優化器評估的時候會有更大的開銷

絕對不允許給表的每一列都建立索引

表資料的實際儲存順序只能有一種,innodb是按照主鍵進行存放的

如果沒有主鍵,mysql會優先選擇第乙個非空唯一索引來做主鍵

如果上面這個沒有,mysql會自動生成乙個36位元組的主鍵,但效能不好

不能使用更新頻繁的列和聯合索引做主鍵,主鍵不斷變,資料的存放順序就會不斷變化

不要使用uuid、md5、hash等做主鍵,不能保證這些值是按順序增長的。如果生成較小

的字串就會導致不斷變化資料儲存的位置,影響i/o效能。

explain

where後

join的連線列

篩選項最大的放在索引最左側

因為外來鍵寫入的時候會降低儲存效率

但要給這些關聯欄位加索引

3.4資料庫字段設計規範

一搬用int來存放時間戳 

varchar(255)長度過長會消耗記憶體

如果非要使用可以單獨拉出來做關聯表

這兩個型別上沒有預設值

修改則需要使用alter語句

如果為null,索引需要額外的空間儲存

不能用日期函式進行計算和比較

用字串占用的空間更多 

timstamp 32位作業系統時間範圍:      1970-01-01 00:00:00 到2038-01-19 03:14:07   

3.5資料庫sql開發規範

降低詞法和語法分析器的重複執行 

防止sql注入

避免前後%

使用left join或not exists來優化not in(not in 無法使用索引)

跨庫訪問最好呼叫業務層:例如應用a用到資料庫b和資料庫c的資料:應用a--訪問-->資料庫b  ==介面訪問==>應用d--訪問-->資料庫c

如果賬號被注入,也只注入乙個庫

子查詢的結果集無法使用索引

子查詢會產生臨時表操作,如果查詢量大則會嚴重影響效率 

大查詢拆小查詢,由我們的程式來去做關聯和合併

進行表資料冗餘

如果我們的資料明顯不重複,就使用union all

程式=資料結構+演算法

3.6 資料庫操作行為規範   

資料分批執行,以免造成主從庫資料延遲

v5.7 binlog_format:row方式下

對於大表的操作,可以用:pt-online-schema-change(percona)

原理:建立新錶結構->複製就表資料到新錶->在原表上加入觸發器確保資料同步->所有操作進行完畢後對原表進入乙個很短的時間鎖-

>把原表名進行修改,再改新表->刪除原表名->原子性操作分割進行

資料庫設計規範

使用明確 統一的標明和列名,例如 school,schoolcourse,courceid。資料表名使用單數而不是複數,例如 studentcourse,而不是studentcourses。資料表名不要使用空格。資料表名不要使用不必要的字首或者字尾,例如使用school,而不是tblschool,或...

資料庫設計規範

csm簡寫會方便很多 就不要用member id,一致性方便大家理解 system.currenttimemillis 進行儲存text查詢是會產生臨時磁碟檔案,效能差進行擷取儲存型別 占用位元組 範圍tinyint 1 128 127 smallint 2 32768 32767 mediumin...

資料庫設計規範

1 基本需求 某學校設計學生教學管理系統。學生實體包括學號 姓名 性別 生日 民族 籍貫 簡歷 登記照,每名學生選擇乙個主修專業,專業包括專業編號和名稱,乙個專業可以屬於 乙個學院,乙個學院可以有若干個專業。學院資訊要儲存學院號 學院名 院長。教學管理還要管理課程表和學生成績。課程表包括課程號 課程...