資料庫需求的作用點
1.資料是什麼
2.資料有哪些屬性
3.資料和屬性各自有什麼特點
1.使用er圖對資料庫進行物理建模
1.根據資料庫自身的特點把物理邏輯轉化為物理設計
1.新的需求進行建表
2.索引優化
3.大表拆分
1.了解系統中要儲存的資料
2.了解資料的儲存特點
3.了解資料的生命週期
1.實體與實體之間的關係(1對1,1對多,多對多)
2.實體所包含的屬性
3.哪些屬性,或者屬性的集合可以唯一標示乙個實體
4.實體的特性(如增長量)
1.包括的屬性
2.可選的唯一標示屬性
3.儲存特點(如快增長型,永久型,臨時型)(分表分庫)
1.第一正規化
2.第二正規化
3.第三正規化
4.bc正規化
1.資料庫第一正規化:
資料表中的所有欄位都是單一屬性,不可再分的,這個單一屬性是由基本的資料型別所構成的
如,整數,浮點,字串
通俗來數,第一正規化要求資料庫中的表都是二維表
2.第二正規化:
資料庫的表中不存在非關鍵字段,對任一候選關鍵字段的部分函式依賴。部分函式依賴是指存在著組合關鍵字中某一關鍵字決定非關鍵字的情況。
通俗來說:所有單關鍵字的表都符合第二正規化
第三正規化是在第二正規化的基礎上定義的,如果表中不存在非關鍵字段對任意候選關鍵字段的傳遞函式依賴,都符合第三正規化
在第三正規化的基礎上,在資料表中如果不存在任何欄位對任一字段候選關鍵字段的傳遞函式依賴,則符合bc正規化。
也就是說如果是復合關鍵字,則符合關鍵字之間也不能存在函式依賴關係
1.操作異常
1.插入異常:如果某個實體隨著另乙個實體的存在而存在,即為缺少某個實體是無法表示另乙個實體,哪個這個表久存在插入異常
2.更新異常:如果更改某錶對應的某個實體的單獨屬性時,需要將多行更新,那麼就說這個表存在更新異常
3.刪除異常:如果刪除表的某一行來反映某實體例項,失效時導致另乙個不同實體例項資訊丟失,哪個這個表中就存在刪除異常
2.資料冗餘:
指相同的資料在多個地方存在,或者說表中的某個列可以通過由其他列計算的到
1.選擇合適的資料庫管理系統
2.建立資料庫,表及其欄位的命名規範
3.根據所選的dbms系統選擇合適的字段
4.反正規化化的設計
如何選擇資料庫:
商業資料庫:
1.oracle 適合比較大的事務操作,效能較好
2.,sqlserver 只適合在windows下執行
開源資料庫:
1.mysql 不適合較的的事務操作,效能不如商業數庫
2.pgsql
跨平台性:
windows:
1.oracle
2.sqlserver
3.mysql
4.pgsql
windows,linux,mac
1.oracle
2.mysql
3.pgsql
企業級中經常使用:
1.oracle
2.sqlserver
中小型企業中經常使用:
1.mysql
2.pgsql
1.mylsam,不支援 事務, 支援併發的插入表級鎖, 主要應用:select insert 忌用讀寫操作頻繁
2.mrg_myisam 不支援事務 支援併發插入的表級鎖 主要應用分段歸檔,資料歸檔 。忌用全域性查詢多
3.innodb 支援事務 支援mvcc的行級鎖 主要應用事務處理 無禁用情況
4.archive 不支援事務 , 鎖粒度為行級鎖 主要用應於日誌記錄jnsert和select,只支援隨機資料讀取更快時禁用
5.ndb cluster,支援事務,鎖粒度為行級鎖,主要應用為高可用性,適合大部分場景
1.可讀性原則:
使用大寫和小寫來格式化的庫物件名來獲得可讀性
2.表意性原則
物件的名稱應該能夠描述它所標示的物件
3.長命性原則
盡量少的不使用縮寫
資料庫字段型別選擇原則
1.列的資料型別一方面影響資料儲存空的開銷,另一方面也會影響資料查詢效能,當乙個列可以選擇多個資料型別時,應該優先考慮數字型別,其次是日期或者二進位制型別,最後是字元型別,對於同級別的資料型別,應該優先考慮選擇占用空間小的資料型別,比如選定長而不選變長
字段型別和儲存空間
tinyint 1位元組
smallint 2個位元組
mediumini 3個位元組
int 4個位元組
bingint 8個位元組
date 3個位元組
datetime 8個位元組
timestamp 4個位元組
char(m) m位元組, 1<=m<=255
varchar(m) m位元組, 1<=m<=255
選擇原則從兩個方面考慮:
1.在對資料進行比較(查詢條件,join條件及排序)操作時:同樣的資料,字元處理汪汪比數字處理慢
2.在資料庫中,資料處理以頁為單位,列的長度越小,越利於效能提公升
1.char和varchar如何選擇:
1.如果列中要儲存的資料長度差不多是一致的,則應該考慮用char;否則考慮用varchar
2.如果列中的最大資料長度小於50byte,則一般考慮用char.如果這個列很少用,則基於節省空間和減少i/o考慮,還是用varchar)
3.一般大於50byte的列不適用char型別
2.decimal和float如何選擇
1.decimal用於儲存精確的資料,而float只能用於儲存非精確的資料,對於精確度較高的資料可以用decimal儲存
2.由於float的儲存空間開銷一般比decimal小,(精確到7位小數只需要4個位元組,而精確到15位只需要8個位元組),對於非精度資料優先選擇float型別
3.時間型別如何儲存:
1.使用int儲存時間欄位的優缺點
優點:字段長度比datetime小
缺點:使用不方便,要進行函式轉換
限制:只能儲存到2038-1-19 11:14:07 即為2的32次方
需要儲存時間粒度
年 月 日 小時 分 秒 周
2.時間儲存的技巧:
如果儲存的時間只是存起來很少查詢,那麼可以用int儲存起來,如果是經常查詢的時間字段,則不能用int儲存
1.區分業務主鍵和資料庫主鍵:
業務主鍵用於標示業務資料,進行表於表之間的關聯;
資料庫主鍵為了優化資料儲存(innodb會生成6個位元組的隱含主鍵)
2.根據資料庫的型別,考慮資料是否要順序增長:
有些資料庫是按主鍵的順序邏輯儲存的
3.主鍵的字段型別所佔空間要盡可能小:
對於使用聚集索引方式儲存的表,每個索引後面都會附加主鍵的資訊
1.降低資料匯入的效率
2.可能會有意想不到的資料異常
3.使業務邏輯變得複雜
1.無法準確知道預留欄位字段的型別
2.無法準確的知道預留欄位中所儲存的內容
3.後期維護預留字段所有的成本和要增加乙個欄位所要的成本是相同的
4.嚴禁使用預留字段
1,反正規化化就是為了效能和讀取效率的考慮而適當的對第三正規化的要求進行違反,而允許存在少量的資料冗餘
2.換句話說,反正規化化就是使用空間來換取時間
1.減少表的關聯數量
2.增加資料的讀取效率
3.反正規化化一定要適度
1.維護資料字典
2.維護索引
3.維護表結構
4.在適當的時候對錶進行水平拆分或垂直拆分
1.使用第三方工具對資料字典進行維護
2.利用資料庫本身的備註欄位來維護資料字典
1.在合適的列建立索引
1.出現在where從句,group從句,order by 從句中的列
2.可選擇性高的列要放在索引的前面
3.索引中不要包含太長的資料型別
2.維護索引的注意事項
1.索引不是越多越好,過多的索引不但會降低寫的效率,而且會減低讀的效率
2.定期維護索引碎片
3.在sql語句中不要使用強制索引關鍵字
注意事項
資料庫中適合的操作
1.資料庫中適合批量操作,逐條操作適合在程式中完成
2.禁止使用select* 這樣的查詢,要指定查詢的字段,否則會浪費i/o
3.控制使用使用者自定義函式
4.不要使用資料庫中的全文索引
表的垂直拆分:解決了表的寬度過長問題
1經常查詢的列放到一起
2.text,blob等大字段拆分出到附加表中
表的水平拆分:解決表中資料量大的問題
1.通過主鍵雜湊的方式進行,將主鍵通過hash key 來分為多個key
資料庫設計流程
資料庫作為資料的乙個容器,不但對程式的performance有很大的影響,而且對應用程式的擴充套件有非常大的影響.所以對應用程式來說,乙個具有良好設計的資料庫是非常重要的.那麼如何才能設計出效能好,又支援擴充套件的資料庫呢?這是我們大家都要去探索的問題.現在有很多版本的資料庫設計的流程.然而這也只是...
資料庫設計流程
資料庫設計流程,可以分為五步 規劃需求分析 概念設計 邏輯設計 物理設計 規劃就是指考慮好建立資料庫的必要性和可行性,明確資料庫在整個專案中扮演的角色以及與其它干係角色之間的關係。需求分析就是通過調研,了解這個專案對資料庫的資料和處理能力的要求,這個階段可以出乙個簡單的需求說明書。需求說明書需要包含...
資料庫設計流程
資料庫作為資料的乙個容器,不但對程式的performance有很大的影響,而且對應用程式的擴充套件有非常大的影響.所以對應用程式來說,乙個具有良好設計的資料庫是非常重要的.那麼如何才能設計出效能好,又支援擴充套件的資料庫呢?這是我們大家都要去探索的問題.現在有很多版本的資料庫設計的流程.然而這也只是...