Mysql資料庫設計的想法
什麼是資料庫設計
資料庫設計是根據業務系統的具體需要,結合我們所選用的資料庫管理系統(DBMS),為這個業務系統構造出最優的資料儲存模型。並建立好資料庫中的表的結構及表與表之間的關聯關係的過程。使之能有效的對應用系統中的資料進行儲存,並可以高效的對已經儲存的資料進行訪問。資料庫管理系統有很多:Mysql、oracle、SQL Server、Access、DB2、FoxPro等。
優良的資料庫設計:1.減少資料冗餘。2.避免資料維護異常。3.節約儲存空間。4.高效的訪問。
資料庫設計的思路
需求分析--->邏輯設計--->物理設計--->維護優化
一、資料庫需求分析的關鍵:1)資料是什麼 2)資料有哪些屬性 3)資料和屬性都有什麼特點
1.瞭解系統中要儲存的資料
2.瞭解資料的儲存特點(是否具有時效性,可以採用清理規則。資料增長快的一般要分割槽分表,判斷是否是核心資料,是否需要儲存在資料庫中)
1)實體及實體之間的關係(1對1,1對多,多對多)
2)實體所包含的屬性或者屬性的組合可以唯一標識一個實體。
3.瞭解資料的生命週期
二、進行邏輯分析。
1.將需求轉化為資料庫的邏輯模型
名詞解釋:
關係:一個關係對應通常是所說的一張表
元組:表中的一行即為一個元組
屬性:表中的一列即為一個屬性;每一個屬性都有一個名稱,稱為屬性名。
候選碼:表中的某個屬性組,它可以唯一確定一個元組。
主碼:一個關係有多個候選碼,選定其中一個為主碼。
域:屬性的取值範圍。
分量:元組中的一個屬性值。
2.資料庫設計的正規化:常見的資料庫設計正規化包括,第一正規化,第二正規化,第三正規化以及BC正規化
這是目前大多數資料庫設計所要遵循的正規化。
第一正規化:資料庫中的所有欄位都是單一屬性,不可再分
其中的單一屬性是指基本的資料型別構成:整型、浮點型、字串等。第一正規化要求資料庫中的表都是二維表。第二正規化:資料庫的表中不存在非關鍵欄位對任一候選關鍵欄位的部分函式依賴。部分函式依賴是指存在著組合關鍵字中的某一個關鍵字決定非關鍵字的情況。
所有單關鍵欄位的表都符合第二正規化。
第三正規化:如果資料表中不存在非關鍵欄位,對任意候選關鍵欄位的傳遞函式依賴則符合第三正規化
BC正規化:如果是複合關鍵字,則複合關鍵字之間也不能存在函式依賴關係。
資料操作異常及資料冗餘
操作異常
1.插入異常:如果某實體隨著另一個實體的存在而存在,既缺少某個實體時無法表示這個實體,那麼這個表就會存在插入異常。
2.更新異常:如果更改表對應的某個實體例項的單獨屬性時,需要將多行更新,那麼就說這個表存在更新異常。
3.刪除異常:如果刪除表某一個行來反映某實體例項失效時,導致另一個實體出現資訊丟失。
資料冗餘
是指相同的資料存在多個地方,或者表中的某個列可以由其他列計算得到,就說表中存在資料冗餘。
三、物理設計中最重要的是研究資料庫管理系統的自身特點。
1.選擇合適的資料庫管理系統
常見的DBMS系統
1)Oracle與SQLServer是按核收費,屬於商業資料庫。適合企業級專案
2)Mysql與PSQL屬於開源資料庫。適合Java與PHP。適用於網際網路專案
SQLSever支援在Windows作業系統。適合.net
a.MySql的常用儲存引擎
儲存引擎 | 事務 | 鎖粒度 | 主要應用 | 忌用 |
MyISAM | 不支援 讀寫速度快 | 支援併發插入的表級鎖 | SELECT,INSERT | 讀寫操作頻繁 |
MRG_MYISAM | 不支援 | 支援併發插入的表級鎖 | 分段歸檔,資料倉庫 | 全域性查詢過多的場景 |
Innodb | 支援 | 支援MVCC行級索 | 事務處理 | 無 |
Archive | 不支援 | 行級索 | 日誌記錄,只支援insert,select | 需要隨機讀取,更新,刪除 |
Ndb cluster | 支援 | 行級索 | 高可用性 | 大部分應用 |
2.定義資料庫、表及欄位的命名規範。
1)可讀性原則:使用大小寫來格式化的庫物件名字以獲得良好的可讀性。注意:DBMS系統對錶名的大小寫敏感。查詢時也要按大小寫規則來。
2)表意性原則:物件的名字應該能夠描述它所標識的物件。
3)長名性原則:不要縮寫。
3.根據所選的DBMS系統選擇合適的欄位型別。
1)欄位型別的選擇原則
列的資料型別一方面影響資料儲存空間的開銷,另一方面也會影響資料查詢效能。當一個列可以選擇多種資料型別時,應該優先考慮數字型別,其次是日期或二進位制型別,最後是字元型別。對於相同級別的資料型別,應該優先選擇佔用空間小的資料型別。
列型別 | TINYINT | SMALLINT | MEDIUMINT | INT | BINGINT | DATE | DATETIME | TIMESTAMP | CHAR(M) | VARCHAR(M) |
儲存空間 | 1位元組 | 2位元組 | 3位元組 | 4位元組 | 8位元組 | 3位元組 | 8位元組 | 4位元組 | M位元組,1<=M<=255 | 可變 |
b)在資料庫中,資料處理以頁為單位。列的長度越小,利於效能提升。
char和varchar的選擇
- 如果列中要儲存的資料長度差不多是一致的,則應該考慮用char;否則選擇考慮用varchar.
- 如果列中的最大資料長度小於50Byte,則一般考慮用char.(如果這個列很少用,基於節省空間和減少I/O的考慮,還是可以考慮選擇使用varchar)
- 大於50Byte不建議使用char型別。
decimal與float的選擇
- decimal用於精確資料的儲存,而float只能用於儲存非精確資料。
- float的儲存空間開銷一般比decimal小。
時間型別的儲存選擇
- 使用int來儲存時間,優點:欄位長度小。缺點:需要去函式轉換。長時間運用的用Datetime。int有儲存時間限制
- 需要儲存的時間粒度(年月日時分秒)
主鍵的選擇
- 區分業務主鍵和資料庫主鍵(業務主鍵用於標識業務資料,進行表與表之間的關聯;資料庫主鍵是為了優化資料儲存)
- 根據資料庫的型別,考慮主鍵是否要順序增長(有些資料庫是按主鍵的順序邏輯儲存的)
- 主鍵的欄位型別所佔空間要儘可能小
4.反正規化化設計。
為了效能和讀取效率的考慮而適當的違反三正規化
四、維護優化:1)新的需求進行建表 2)索引優化 3)大表拆分