引言:一直在從事數(shù)據(jù)庫開發(fā)和設(shè)計工作,也看了一些書籍,算是略有心得。很久之前就想針對關(guān)系數(shù)據(jù)庫設(shè)計進行整理、總結(jié),但因為種種原因遲遲沒有動手,主要還是惰性使然。今天也算是痛下決心開始這項卓絕又令我興奮的工作。這將是一個系列的文章,我將以講座式的口吻展開討論(個人偷懶,這里的總結(jié)直接拿去公司培訓(xùn)新人用)。
系列的第一講我們先來回答下面幾個問題
數(shù)據(jù)庫是大樓的根基
大多數(shù)程序員都很急切,在了解基本需求之后希望很快的進入到編碼階段(可能只有產(chǎn)出代碼才能反映工作量),對于數(shù)據(jù)庫設(shè)計思考得比較少。
這給系統(tǒng)留下了許多隱患。許多軟件系統(tǒng)的問題,如:輸出錯誤的數(shù)據(jù),性能差或后期維護繁雜等,都與前期數(shù)據(jù)庫設(shè)計有著密切的關(guān)系。到了這個時候再想修改數(shù)據(jù)庫設(shè)計或進行優(yōu)化等同于推翻重來。
我經(jīng)常把軟件開發(fā)比作汽車制造。汽車制造會經(jīng)過圖紙設(shè)計,模型制作,樣車制造,小批量試生產(chǎn),最后是批量生產(chǎn)等步驟。整個過程環(huán)環(huán)相扣,后一過程是建立在前一過程正確的前提基礎(chǔ)之上的。如果在圖紙設(shè)計階段發(fā)現(xiàn)了一個紕漏,我們可以重新進行圖紙設(shè)計,如果到了樣車制造階段發(fā)現(xiàn)這個錯誤,那么我們就要把從圖紙設(shè)計到樣車制造的階段重來,越到后面發(fā)現(xiàn)設(shè)計上的問題,所付出的代價越大,修改的難度也越大。
數(shù)據(jù)庫是整個應(yīng)用的根基,沒有堅實的根基,整個應(yīng)用也就岌岌可危了。
強大的數(shù)據(jù)庫面對不良設(shè)計也無能為力
現(xiàn)代數(shù)據(jù)庫管理系統(tǒng)(DBMS)提供了方便的圖形化界面工具,通過這些工具可以很方便的創(chuàng)建表、定義列,但我們設(shè)計出的結(jié)構(gòu)好嗎?
關(guān)系數(shù)據(jù)庫有許多非常好的特性,但設(shè)計不當(dāng)會使這些特性部分或完全的喪失。
我們來看看以下幾個數(shù)據(jù)庫不良設(shè)計造成的場景:
1. 數(shù)據(jù)一致性的喪失
一個訂單管理系統(tǒng),維護著客戶和客戶下的訂單信息。使用該系統(tǒng)的用戶在接到客戶修改收貨地址的電話后,在系統(tǒng)的客戶信息頁面把該客戶的收貨地址進行了修改,但原先該客戶的訂單還是送錯了地址。
2. 數(shù)據(jù)完整性的喪失
公司戰(zhàn)略轉(zhuǎn)移,準(zhǔn)備撤出某地區(qū)。系統(tǒng)操作人員順手把該地區(qū)的配置信息在系統(tǒng)中進行刪除,系統(tǒng)提示刪除成功。隨后問題就來了,客服人員發(fā)現(xiàn)該地區(qū)的歷史訂單頁面一打開就出錯。
3. 性能的喪失
一個庫存管理系統(tǒng),倉庫管理員使用該系統(tǒng)記錄每一筆進出貨情況,并能查看當(dāng)前各貨物的庫存情況。在系統(tǒng)運行幾個月后,倉庫管理員發(fā)現(xiàn)打開當(dāng)前庫存頁面變得非常慢,而且整個趨勢是越來越慢。
上面這些場景都是由于數(shù)據(jù)庫設(shè)計不當(dāng)造成的,根源包括:設(shè)計時引入了冗余字段,沒有設(shè)計合理的約束,對性能沒有進行充足設(shè)計等,上面的例子也只是滄海一粟。
數(shù)據(jù)庫平臺無關(guān)性
我在這個系列博客里討論的數(shù)據(jù)庫設(shè)計不針對任何一個關(guān)系數(shù)據(jù)庫產(chǎn)品。無論你使用的是Oracle,SQL Server,Sybase,亦或是開源數(shù)據(jù)庫如:MySQL,SQLite等,都可以用來實踐我們這里討論的設(shè)計方法和設(shè)計理念,設(shè)計是這個系列博文的核心和靈魂。
注:在文中我會選用一個數(shù)據(jù)庫產(chǎn)品來進行演示,大家可以選用自己熟悉的數(shù)據(jù)庫產(chǎn)品來實驗。本文最后會給出一些免費數(shù)據(jù)庫產(chǎn)品的鏈接,大家可以下載學(xué)習(xí)。
一起學(xué)習(xí)共同進步
無論你是數(shù)據(jù)庫設(shè)計師,應(yīng)用架構(gòu)師,軟件工程師,數(shù)據(jù)庫管理員(DBA),軟件項目經(jīng)理,軟件測試工程師等項目組成員,都能從該系列博文中有所收獲。大家一起討論,共同進步。
內(nèi)容涉及領(lǐng)域
我對這一系列博文現(xiàn)在的設(shè)想是涉及數(shù)據(jù)庫設(shè)計的整個過程。從需求分析開始,到數(shù)據(jù)庫建模(概念數(shù)據(jù)建模),進行范式化,直至轉(zhuǎn)化為SQL語句。
在我們一頭扎進數(shù)據(jù)庫設(shè)計之前,我們先了解一下除了關(guān)系型數(shù)據(jù)庫之外的數(shù)據(jù)存儲方式。
平面文件(Flat File)
包括以.txt和.ini結(jié)尾的文件。
eg: 一個.ini文件的內(nèi)容:
------------------------------------------------------------
[WebSites]
MyBlog=http://www.cnblogs.com/DBFocus
[Directorys]
Image=E:\DBFocus Project\Img
Text=E:\DBFocus Project\Documents
Data=E:\DBFocus Project\DB
------------------------------------------------------------
優(yōu)點:
文件的存儲形式非常簡單,普通的編輯器都能對其進行打開、修改
缺點:
無法支持復(fù)雜的查詢
沒有任何驗證功能
對平面文件中間的內(nèi)容進行插入、刪除操作其實是重新生成了一個新文件
適用場景:
存放小量,修改不頻繁的數(shù)據(jù),如應(yīng)用配置信息
Windows注冊表
錯誤的修改Windows注冊表會引起系統(tǒng)的紊亂,故不建議把很多數(shù)據(jù)存放在注冊表中。
Windows注冊表為樹形結(jié)構(gòu),存放著一些系統(tǒng)配置信息和應(yīng)用配置信息。
通過把不同的配置存放在注冊表的不同分支上,使得應(yīng)用程序公共配置信息與用戶個人配置信息分離。
eg:某文檔版本管理系統(tǒng),能通過配置與本主機上安裝的文件比較器建立關(guān)聯(lián)進行文檔比較。這是一個公共配置信息,文件比較器路徑可以存放在注冊表的HKEY_LOCAL_MACHINE\SOFTWARE分支下。
同時該文檔版本管理系統(tǒng)能記錄用戶最近打開的10個文檔路徑。這是用戶個人配置信息,對于不同的Windows用戶最近打開的10個文檔可以不同,這些配置信息可存放在注冊表的HKEY_CURRENT_USER\Software分支下。
Excel表單(Spreadsheets)
優(yōu)點:
Excel 非常普及,用戶對于Spreadsheet的表現(xiàn)形式非常熟悉
可以進行簡單統(tǒng)計,方便出各種圖表
缺點:
不適用于許多Spreadsheet之間關(guān)系復(fù)雜的情況
無法應(yīng)對復(fù)雜查詢
數(shù)據(jù)驗證功能弱
適用場景:
數(shù)據(jù)量不是非常大的辦公自動化環(huán)境
XML
XML是一種半結(jié)構(gòu)化的數(shù)據(jù)。相比于超文本標(biāo)記語言(HTML),其標(biāo)簽是可以自行定義的,即可擴展的。
eg:一個XML文件內(nèi)容
-----------------------------------------------------
<?xml version=”1.0” encoding=”UTF-8” ?>
<ClassSchedule>
???? <Class Name=“Psychology” Room=”Field 3”>
????????? <Instructor>Richard Storm</Instructor>
????????? <Students>
?????????????? <Student>
???????????????????? <FirstName>Ben</FirstName>
???????????????????? <LastName>Breaker</LastName>
?????????????? </Student>
?????????????? <Student>
???????????????????? <FirstName>Carol</FirstName>
???????????????????? <LastName>Enflame</LastName>
???????????????????? <NickName>Candy</NichName>
????????? </Students>
???? </Class>
</ClassSchedule>
-----------------------------------------------------
XML文件有幾個特點。
首先,XML標(biāo)簽要求嚴格對應(yīng),且不能出現(xiàn)交錯的現(xiàn)象。
其次,XML文件必須有一個根節(jié)點,該節(jié)點包含所有其他元素。
第三,同級別的不同節(jié)點內(nèi)不必包含相同的元素,如上例中第二個學(xué)生Carol有一個特別的節(jié)點NickName。這個特性使得在某些場景中XML比關(guān)系數(shù)據(jù)庫更能應(yīng)對變化。
優(yōu)點:
自然的層次型結(jié)構(gòu)
文本內(nèi)容通過標(biāo)簽是自解釋的
通過XSD(XML Schema語言)可以驗證XML的結(jié)構(gòu)
有許多輔助型技術(shù)如:XPath, XQuery, XSL, XSLT等
一些商業(yè)數(shù)據(jù)庫(如Oracle,SQL Server)已支持XML數(shù)據(jù)的存儲與操作
缺點:
數(shù)據(jù)的冗余信息較多
無法支持復(fù)雜的查詢
驗證功能有限
對XML中間的內(nèi)容進行插入、刪除操作其實是重新生成一個新文件
適用場景:
適合存放數(shù)據(jù)量不大,具有層次型結(jié)構(gòu)的數(shù)據(jù),如樹形配置信息
NoSQL數(shù)據(jù)庫
非關(guān)系型數(shù)據(jù)庫我接觸的不是很多,除了給出一些產(chǎn)品名稱之外不做很多展開。園子里已有一些文章,本文最后也給出了鏈接供大家學(xué)習(xí)、研究。
1. Key-Value數(shù)據(jù)庫
Redis, Tokyo Cabinet, Flare
2. 面向文檔的數(shù)據(jù)庫
MongoDB, CouchDB
3. 面向分布式計算的數(shù)據(jù)庫
Cassandra, Voldemort
這幾年NoSQL非常熱。我認為NoSQL并不是“銀彈”,在某些SNS應(yīng)用場景中NoSQL顯示了其優(yōu)越性,但在如金融行業(yè)等對數(shù)據(jù)的一致性、完整性、可用性、事務(wù)性高要求的場景下,現(xiàn)在的NoSQL就未必適用。我們應(yīng)充分分析應(yīng)用的需求,非常謹慎地選擇技術(shù)和產(chǎn)品。
主要內(nèi)容回顧
1.數(shù)據(jù)庫設(shè)計對于軟件項目成功的關(guān)鍵作用
2.本課程與數(shù)據(jù)庫產(chǎn)品無關(guān),核心是設(shè)計的理念和方法
3.各種數(shù)據(jù)存儲所適用的場景
參考資料
1.? Oracle ?Database 10g? Express ?Edition
2.? SQL Server ?2008 R2? Express ?– Overview
http://www.cnblogs.com/DBFocus/archive/2011/03/27/1996655.html
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
