數據庫知多少:一個開發人員應該有多少數據知識?

 問題如下:
         1.char,varchar,nvarchar之間的區別
         2.MS SQL Server2005支持哪幾種訪問協議
         3.tempdb的作用
         4.Select * fron tableName where colName=NULL有什麼問題
         5.join,in,exists的使用場景及取捨因素
        近段時間我使用這幾個問題和一些開發人員進行了交流,其中不乏有工作3,5年,聲稱自己精通Oracle和MSSQL的人。不過結果卻是很失望。
        OK,閒話不多說了。首先來看這幾個問題所描述的領域。
        問題1,數據類型。這個問題所管理按到的背景知識是存儲引擎。不同的數據類型是如何存儲在存儲介質上面的,定長、變長以及溢出數據在數據槽以及頁面的組織方式。
        問題2,協議。這個問題關係到MS SQL Server內部體系結構。當客戶端的請求到達服務器時,服務器是如何進行處理的,要經過哪些模塊,每個模塊都進行一些什麼樣的處理。
        問題3,系統數據庫。這個問題涉及到是MS SQL Server的邏輯結構。SQL服務器和數據庫引擎實例的關係,實例和各種服務(Reporting Service,Analisys Service)的關係,實例和數據庫的關係,數據庫和架構,架構和對象。一個這些邏輯結構中每個對象的作用,例如tempdb。
        問題4,關係理論。開發人員和DB關係最緊密之處就是SQL語言了,這就涉及到關係理論。這個是非常重要的,關係理論有的時候並不像我們想象的那樣工作,比如MS SQL2005採用了3值邏輯(true,false,unknown),unknown如果不理解unknown就可能會導致返回非預期結果。
        問題5,查詢引擎。如果說不不太理解存儲引擎,還過得去,比如說在char,varchar,nvarchar之間永遠選擇nvarchar就可以了,程序不太會出問題。但是如果有人說精通SQL,那就一定要理解查詢引擎。查詢引擎是如何處理索引的,是如何處理表連接的。這都是非常關鍵的問題。
        從上面不難看出,作爲一個好的面向數據的開發人員應該具有哪些數據庫知識,這裏以MS SQL Server爲例(我基本上只懂這個)
        1.瞭解基本的關係理論,並且瞭解所使用的RDBMS是如何處理的。個人認爲關係理論至關重要,因爲對於開發人員來說,RDBMS中使用最多的就是SQL了,而SQL又是基於關係理論的。
        SQL語言本身觀看上去是比較簡單的。其實本來是應該叫SEQL(Structure Engilish Query Language),因爲商業上原因的IBM纔將其改爲SQL。其聲明式的設計理念導致其簡單的使用方式。不過我認爲SQL本身並不簡單,衆多的關鍵字,以及過於靈活的語法。
        學好SQL的基本前提就是理解關係理論(有人把關係和表之間的主外鍵關係劃了等號,實在是汗啊),瞭解各種各樣的謂詞邏輯。
        2.熟悉所使用的RDBMS的邏輯和物理體系結構,這裏指外部結構。從邏輯上來講,例如MSSQL Server數據庫引擎和實例之間的關係,實例和數據庫的關係。以及數據庫和其中的架構、對象的關係。物理上來講的話,有哪些工作進程,每個工作進程的職責。數據庫文件組的組成(mdf,ndf,ldf)。還要了解數據庫的各種活動,例如如何與客戶端通信(net library),使用什麼格式交換數據(TDS),數據庫運行週期中的活動(如check point)。
        3.熟悉內部體系結構。以MSSQL爲例,至少應該知道其組成:協議,查詢引擎、存儲引擎、SQL OS API。還應瞭解每個模塊提供了哪些具體的功能,是如何工作的。例如查詢引擎是如何處理索引的,以及如何進行表連接或則排序。還有存儲引擎是如何分別對待定長、變長、LOB數據的,以及聚集和非聚集索引的存儲機制,事務處理的機制。如果還想深入的話瞭解一下各模塊的實現。一般來說查詢引擎會比較複雜,存儲引擎是一個好的入口點(MySQL採用了插件式的存儲引擎機制,InnoDB是一個很好的學習資源)。

        對於一些數據庫的高級功能,我認爲開發人員並不需要投入太多的去了解,只要知道有這些功能就可以了。雖然說對於商業化的RDBMS來說很重要,但畢竟是附加功能(MySQL中有些村存儲引擎連事務都不支持還是有人用了)。核心的基本原理纔是重要的。把了解數據庫=會寫SQL是完全錯誤的,因爲就目前的大多數企業軟件系統而言數據庫都是核心軟件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章