程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 展望微軟下一代數據庫系統

展望微軟下一代數據庫系統

編輯:關於SqlServer
微軟的下一代數據庫系統(代號Yukon)已經浮出水面。這一版本的數據庫系統有不少的新特色。比如它使用的Transact-SQL將更加符合ANSI-99 SQL的標准,查詢語句將更靈活,更富表達性。Yukon允許程序員用.NET的語言,比如C#,VB.Net來開發自定義函數(user-defined functions),存儲過程(stored procedures)和觸發(triggers)。另外它還支持W3的XQuery語言,支持XML等等。   

  在Yukon的醞釀和設計過程中,設計師對下一代數據庫系統的編程能力下了很多氣力。微軟內部的開發人員認為,下一代的數據庫系統一定要包括更多的對稱編程模式,對各種數據類型的查詢應該更靈活。所謂的對稱編程模式是指對於常見的數據庫操作,用戶應該可以使用XML,.Net或是傳統的T-SQL程序.  

  在這種設計思想的指導下,Yukon在許多方面有了大的拓展。首先,.NET的公用語言執行環境(CLR)被融合到了新的系統裡;第二,融合進來的.Net提供了很多強有力的數據庫對象;第三,XML在這版的數據庫裡得到了更好和更深的支持;第四,數據庫的服務器端提供了對XML查詢(XQuery)以及XML規范定義語言XSD的支持;第五,傳統意義上的T-SQL也得到了進一步的增強  

  新的編程模式和新增的語言一道使得數據庫應用的開發有了更豐富的選擇。新的體系結構使得我們更容易構造可靠的,可擴展的,穩定的應用,並且開發的效率也得到了極大的提高。Yukon中還引入了全新的服務代理(Service Broker),一種分布式的一部消息傳遞機制,現在讓我們先看看編程語言方面的增強。   

  Transact-SQL 語言的增強   

  Yukon對微軟的T-SQL有了很多的增強。用戶可以在Yukon的Online幫助中得到詳細的信息,限於便服,在此不一一列了。新增的特色表明了微軟對ANSI-99 SQL標准的進一步支持,同時也反映了對廣大用戶反饋意見的相應。新的增強主要是為了使查詢更富有表達性。有幾種新增的查詢可以很好的覆蓋用戶常用的一些查詢類型。比如說,遞歸查詢可以返回有層次機構的結果集合(hIErarchical resultset)或是a bill of materials。   

  Yukon提供了新的PIVOT和UNPIVOT操作。這些操作的輸入是表格類的表達式(table-valued expression),其輸出結果同樣是表格類型。PIVOT操作是將行轉變為列,並進行集合以及其他的數學操作。在輸入的表格中它將以一個給定的列為軸進行旋轉,其成生的表格的列是有不同值的原旋轉列。這種操作使得生成的表格變寬(設想一個5列100行的輸入表格,其結果可能是100列5行的表格)。UNPIVOT是PIVOT的逆操作。它將輸入表格的列轉換為行。其結果是使輸入表格變窄。   

  Yukon的異常捕捉和處理機制也有了很大的變化。它使用了和.NET一致的TRY/CATCH結構。導致交易終止的錯誤將會被捕捉並且處理。另外為了配合.NET的框架提供的安全,復制,提示服務以及XML等等功能(security, replication, Notification Services, XML),Yukon引入了不少新的語言構造。.Net在服務器端的技術也極大了影響了SQL數據庫的研制和發展。   

  在SQL服務器中使用.Net來編程   

  程序員可以在Yukon中使用和.NET兼容的高級程序語言進行開發,利用VB.NET,C#這一類的語言編寫自定義函數(user-defined functions),存儲過程(stored procedures)和觸發(triggers)。另外,利用管理程序(managed code)還可以開發自定義函數(UDTs),集合(aggregates),函數(functions)。公用語言執行環境(CLR)是.NET的核心,它是一切基於.NET開發的程序的運行平台。它提供了諸多的服務,比如實時編譯(just-in-time compilation),內存管理和分配(memory management and allocation),類型安全強制(type safety enforcement),異常處理(exception handling),線程管理(thread management)以及安全檢查(security)等等(CLR對於.NET程序就好比Java的虛擬機對於Java程序一樣)。在Yukon中,.Net程序將和在CLR中完全相同的方式運行。   

  將CLR整合到Yukon中的好處是顯而易見的。Yukon獲得了CLR的各種有益的功能,如自動的內存管理,資源分配,垃圾回收等等。Yukon提供了一套.NET assemblIEs,這樣允許程序員直接操作數據庫對象。數據的操作是通過一套特殊的ADO.NET來實現的。這些新的方法和原來的ADO.Net非常相似,程序員應該感到非常的熟悉和親切。

