資料庫的跨平台設計

來源:互聯網
上載者:User
設計|資料|資料庫 開發人員們應該知道,使用那些非標準的SQL命令(比如Oracle、微軟和MySQL等資料庫系統)存在程度相當高的危險。也就是說,從跨平台和遵守標準的角度出發,你應該盡量採用ANSI SQL,它是一種和平台無關的資料庫語言。不管你在使用哪種資料庫系統,如果它完全支援SQL那麼它就應該支援ANSI SQL-92標準。可是,“應該支援”和“確實支援”完全是兩碼事。在進行DBMS跨平台編程的時候,並不是所有的系統都完全支援ANSI SQL標準。這篇文章主旨就是提出使用非標準SQL時所存在的風險及其相關的建議。


別使用預存程序

在某些編程環境下,出於效率和安全等方面的原因,預存程序成為程式員開發資料庫應用程式的唯一方法。Visual Basic、C和Java程式員都並不需要瞭解SQL。然而,在其他某些編程環境下,預存程序又是完全禁用的。MySQL通常和Apache Web伺服器組合使用,這是因為這兩種軟體不僅免費、可靠而且功能強大,但是,恰恰是MySQL不支援預存程序。


--------------------------------------------------------------------------------

預存程序的定義 
所謂預存程序就是組成一個邏輯單元而且執行特別任務的一組SQL語句。預存程序用來封裝針對資料庫伺服器的一整套操作或查詢。

--------------------------------------------------------------------------------

Oracle和SQL伺服器兩者都包括了“內建”的預存程序,其使用也是很方便的。可是,如果明智的話千萬別指望它們,你無法保證資料庫管理員是否鎖定、刪除或修改了這些預存程序。如果你發現可用的某些預存程序正是你需要的,你這才可以在自己的代碼中使用它們的功能。

通常,你能在Oracle或SQL Server上使用預存程序但在MySQL上則無法利用。如果你確實用到了它們,那麼你得保證自己沒有用到同特定平台相關的命令(以後討論)。

別使用串連
串連是Oracle和SQL Server 這兩種DBMS上令人頭痛的一個問題,因為這兩種系統在串連的概念上有根本的不同。基本上,各個DBMS的串連工作原理不總是一樣的,而且你最終可能會得到意外的結果集合。在我們談論各個系統有關串連的概念差別以及如何解決這些問題之前,你應該理解基本的串連子句:

串連
Join(串連)是從多個資料來源擷取資料的SQL資料表建立命令。 
等串連
Equi-Join從兩個獨立的資料來源擷取資料並把它們組合成一個大表。 
內/外串連
內串連(Inner Join)把兩個表的內部列串連起來。外串連把兩個表的外部列串連起來。 
左/右串連
左串連(Left Join)串連兩個表左邊的列。右串連則串連兩個表右邊的列。 
複合/複雜串連
其他各種串連—左/內、左/外、右/內和右/外等。 
反正你得記清楚了,如果你想要自己的應用程式能在各種資料庫伺服器上都能工作那麼就別使用串連。

ANSI SQL:CREATE, DROP, ADD, UPDATE, DELETE, INSERT, SELECT
總之,你應當用到的唯一命令如下: 

資料定義語言 (Data Definition Language)(DDL)下的CREATE 和DROP。 
資料操作語言(DML)下的ADD、UPDATE、DELETE和INSERT 。 
擷取資料的SELECT。 
如果你在這些命令中使用了區分大小寫表格或欄位名,或者這些名字包含了空格或其它特殊字元,那麼你最好用方括弧把名字圍起來。這樣做有助於防止非標準字元引發DBMS的不正常反應。



引用的完整性:鍵和資料類型

使用關聯式資料庫的決定性原因就是明確資料之間的關係而且維持那些關係的完整性。這樣才能讓開發人員以最小的冗餘性、最高效的方式儲存資料。鍵定義了關係。資料類型定義了儲存和操作資料的規則。這些就是一個資料庫的基本方面,但是具體的文法卻可能因為資料庫的不同而不同。

資料類型
只有很少部分的資料類型得到所有資料庫伺服器的支援。每一種DBMS都有它自己的資料類型以及為什麼要這樣使用它們的原因。某些專有資料類型(比如Microsoft Access的AUTONUMBER)用起來確實相當方便。

以下是ANSI資料類型:
BIT, CHARACTER, DATE, DECIMAL, DOUBLE PRECISION, FLOAT, INTEGER, INTERVAL, NUMERIC, REAL, SMALLINT, TIMESTAMP, TIME, VARBIT, VARCHAR, CHAR

以下是Oracle/Access/SQL不支援的“標準”資料類型:
INTERVAL, TIME, VARBIT

只有Oracle才支援DATE,但是以下的“標準”資料類型不被Oracle支援:
BIT, DECIMAL, NUMERIC, TIMESTAMP

以下的“標準”資料類型不被Access支援:
BIT, CHARACTER, DATE, NUMERIC, SMALLINT, TIMESTAMP

這樣,只有以下的資料類型可以保證在各類資料庫上都能使用:
DOUBLE PRECISION, FLOAT, INTEGER, NUMERIC, REAL, SMALLINT, VARCHAR, CHAR



主/外鍵

假設某個表內有兩個欄位,建立這個表的文法如下: 
CREATE TABLE [MyTable] ([FieldA] VARCHAR, [FieldB] VARCHAR);

為了添加主鍵以便表內的每一條記錄都唯一標識你可以採用PRIMARY KEY 運算式:
CREATE TABLE [MyTableA] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR);

在建立另一個表,其中一個欄位索引第1個表,你可以把該欄位定義為同第1個表的欄位具有關係的外鍵:

CREATE TABLE [MyTableB] ([RecordID] VARCHAR PRIMARY KEY, [FieldA] VARCHAR, [FieldB] VARCHAR, [FieldC] VARCHAR REFERENCES [MyTableA]([FieldA]))

在以上例子中,所有的欄位都是VARCHAR類型;但是你得記住,某一資料類型欄位只能索引同一資料類型的欄位。


ODBC 和 JDBC
如果你在編寫的應用程式要用到SQL資料庫連接,那麼你可以用ODBC完成該功能。如果它是一個Java應用程式則可以用JDBC(簡而言之就是ODBC的Java介面)。

因為你希望自己的應用程式最好不要引起管理員的注意,所以你應該為你使用者的DBMS包括所有必要的ODBC驅動程式。這樣,如果使用者從一個平台轉移到另一個平台,它們所需要的驅動程式卻已經事先擁有了。

你的應用程式應該通過編程的方式決定當前用到的ODBC驅動程式對應何種DBMS。這樣你才能用上那些資料庫伺服器上強大的、同特定平台相關的命令。

另類瀏覽器之戰 
最流行的瀏覽器當然是微軟的Internet Explorer和Netscape的Navigator了。但是,不管你手頭用的是哪一種,它能保證支援現有的所有網站嗎?錯!很多花哨的東西,比如DHTML、架構以及多媒體等等都各自受到兩類瀏覽器中非標準的HTML標籤的支援。

因為程式在這兩種國際標準的岔路口無所適從,所以你必須為兩種瀏覽器編寫代碼或者編寫最具普遍性的功能代碼而放棄大量的動態內容。

資料庫伺服器也面臨同樣的問題。ANSI SQL-92是人人贊同的標準。然而,Oracle、微軟以及其他資料庫廠商還自作主張加入了很多破壞SQL代碼的特性。因此,你不僅得編寫遵從基本規範(SQL-92)的代碼,而且的代碼還得根據具體用到的產品實現不同的特性。

在你自己的應用程式內,你必須正確地決定應用程式將使用什麼類型的資料庫,而且資料庫應該定位在哪裡。你還得老練地處理應用程式或使用者產生的任何錯誤。你當然不希望僅僅因為檔案被刪除或者網線串連鬆弛就導致程式崩潰(或伺服器崩潰)。在經過精心設計的網路上,資料庫伺服器通常同工作站和Web伺服器、應用伺服器在物理上相分離,因此中斷連線是很常見的。

小結 
作為Web開發人員,你需要對應用程式使用非標準SQL命令的危險保持高度的小心。這篇文章的中心思想是建議用ANSI SQL編寫跨平台的應用程式。利用ANSI SQL減少商務資料庫系統的非標準方言所帶來的頭疼問題。


相關文章

Cloud Intelligence Leading the Digital Future

Alibaba Cloud ACtivate Online Conference, Nov. 20th & 21st, 2019 (UTC+08)

Register Now >

Starter Package

SSD Cloud server and data transfer for only $2.50 a month

Get Started >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。