資料庫架構設計
做架構到底是在做什麼?
抽象能力
抽象->具象
資料庫架構設計分為以下三種:
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 基本需求 某學校設計學生教學管理系統。學生實體包括學號 姓名 性別 生日 民族 籍貫 簡歷 登記照,每名學生選擇乙個主修專業,專業包括專業編號和名稱,乙個專業可以屬於 乙個學院,乙個學院可以有若干個專業。學院資訊要儲存學院號 學院名 院長。教學管理還要管理課程表和學生成績。課程表包括課程號 課程...