簡體   English   中英

數據庫抽象 - 支持多種語法

[英]Database Abstraction - supporting multiple syntaxes

在我正在開發的PHP項目中,我們需要創建一些DAL擴展來支持多個數據庫平台。 我們遇到的主要缺陷是不同的平台有不同的語法 - 值得注意的是MySQL和MSSQL是完全不同的。

什么是最好的解決方案?

以下是我們討論的一對夫婦:

基於類的SQL構建

這將涉及創建一個允許您逐位構建SQL查詢的類。 例如:

$stmt = new SQL_Stmt('mysql');
$stmt->set_type('select');
$stmt->set_columns('*');
$stmt->set_where(array('id' => 4));
$stmt->set_order('id', 'desc');
$stmt->set_limit(0, 30);
$stmt->exec();

盡管如此,它確實涉及很多行。

SQL語法重新格式化

此選項更清晰 - 它將讀取SQL代碼並根據輸入和輸出語言重新格式化它。 然而,就解析而言,我可以看到這是一個慢得多的解決方案。

一個解決方案可能是為不同平台提供不同的查詢集,其ID類似於

MySql:GET_USERS =“SELECT * FROM users”

MsSql:GET_USERS = ...

PgSql:GET_USERS = ...

然后在啟動時加載所需的查詢集,然后引用

DB:loadQueries(平台):

$ users = $ db-> query(GET_USERS)

這樣的方案不會考慮SQL提供的所有豐富性,因此對於每個DB的所有表,使用代碼生成的存儲過程會更好。

即使你使用更具數據庫模型意識的參數化存儲過程(即它們確實加入或者是用戶感知的,因此針對每個供應商進行了優化),這仍然是一個很好的方法。 我總是將數據庫接口層視為為應用程序提供的不僅僅是簡單的表,因為這種方法可能帶寬密集且往返浪費。

我建議使用基於類的SQL構建,並推薦DoctrineZend_DbMDB2 是的,如果需要更多行來編寫簡單的選擇,但至少你需要依賴解析器而不需要重新發明輪子。

使用任何DBAL都是速度的折衷,而不僅僅是數據庫的執行,但是當你第一次使用它們時,它會比你真正熟悉它時更痛苦。 此外,我幾乎100%確定生成的代碼不是最快的SQL查詢,但這是我之前所說的權衡。

最后,這取決於你,所以盡管我不會這樣做並且肯定不是不可能的,但問題仍然存在,如果你實際上可以通過實施自己的DBAL來節省時間和資源(從長遠來看)。

如果您有一組支持它的后端,我同意生成存儲過程以形成合同是最好的方法。 但是,如果您的后端在存儲過程方面的能力有限,則此方法不起作用,在這種情況下,您構建一個抽象層來實現SQL或基於抽象/有限的sql語法生成目標特定的sql。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM