在 PHP 程式設計上 ADODB 的使用率愈來愈高,但是很多人都搞不清楚自己為什麼要用 ADODB,甚至在各大 Open Source 論壇都會看到有人發表類似「ADODB = 跨資料庫保證書」的錯誤觀念。
我相信 ADODB 在使用上有九成以上(這是我自以為是的數據) 都只是連接單一資料庫而已。ADODB 身為 Database Abstraction Layer 已經算是相當盡責的讓程式設計師能更方便的存取資料庫,但是 ADODB 的部份功能都是要用龐大的效能來換取程式設計師的方便。
如果只是公司內部使用的程式,使用人數也不多的時候,程式設計師貪個方便使用像 GetInsertSQL、GetUpdateSQL 或是目前最新的 AutoExecute 這種簡便的更新資料庫方式也未嘗不可,但是對於同時間大量存取的網站,這類方便的方式就會轉為程式效能的致命傷。
至於 ADODB 的跨資料庫功能,沒看文件的人可能不知道在設計上的注意事項:
Portable SQL Tips with ADOdb
對於沒有實際接觸過各種不同資料庫的人,大概很難想像上面說的東西。要跨資料庫 (Cross-Database) 除了在程式要使用標準 SQL 語法(如 SQL-92、SQL-99 ..) 之外,有些資料庫並沒有像 MySQL 、M$ SQL 具備自動產生數量編號的功能 ; 甚至有的資料庫根本就不支援 JOIN,諸如此類的問題雖然 ADODB 都有考量進去,但是實際上有去注意及使用 ADODB 跨資料庫相關功能的人並不多,因此對於使用 ADODB 就代表程式跨資料庫的迷思真的應該要更正過來,尤其 OpenSource 的軟體除非官方作者明白表示該程式可跨資料庫,否則基本上應該都是只支援單一資料庫的。
如果是中大型企業的軟體,要跨資料庫更是難上加難。一般大型的商業資料庫必須藉由 Stored Procedure 或 Trigger 等功能來輔助其複雜的商業流程。因此像 ADODB 只是單純用組合 SQL Command 的方式來做 Cross-Database 也僅限於邏輯簡單、同時需要具備資料庫可攜性的軟體使用。
因此想跨資料庫不要指望 ADODB,把它當成一個簡單的存取介面就好。ADODB 本身所提供的跨資料庫功能不過讓使用者需要做資料庫移轉的時候,可以少花一點時間而已。如果沒有跨資料庫的需求,也不用為了「有可能」要跨資料庫就把自己的程式碼寫的綁手綁腳的。
雖然 ADODB 雖然模仿 M$ ADDOB 模仿有點不太像,但至少它給 PHP 使用者的方便性也是可圈可點的,也期待 ADODB 有更多更新更方便好用的功能。^^
7 comments On [PHP] ADODB ≠ Cross Database
假 OO 的 class 是 php 速度上的致命傷.
包了一層又一層的 class 是惡夢呀…
php 作者 rasmus 曾經說過,
一般寫法也可以寫出 php class 做東西,
為甚麼一定要用 oo 呢?
為了炫耀自己懂 oo
不過老實說,用 function call 牽過來連過去,
還是不如用 php class 包起來,看起來比較清爽,
將來要改 method 時也好找。
如果是極小、時限短的話,function call 就非常適合用來完成專案。
我用 OO 的目的其實大部分的原因是衝著 OO 的彈性與容易 reuse。OO 當然不是萬靈丹,對於一個專案有詳盡的了解和規劃才是最佳解。
Dear Neo…
請問一下,PEAR:DB跟ADODB那個比較好用呀…
看你的文章好像ADODB會耗很多系統資源..
但是好像有些文章提到ADODB的效率會比PEAR:DB…
這讓我有點困惑…既然很耗系統資源,效能為何會比PEAR:DB好呢…
煩請Neo解惑一下…
Kevin..
Kevin:
Sorry..PEAR::DB 我沒用過。
呵…
沒關係啦…還是謝謝你的回答…
没有auto_increment支持的数据库,可以像Drupal那样用sequences来自行记录ID