細一點說,我們可以把Yukno集成了CLR的好處歸結為以下幾點:  

  1.豐富了編程模式。CLR兼容的高級程序語言比T-SQL要豐富的多,也強大的多。它們提供的功能和特色是以往SQL程序員不敢想象的。此外,Yukon還提供了一系列的類庫(Framework APIs),這些類庫的功能比以前SQL內置的功能強大的多。 

  2.增強了安全性。管理程序運行於數據苦支持的CLR環境當中。這使得數據庫的對象比以往的擴展存儲過程(extended stored procedures)更安全。  

  3.用戶自定義的類型和集合。通過對CLR的集成,這兩個新增的對象擴展了SQL數據庫的查詢和存儲能力。  

  4.為今後的Visual Studio®開發環境指明了方向。今後程序員可以向開發其他.NET程序那樣用VB.Net或是C#這類的高級語言進行數據庫的開發,調試工作。  

  5.性能的增強。在一些情況下,.Net語言的編譯和執行可以提供比T-SQL更好的性能。   

  充分開發CLR的潛能   

  在以前的SQL數據庫應用的開發中,服務器端的程序被限制於T-SQL。而在新的Yukon中,由於集成了CLR,使得開發工作變得前所未有的容易和方便。像VB.Net和C#這類的高級語言,全面支持數組(Array),結構化的異常處理(structured exception handling)以及各種集合操作(Collections)。這些功能使得程序員可以編寫更復雜的邏輯和計算工作。   

  更突出的一點就是Visual Basic .Net and C# 是面向對象的語言,它們自身所具有的數據封裝(encapsulation),繼承(inheritance)和多態性(polymorphism)是T-SQL所不能比擬的。在大型系統的開發中,這種基於模塊化開發機制的優越性會更加明顯。它可以更好的組織你的源程序,增加代碼的重用性。將源程序按照邏輯關系編譯成不同的assemblIEs和n字域(namespaces)可以增強程序的組織性,讓程序員更方便的浏覽和使用已有的程序。   

  Yukon實現了三個層次的assemblIEs安全的管理控制。這種安全機制是對以往基於用戶驗證和授權機制和新的CLR安全機制的有機合成。新的三級管理層次為:   

  最高層次: 安全接觸(SAFE)。它只允許接觸和計算數據  

  次高層次: 外部接觸(EXTERNAL_Access)。它允許接觸外部的系統資源   

  最低層次: 不安全接觸(UNSAFE)。只要不對系統的穩定性造成影響,就不加限制。  

  在T-SQL和管理程序(Managed code)之間的取捨   

  管理程序非常適於進行數字密集型的計算和復雜的邏輯處理。.NET對於字符串 (String),規則表達式(regular expressions),錯誤捕捉等等有著更好的支持。另外.Net提供的上千個類(Class) 和方法可以在自定義函數(user-defined functions),存儲過程(stored procedures)和觸發(triggers)中很方便的使用。所以對於有大量字符創操作,數學計算,日期運算,系統資源存取,高級加密運算,文件操作,圖像處理或是XML的情形,管理的存儲過程,函數,觸發,集合要比傳統意義上的T-SQL等強大和簡潔。  

  使用管理的程序的另外一個好處就是類型安全。在管理的程序執行之前,CLR要對其進行檢查以保證它的安全運行。比如說,對於一個內存讀寫的操作,CLR要先進行檢


