[英]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或基於抽象/有限的sql語法生成目標特定的sql。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.