SQL99是數據庫的一個ANSI/ISO標準。這個標準的前身是SQL92 ANSI/ISO標準,而SQL92之前還有一個SQL89 ANSI/ISO標準。它定義了一種語言(SQL)以及數據庫的行為(事務、隔離級別等)。你知道許多商業數據庫至少在某種程度上是符合SQL99的嗎?不過,這對於查詢和應用的可移植性沒有多大的意義,這一點你也清楚嗎?
SQL92標準有4個層次:
q 入門級(Entry level)。這是大多數開發商符合的級別。這一級只是對前一個標準SQL89稍做修改。所有數據庫開發商都不會有更高的級別,實際上,美國國家標準和技術協會NIST(National Institute of Standards and Technology,這是一家專門檢驗SQL合規性的機構)除了驗證入門級外,甚至不做其他的驗證。 Oracle 7.0於1993年通過了NIST的SQL92入門級合規性驗證,那時我也是小組中的一個成員。如果一個數據庫符合入門級,它的特性集則是Oracle 7.0的一個功能子集。
q 過渡級。這一級在特性集方面大致介於入門級和中間級之間。
q 中間級。這一級增加了許多特性,包括(以下所列並不完整):
n 動態SQL
n 級聯DELETE以保證引用完整性
n DATE和TIME數據類型
n 域
n 變長字符串
n CASE表達式
n 數據類型之間的CAST函數
q 完備級。增加了以下特性(同樣,這個列表也不完整):
n 連接管理
n BIT串數據類型
n 可延遲的完整性約束
n FROM子句中的導出表
n CHECK子句中的子查詢
n 臨時表
入門級標準不包括諸如外聯結(outer join)、新的內聯結(inner join)語法等特性。過渡級則指定了外聯結語法和內聯結語法。中間級增加了更多的特性,當然,完備級就是SQL92全部。有關SQL92的大多數書都沒有區別這些級別,這就會帶來混淆。這些書只是說明了一個完整實現SQL92的理論數據庫會是什麼樣子。所以無論你拿起哪一本書,都無法將書中所學直接應用到任何SQL92數據庫上。關鍵是,SQL92最多只達到入門級,如果你使用了中間級或更高級裡的特性,就存在無法“移植”應用的風險。
SQL99只定義了兩級一致性:核心(core)一致性和增強(enhanced)一致性。 SQL99力圖遠遠超越傳統的“SQL”,並引入了一些對象—關係構造(數組、集合等)。它包括SQL MM(多媒體,multimedia)類型、對象—關係類型等。還沒有哪個開發商的數據庫經認證符合SQL99核心級或增強級,實際上,據我所知,甚至沒有哪個開發商聲稱他們的產品完全達到了某級一致性。
對於不同的數據庫來說,SQL語法可能存在差異,實現有所不同,同一個查詢在不同數據庫中的性能也不一樣,不僅如此,還存在並發控制、隔離級別、查詢一致性等問題。我們將在第7章詳細討論這些問題,並介紹不同數據庫的差異對你會有什麼影響。
SQL92/SQL99試圖對事務應如何工作以及隔離級別如何實現給出一個明確的定義,但最終,不同的數據庫還是有不同的結果。這都是具體實現所致。在一個數據庫中,某個應用可能會死鎖並完全阻塞。但在另一個數據庫中,同樣是這個應用,這些問題卻有可能不會發生,應用能平穩地運行。在一個數據庫中,你可能利用了阻塞(物理串行化),但在另一個數據庫上部署時,由於這個數據庫不會阻塞,你就會得到錯誤的答案。要將一個應用部署在另一個數據庫上,需要花費大量的精力,付出艱辛的勞動,即使你100%地遵循標準也不例外。
關鍵是,不要害怕使用開發商特有的特性,畢竟,你為這些特性花了錢。每個數據庫都有自己的一套“技巧”,在每個數據庫中總能找到一種完成操作的好辦法。要使用最適合當前數據庫的做法,移植到其他數據庫時再重新實現。要使用合適的編程技術,從而與這些修改隔離,我把這稱為防禦式編程(defensive programming)。

轉譯 : http://codex.wordpress.org.cn/SQL99 

arrow
arrow
    全站熱搜

    黃彥霖 發表在 痞客邦 留言(1) 人氣()