您正在看的SQLserver教程是:展望微軟下一代數據庫系統。查以保證在讀取的時候沒有寫操作在進行。   

  在准備編寫存儲過程,觸發,或是UDFs之前,你要權衡各種情況,在傳統的T-SQL和管理程序(Managed code)之間做出選擇。選擇的標准是你當前問題的具體特點。如果你的主要操作是數據存取以及相對簡單的邏輯運算,那麼T-SQL則非常合適。對於有大量數值計算以及復雜邏輯運算的情況,管理程序(Managed code)則更適用。   

  程序放置在什麼地方也是很關鍵的一步。T-SQL和管理程序(Managed code)都是在數據庫的引擎內運行。把.Net和數據庫緊密放置在一起可以有效的發揮服務器的硬件運算能力。當然最好是用SQL數據庫的Profile程序來測量一下你的具體程序的運行性能,然後再做出決定。Yukon的Profile程序有了進一步的增強。可以更深層次的測量SQL數據庫內的CLR的性能,並且會以更直觀的圖形方式來輸出對比測試結果。下面就讓我們來具體看看Yukon中新增的一些功能。

 

  用戶定義的類,函數和集合(User-defined Types, Functions, and Aggregates)   

  Yukno支持擴展的CLR的類系統。這些擴展的類可以在服務器端定義表(table),也可以在客戶端進行數據操作。用戶自定義類型(UTDs)允許用戶擴展已有的類。這些擴展的具體實現是用的管理程序(managed code)。比如說,你可以定義一些用於地理空間的類型,一些特殊的金融類型或是特別的時間日期類型以適應你獨特的要求。  

  用.Net的術語來說,UTDs是結構(struct)或是參考類型(reference type),而不是類(class)或枚舉(enum)。這意味著內存的是用是由CLR控制優化的。不過,UTDs不支持繼承和多態性(inheritance and polymorphism)。它可以有公用或是私有函數(public and private functions)。事實上,諸如限制檢查(constraint checking)應該由私有函數來完成。舉例來說吧,如果你想定義一個地理空間的類型,這可能包含經度,緯度也許還有高度信息,你可以定義相應的私有成員來完成這一任務。這類型創建完成後,你可以把他注冊到SQL數據庫中。這個被編譯的DLL就會被存放在SQL數據庫中。   

  用戶自定義函數(UDFs)有兩種類型:一種是標量值型的(scalar-valued),這種函數返回單一的值,如字符串,整數,比特等等。另外一種是表格值型的(Table-valued)。這種函數返回有一個或多個列組成的數據集合。   

  Yukon允許用戶定義新的集合(aggregate)操作的能力遠遠超過了以前的版本。用戶用管理語言開發的集合可以被T-SQL或是其他的管理語言調用。這些新開發的集合是.Net的類,它可以引用數據庫中存在的其他編譯好的類庫(Class Library)。你可以使用用戶定義的集合將數據庫中的數據轉化為數值型變量。比如你最近的一次用戶調查的數據存放到數據庫中,通過一個用戶定義的統計函數你可以得到加權平均或是標准偏差。   

  管理的存儲過程   

  這是一種管理程序,其工作方式就像傳統的存儲過程一樣。如果你希望返回一個簡單的數據集和(resultset)或是只是進行一個數據操作(使用DML或是DDL)。一旦被注冊到數據庫中,那麼使用它就像是用一個普通的存儲過程那樣。將一段管理程序包裝成存儲過程的語法如下(基於現在早期的Yukon版本)  

  CREATE PROCEDURE mysproc (@username NVARCHAR(4000))

  AS

  EXTERNAL NAME YukonCLR:[MyNamespace.CLRCode]:: myfunction

  (未完)

XML和Yukon數據庫   

  對XML的支持開始於SQL 2000。這個版本的SQL可以將關系數據以XML形式返回;從XML批量載入數據;分享XML文檔;將數據庫對象發布成為基於XML的Web services。Web services的開發工具SQLXML 3.0對存儲過程,XML,以及SQL的UDFs提供了Web services的支持。SQL 2000對於XML支持的不足之處在於缺乏內部的XML存儲機制以及復雜的查詢半結構化數據的能力。Yukon在這兩個關鍵問題上有了長足的進步。   

  XML數據類型   

  XML是從一種表達型的技術演化而來,到現在XML以被視為一種存儲信息的方式。如何保存XML變成了一個非常有趣的話題。XML文檔可以在應用程序中有很多不同的使用。   

  1.當你不知道XML規范(schemas )的時候;   

  2.當XML規范是動態變化的時候(dynamic schemas);   

  3.XML的保存是應用程序的中心。   

  很難用一個例子來說明XML的應用方法和方式。在下文中給出的例子中,XML被作為一種存儲形式,使用動態規范(dynamic schema)來表達客戶從網上訂戶的信息。   

  XML數據類型是一個很完備的(full-fledged)。它有其他SQL數據類型的一切能力。同時,作為一個完備的數據類型,XML是可以被索引的。它可以通過XSD schema對行和列的值加以限制(constraints)。它還可以被T-SQL中嵌入的XQuery查詢。此外,使用XMLdt::modify方法,用戶可以增加,刪除子樹和更新標量值(update scalar values)  

  XML數據是非常靈活的。

你可以選擇是否要對這個XML列關聯一個規范定義(XML Schema Definition,XSD)。如果你選擇了XSD,那麼這個列成為有類型的XML(typed XML)。如果沒有相應的XSD,那麼這個XML稱為沒有類型的XML(untyped XML)。輸入XSD到一個表格的XML列,可以類型這個列。XSD可以被用來生成索引以及其他一些系統目錄(system catalog)所需要的要信息。有類型的XML比沒有類型的XML可以更快和更有效的操作。   

  要注意的是你可以在一個列中存儲整個XML文檔或是其中的一部分。另外,你還可以對這個列生成特殊的XML索引。這樣就對XML中的標簽(tag), 值(value)何路徑(path)生成了索引。   

  XSD and XML數據類型   

  當創建你的XML列時,以可以加入XSD文檔並將之和你的列聯系起來。XSD schema的聯系在SQL的Workbench中完成。(使用DDL也可以完成這一聯系)  

  當一個schema輸入到數據庫中的時候,它會被分解為不同的組件(component),包括元素(ELEMENT),屬性(ATTRIBUTE),類別(TYPE),屬性群(ATTRIBUTEGROUP)等等。這些部分以及相關聯的字域(namespaces)被存到系統的不同表格當中去。你可以用系統專用的視圖來看這些組件。也就是說,schema不是原封不動被存儲的。至少有兩個分支產生。一是schema的標簽(Tag)和屬性沒有被保存,二是一旦schema被輸入到數據庫中,它不能保證可以還恢復到原先的樣子。所以你最好保存一份原先的schema,或是將其存放到一個專用的表格中去(對於這個任務,XML列就是非常勝任的)。另外一個辦法是使用內置的函數XML_SCHEMA_NAMESPACE來得到XML schemas。   

  當XML列和XSD schema組合的時候,XML數據的查詢能力就是對普通關系數據的一個補充。將所有的數據保存為XML形式是不必要的,但是利用數據庫的XML能力確實方便了XML文檔的管理以及其他一些應用。  

  XQuery   

  XML查詢通常被稱為XQuery。它是一種智能的可靠的語言,專門用於查詢各種XML數據。使用XQuery, 你可以用相應的方法查詢XML數據的變量和列。使用最新的創新性的查詢方法,你可以對關系型數據以及XML數據進行統一查詢。  

  我們知道XML有許多的標准。在Yukon的XQuery研發過程中盡量的遵循W3C的標准。XQuery的起源是個叫做Quilt的查詢語言。它是一種基於多種技術之上的查詢語言,比如XPath 1.0, XQL, and SQL。它同時還包括了XQuery 2.0的一


