PHP - Schema-Database
新增內容: Database Row 簡介。
Schema-Database 是一個針對小型應用系統或嵌入式系統所設計的抽象資料庫存取層函數庫。 它提供一組 Schema class 用於組態資料庫表格與欄位,強化資料內容的型態檢查、格式檢查、解碼與編碼動作。 同時設計了兩種 class, Database_Query 和 Database_Row ,提供基礎的 Active Record 與 ORM 能力。這兩種 class 運用 PDO class 與 Schema class ,簡化資料查詢、存取和資料內容檢查動作。
我已經將此軟體放置到 Google Code 上。專案入口: PHP Schema and Database library。
日前看到 jaceju 在他的網誌上發表了一套小型的 PHP framework, GoEz Framework。他提到: 目前正在開發中的是通用型的 SQL 語法產生器
。我想到我手上也有那麼一套用於小型或嵌入式系統的函數庫提供了這一方面的功能,只是失業年餘,也就暫停維護了。正好看到 jaceju 有這個構想,於是我這個週末把我那套函數庫找出來,整理之後,放置到 Google code 繼續維護。
Wiki quick index
查詢範例
它的查詢動作如下:
如果你覺得這種語法很像 LINQ ,不用懷疑,我就是抄 LINQ 的。
資料更新範例
它也提供了基本的 ORM 功能,例如 :
我將資料庫的操作動作劃分成兩個類別,一個主要負責查詢,另一個負責新增、更新與刪除。
在應用系統中,大約有八成以上的資料庫操作動作是查詢。Database_Query
針對這種情形
提供了簡便的查詢語法,產生查詢句並執行之,取代我們自行組織 SQL 查詢句。
Database_Row
的查詢結果集只是一組含有記錄個體的普通陣列。我們讀取這些結果集的方法,
與使用其他 Database library 時的方式並無差異。
當我們需要更新或刪除查詢結果集的其中一筆記錄時,這時就輪到 Database_Row
發揮功用。
我們取出這筆記錄包入 Database_Row
,利用它的方法異動此筆記錄。
在小型應用系統中,我們幾乎不會批次異動整個資料結果集,Database_Row
只提供恰到好處的處理功能。
Database_Query 與 Database_Row 是互補的類別,同時也不干涉你原本的程式框架。
功能限制
這套 library 功能並不多。我覺得 PDO 已經夠抽象了,沒有必要再加一層,所以這套 library 只用 PDO 作為資料存取層,而不另行設計。但是它特別加上了 Schema 類別,強化資料內容的型態檢查、格式檢查、解碼與編碼動作。一但你將格式(pattern)、編碼(encoder)、解碼(decoder)動作組織到 Schema 後,它就會在必要之處運用它們,你不必再自己處理。
它雖然提供了類似 Active Record 或 LINQ 的查詢語法,但不支援聯結。它雖然提供了基本的 ORM 能力,但不支援會期(session)與交易(transaction)。這套 library 原本預期發揮作用的場合,是在小型或嵌入式系統。所以它不打算提供這種環境下用不到的資料庫功能。 如果你在極少數情況用到這套函數庫做不到的功能時,你也可以自行透過 PDO 去存取,這完全不會妨礙到 Schema-Database library 運作。
在適當的場合使用適當的工具。當你需要的資料庫操作功能遠遠超出這個函數庫所能支持者時,你應該尋找功能更完整的大型資料庫函數庫或開發框架。
2009-12-16
對於來自 Java 世界的朋友們,如果你習慣了重度的 ORM 操作,你也可以結合 Query 與 Row 來做事。
不幸的是,這會造成低落的效能; Java 環境差別不大,PHP環境差異較高。在實務上,我們查詢出來的資料項,超過九成以上不會被異動,我們只使用了它們的取值功能(getter)。就此結果而言,我們只是把包覆資料的 model object 當成一個比較高級的結構(struct)或雜湊表(hash table, assocation array)。在 PHP 的世界中,我們還是保持簡單的作法吧。
樂多舊回應