如果不能設(shè)計(jì)一個合理的數(shù)據(jù)庫模型,不僅會增加客戶端和服務(wù)器段程序的編程和維護(hù)的難度,而且將會影響系統(tǒng)實(shí)際運(yùn)行的性能。所以,在一個系統(tǒng)開始實(shí)施之前,完備的數(shù)據(jù)庫模型的設(shè)計(jì)是必須的。
在一個系統(tǒng)分析、設(shè)計(jì)階段,因?yàn)閿?shù)據(jù)量較小,負(fù)荷較低。我們往往只注意到功能的實(shí)現(xiàn),而很難注意到性能的薄弱之處,等到系統(tǒng)投入實(shí)際運(yùn)行一段時(shí)間后,才發(fā)現(xiàn)系統(tǒng)的性能在降低,這時(shí)再來考慮提高系統(tǒng)性能則要花費(fèi)更多的人力物力,而整個系統(tǒng)也不可避免的形成了一個打補(bǔ)丁工程。
所以在考慮整個系統(tǒng)的流程的時(shí)候,我們必須要考慮,在高并發(fā)大數(shù)據(jù)量的訪問情況下,我們的系統(tǒng)會不會出現(xiàn)極端的情況。(例如:對外統(tǒng)計(jì)系統(tǒng)在7月16日出現(xiàn)的數(shù)據(jù)異常的情況,并發(fā)大數(shù)據(jù)量的的訪問造成,數(shù)據(jù)庫的響應(yīng)時(shí)間不能跟上數(shù)據(jù)刷新的速度造成。具體情況是:在日期臨界時(shí)(00:00:00),判斷數(shù)據(jù)庫中是否有當(dāng)前日期的記錄,沒有則插入一條當(dāng)前日期的記錄。在低并發(fā)訪問的情況下,不會發(fā)生問題,但是當(dāng)日期臨界時(shí)的訪問量相當(dāng)大的時(shí)候,在做這一判斷的時(shí)候,會出現(xiàn)多次條件成立,則數(shù)據(jù)庫里會被插入多條當(dāng)前日期的記錄,從而造成數(shù)據(jù)錯誤。),數(shù)據(jù)庫的模型確定下來之后,我們有必要做一個系統(tǒng)內(nèi)數(shù)據(jù)流向圖,分析可能出現(xiàn)的瓶頸。
為了保證數(shù)據(jù)庫的一致性和完整性,在邏輯設(shè)計(jì)的時(shí)候往往會設(shè)計(jì)過多的表間關(guān)聯(lián),盡可能的降低數(shù)據(jù)的冗余。(例如用戶表的地區(qū),我們可以把地區(qū)另外存放到一個地區(qū)表中)如果數(shù)據(jù)冗余低,數(shù)據(jù)的完整性容易得到保證,提高了數(shù)據(jù)吞吐速度,保證了數(shù)據(jù)的完整性,清楚地表達(dá)數(shù)據(jù)元素之間的關(guān)系。而對于多表之間的關(guān)聯(lián)查詢(尤其是大數(shù)據(jù)表)時(shí),其性能將會降低,同時(shí)也提高了客戶端程序的編程難度,因此,物理設(shè)計(jì)需折衷考慮,根據(jù)業(yè)務(wù)規(guī)則,確定對關(guān)聯(lián)表的數(shù)據(jù)量大小、數(shù)據(jù)項(xiàng)的訪問頻度,對此類數(shù)據(jù)表頻繁的關(guān)聯(lián)查詢應(yīng)適當(dāng)提高數(shù)據(jù)冗余設(shè)計(jì)但增加了表間連接查詢的操作,也使得程序的變得復(fù)雜,為了提高系統(tǒng)的響應(yīng)時(shí)間,合理的數(shù)據(jù)冗余也是必要的。設(shè)計(jì)人員在設(shè)計(jì)階段應(yīng)根據(jù)系統(tǒng)操作的類型、頻度加以均衡考慮。
另外,**不要用自增屬性字段作為主鍵與子表關(guān)聯(lián)。不便于系統(tǒng)的遷移和數(shù)據(jù)恢復(fù)。對外統(tǒng)計(jì)系統(tǒng)映射關(guān)系丟失(******************)。
原來的表格必須可以通過由它分離出去的表格重新構(gòu)建。使用這個規(guī)定的好處是,你可以確保不會在分離的表格中引入多余的列,所有你創(chuàng)建的表格結(jié)構(gòu)都與它們的實(shí)際需要一樣大。應(yīng)用這條規(guī)定是一個好習(xí)慣,不過除非你要處理一個非常大型的數(shù)據(jù),否則你將不需要用到它。(例如一個通行證系統(tǒng),我可以將USERID,USERNAME,USERPASSWORD,單獨(dú)出來作個表,再把USERID作為其他表的外鍵)http://www.gzsam.com.cn/數(shù)據(jù)優(yōu)化
表的設(shè)計(jì)具體注意的問題:
1、數(shù)據(jù)行的長度不要超過8020字節(jié),如果超過這個長度的話在物理頁中這條數(shù)據(jù)會占用兩行從而造成存儲碎片,降低查詢效率。
2、能夠用數(shù)字類型的字段盡量選擇數(shù)字類型而不用字符串類型的(電話號碼),這會降低查詢和連接的性能,并會增加存儲開銷。這是因?yàn)橐嬖谔幚聿樵兒瓦B接回逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。
3、對于不可變字符類型char和可變字符類型varchar 都是8000字節(jié),char查詢快,但是耗存儲空間,varchar查詢相對慢一些但是節(jié)省存儲空間。在設(shè)計(jì)字段的時(shí)候可以靈活選擇,例如用戶名、密碼等長度變化不大的字段可以選擇CHAR,對于評論等長度變化大的字段可以選擇VARCHAR。
4、字段的長度在**限度的滿足可能的需要的前提下,應(yīng)該盡可能的設(shè)得短一些,這樣可以提高查詢的效率,而且在建立索引的時(shí)候也可以減少資源的消耗。
資訊來源:
http://www.gzsam.com.cn/