您正在看的SQLserver教程是:展望微軟下一代數據庫系統。部分。你可以繼續使用你的XPath的知識,不過Yukon有了許多的增強,你也許想要學習這些新的東西。比如一些支持循環,排序等操作的新函數。  

  XQuery申明語句(Statement)包括一個導引和主體(a prologue and a body)。導引中包括一個或多個字域申明以及其他產生查詢內容的規范(schema)的引用。主體包括一系列的表達式用來說明查詢的條件。這些申明語句可以在query, value, exist, or modify這樣幾種方法中對使用。   

  XQuery可以查詢有類型的XML(typed XML),及有相應的規范(schema)的XML,它還可以查詢一般的XML文檔   

  微軟的XQuery設計程序 -- XQuery Designer  

  XQuery Designer是一個繼承在SQL Server Workbench得一個應用程序,用以簡化XML工作的難度。它可以幫助你寫出對XML列以及XML文檔查詢的語句。其核心目的是使程序員不用大量學習XML的許多知識而容易的駕馭XQuery。

  到這裡,大家對Yukon中的.Net以及XML的能力有了一個大概的了解。組合使用這些技術可以很方便的解決以前認為是相當復雜的難題。Yukon的開發重點是分布式應用。商業應用的流程和邏輯將直接反映在數據庫程序當中。Yukon還對基於Web的應用有非常好的支持。   

  Yukon的服務代理(Service Broker)   

  SQL數據庫的服務代理可以讓內部和外部的進程通過擴充的或是普通的T-SQL DML發送和接收有保證的,異步的消息。消息可以被傳遞到和發送者共享一個數據庫的隊列中去,或是同一個SQL進程的其他數據庫中去,甚至是本機或是異機其他數據庫進程的數據庫中去。   

  在以往的消息系統中,應用程序要負責消息的收發和協調工作。消息的復制,同步以及次序的維護都是比較棘手的問題。

 

  SQL數據庫的服務代理通過自動維護消息次序,唯一的發送和會話標志很好地解決了這一難題。一旦兩個服務間的對話建立起來,兩端的程序被保證一個消息只接收一次,並且接收順序和發送順序一致。這樣你的程序不需要額外的語句就可以保證一個消息只被處理一次。SQL數據庫的服務代理自動為每一個消息加上一個唯一的標志。一個應用程序總可以知道某個消息是屬於哪一個會話。  

  服務代理將要發送的消息放到隊列中去。如果接收方一時沒有准備好,那麼消息會被保存在這個隊列中。服務代理不停的試發消息,直到消息被接收方受到為止。這樣可以保證會話的可靠性。即使接收方在一段時間內沒有響應,消息也不會遺失。這種發送和接收方松散連接的模式使得雙方都有很大的靈活性。發送者只要將消息放到隊列中就可以返回去繼續他的工作。消息會由服務代理保證發送到接收方手裡。一個消息可以發到多個接收者手裡。這些接收者可以獨立的並行處理消息。其快慢可以根據當時服務器負荷程度而定。   

  隊列還可以使得處理工作更均勻的分配,從而減少服務器負荷的大起大落。這樣從總體上提高了應用的性能和吞吐量。比如說,訂貨的高峰總出現在每天中午。這種高峰增大了系統資源消耗,延長了處理時間。如果使用了服務代理,那麼在接收訂貨的時候並不需要馬上完成所有的處理工作。許多工作可以在後台慢慢處理。只要先保證客戶的訂單可以順暢的收到就可以了。   

  消息處理程序的一個難點就是如何實現讓多個程序從同一個隊列中並行讀取消息。因為操作不當就會造成消息處理次序混亂,盡管收到的順序是正確的。   

  試想這樣一個典型的應用。含有如何生成訂貨頭部信息的A消息和含有如何生成訂貨明細條目的B消息被放置在一個隊列中。如果他們被不同程序從隊列中取走進行處理。很可能B消息的處理程序進行得快而首先試圖確認(commit)。但是由於頭部信息還沒有准備好,所了確認一定會失敗。這樣B消息就會被重新放置到隊列中等待再一次處理。這顯然是一種浪費。以往對於這種問題的解決辦法就是將A消息B消息合並為一個消息。對於簡單的兩個消息這種辦法還可以,但如果對於有上百個消息的復雜情況,這種辦法顯然就不適用了。   

  服務代理通過鎖定屬於一個任務(Task)的所有消息來解決這個難題。這樣這些消息只能被一個處理程序接收和處理。而同時其他處理程序可以接收和處理屬於其它任務的消息。這種機制保證多個處理程序可以可靠和有效的並行工作。 

  服務代理的一個最有用的功能就是“激活”(activation)了。激活可以在收到消息的時候自動啟動消息處理程序。如果消息來的速度大於處理的速度,那麼多個消息處理程序就會被啟動,直到達到了配置允許的最大值。如果消息來的速度減慢或是已經沒有消息等待被處理了,那麼消息處理程序將會被關掉。這樣消息處理程序的數量將根據消息的數量和收到的速度自動動態的調節。如果系統崩潰或是重啟動,在系統恢復過來以後,消息處理程序會自動啟動來處理積壓的消息。以前的消息處理系統做不到這一點,所以消息處理程序不是太多就是太少。  

  服務代理和數據庫的集成   

  集成的服務代理提供了性能上的以及管理上的好處。和SQL數據庫的集成使得交易式的消息傳遞成為可能。也就是說消息接收,處理和返回這樣一個循環變成了一個數據庫的交易,如果中間有一個環節出現錯誤,所有的工作將會被放棄,接收到的消息重新進入處理隊列以被再一次處理。直到交易最終完成以前,沒有任何動作會產生效應。這樣應用程序將始終保持一個一貫的狀態,並且不會引入分布式交易處理的復雜性和過多的資源消耗。 

  當數據,消息和程序的邏輯全部存在與數據庫中的時候,管理工作也變得相對容易。象災難恢復,簇建立(clustering),安全控制,備份這些管理工作只需要面對一種東西而不是3種或4種分散的組件。比如說,在以前的消息系統中,消息存儲和數據庫可能會出現不一致。如果其中一個從備份上恢復過來,那麼另外一個也必須從同一時間的備份上恢復過來,否則數據就會變得不統一。當數據和消息被數據庫統一處理後,這個問題就變得不再是問題了。  

  使用統一的開發環境也帶來不少好處。應用程序的消息處理部分和數據存取部分可以用統一的語言來完成。對於已經熟悉數據庫開發的程序員,這可以極大的降低消息處理部分開發的難度。實現服務代理的存儲過程的可以用傳統的T-SQL或是.Net兼容的高級語言來開發。   

  另外,數據庫的集成使得資源的自動管理成為可能。服務代理運行於SQL數據庫的空間之中,這樣代理就可以對該數據庫進程中所有的已經傳遞的消息有一個集成的全局的視角。這樣各個數據庫可以維持自己的消息隊列,而在全局上又盡可能保證資源分布的相對合理。   

  Yukon數據庫應用開發的一個具體實例   

  我們假設有這樣一個應用:用戶在網上訂購你公司的產品。這個在各個服務之間傳遞的消息存放在XML列中。為簡易起見,我們把這個應用程序想象為SQL數據庫中CLR運行的一個基於ASP.Net的Web service。

