靈活運用數(shù)據(jù)庫主外鍵
在最近的工作中發(fā)現(xiàn),公司現(xiàn)有表都是沒有主外鍵關(guān)系的,也就是沒有加數(shù)據(jù)庫主外鍵約束,全部都是采用程序來控制數(shù)據(jù)的一致性。這點讓我很是不解,從當(dāng)初學(xué)習(xí)數(shù)據(jù)庫,到參加工作使用數(shù)據(jù)庫和設(shè)計數(shù)據(jù)庫,一直都遵循數(shù)據(jù)庫的三范式,表之間的關(guān)聯(lián)采用數(shù)據(jù)庫的主外鍵約束(請理解這是數(shù)據(jù)庫的約束,而不是我們程序控制的約束)。于是查找了一些資料,現(xiàn)在的疑惑才慢慢解開。下面我將對數(shù)據(jù)庫的作用,以及為什么出現(xiàn)應(yīng)用程序,再到真正開發(fā)時如何設(shè)計數(shù)據(jù)庫的一些理解和大家分享下,歡迎提出不同的見解。
數(shù)據(jù)庫是什么
數(shù)據(jù)庫,是計算機中運行的一個進程,它可以完成數(shù)據(jù)存儲,查找,分析,數(shù)據(jù)挖掘等我們通常使用的功能(大家可以聯(lián)想access數(shù)據(jù)庫),只是其操作起來對人員的要求較高,必須要懂得sql語句的寫法,深刻理解表之間的關(guān)系,當(dāng)然也可以請專門的人員來幫忙將數(shù)據(jù)導(dǎo)出來,這樣的工作實施起來麻煩還是比較大的。并不是每個人都懂sql語法,專門的人員(DBA)一般公司請不起,簡單的操作人員,工作效率是個問題。數(shù)據(jù)庫的功能是強大,但是面向的人群較為苛刻。所以在我的思維習(xí)慣中,數(shù)據(jù)庫往往是一種后臺的服務(wù)(不直接操作它,但是使用其提供的服務(wù),sql語句就是它提供的接口),不過現(xiàn)在不能再這么認為了,我們可以僅僅利用數(shù)據(jù)庫各種數(shù)據(jù)的操作,比如數(shù)據(jù)的錄入,數(shù)據(jù)的分析等,但是這樣的效率太低了,如果每天有上千條的數(shù)據(jù)(這里說少點)需要保持,那么單純來使用數(shù)據(jù)庫這將是一項浩大的工程,分析也一樣,而且分析得出的數(shù)據(jù)用戶不一定能看懂。于是有了我們的應(yīng)用程序。
數(shù)據(jù)庫之上的應(yīng)用系統(tǒng)
如果單從數(shù)據(jù)庫應(yīng)用程序的角度來考慮,而不談其它應(yīng)用系統(tǒng),其作用可以為我們提供一個透明的簡單的數(shù)據(jù)錄入,查詢和分析。用戶只需要點擊某一個按鈕就可以得到想要的結(jié)果。而且其面向的人群更大眾化,正是有這樣的特性,才使計算機真正的為更多人服務(wù),用戶完全可以認為不存在數(shù)據(jù)庫,無論是網(wǎng)上購物,還是自己的數(shù)據(jù)備忘,抑或是分析最近關(guān)注信息的走勢,都是一個按鈕解決問題。再回到技術(shù)上,系統(tǒng)要想做到方便用戶使用,到底應(yīng)該怎么做?
需要知道的兩個概念
OLAP和OLTP。一個是聯(lián)機分析處理,一個是聯(lián)機事務(wù)處理。聯(lián)機分析強調(diào)的是數(shù)據(jù)查詢和整合分析,數(shù)據(jù)修改較少,而聯(lián)機事務(wù)則強調(diào)數(shù)據(jù)修改較多,對數(shù)據(jù)一致性要求較高。這就對應(yīng)著兩個系統(tǒng),一個系統(tǒng)對查詢的性能要求很高,方便數(shù)據(jù)的可移植,一個系統(tǒng)對數(shù)據(jù)完整性和一致性要求較高。因此我們在做系統(tǒng)設(shè)計時必須搞清楚系統(tǒng)的特性,如果是查詢性能高而且數(shù)據(jù)結(jié)構(gòu)的修改較多,數(shù)據(jù)移植頻繁,那么在數(shù)據(jù)庫的設(shè)計時就不能完全遵循三范式,因為這樣數(shù)據(jù)庫會有一定的自檢策略而且比較豪性能,相反則更能很好的保證數(shù)據(jù)的正確性。
結(jié)論
知識還是要靈活運用的,范式在數(shù)據(jù)庫中是真理,但是當(dāng)和其它系統(tǒng)集成的時候就不一定完全合理,比如數(shù)據(jù)的冗余,如果經(jīng)常做統(tǒng)計查詢,那么將統(tǒng)計結(jié)果放到一張表中比關(guān)聯(lián)幾張表來查詢快多了,而且用戶看中的就是這個,其它讓我們大膽相信自己的程序能夠控制后,做好數(shù)據(jù)準(zhǔn)確的把門將軍。讓數(shù)據(jù)庫的最后一道關(guān)用在其它地方吧。