這個服務和其他的伙伴傳遞客戶訂貨的消息。使用XML列來存儲消息可以封裝和簡化XML的Schema.   

  當客戶的訂貨確定後,包含這個訂貨信息的消息被放置到訂貨隊列中去並放置在XML列中。這樣這個訂貨的所有信息就被存放到一個列中。   

  訂貨隊列是交易得開始。他接到消息並處理它。它向信用校核服務發送一個請求。如果客戶的信用沒有問題,那麼它就進行下一步的操作。   

  下一步是檢查現有的庫存。一個XQuery來查詢庫存情況。如果有庫存,那麼操作走向下一步,發貨。  

  在發貨步驟中,一個T-SQL的存儲過程使用XQuery來解讀這個XML消息,客戶的信息被提取出來以生成發貨單。當發貨完成後,這個消息就被轉到收款服務處。   

  但收款服務受到這個消息後,它更新客戶訂貨的狀態,指明貨物已經被發送。   

  另外,所有進出訂貨服務的消息都被寫到一個審計表格中以備將來可能的審核以及錯誤更正。

  從這個小例子中你可以看出,Yukon是如何集成使用XML,CLR,服務代理,增強的T-SQL來構建一個可靠的,可擴充的完備的數據庫應用。   

  結論:   

  以上介紹的只是Yukon中一些令人振奮的新特色和功能。數據庫開發人員如今有了更多的選擇。上一個小例子示范了一部分Yukon中新增的能力。更多的特色和功能還有待於我們進一步挖掘!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved