Data Object & Table Class

1,181 views
1,135 views

Published on

Published in: Design, Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,181
On SlideShare
0
From Embeds
0
Number of Embeds
6
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Data Object & Table Class

  1. 1. DataObject & Table Class 2009.05.26
  2. 2. 摘要 <ul><li>更新 DataObject ,增加更多種資料型態。 </li></ul><ul><li>更新 DataObjectHandler ,使開發者建立資料表的基本 Handler 時,減少部署時間。 </li></ul><ul><li>增加 Table 類別,配合 DataObjectHandler 的更新,使資料表與資料物件間的關係更緊密。 </li></ul><ul><li>增加 DataObjectCompose 類別,能將數個 DataObject 合併,與 DataObjectHandler 進行關聯查詢並傳回資料時,將資料放入 DataObject(Composed) 以方便後續的處理。 </li></ul><ul><li>增加 TableRelation 類別與 DataObjectRelationHandler 類別,提供基本的關聯查詢。 </li></ul>
  3. 3. DataObject 類別增加多種資料型態 <ul><li>在這次的版本中, DataObject 加入了多種資料型態,除了基本的資料變數型態的設置,還包含資料傳遞時的過濾與檢查,新增的型態如下: </li></ul><ul><ul><li>XHTML – XHTML 文件內容 </li></ul></ul><ul><ul><li>UNIXTIME – UNIX 的時間戳記 </li></ul></ul><ul><ul><li>DATETIME – 日期 + 時間的格式,格式可自訂 </li></ul></ul><ul><ul><li>DATE – 日期格式 </li></ul></ul><ul><ul><li>TIME – 時間格式 </li></ul></ul><ul><ul><li>OPTIONS – 自訂選項 </li></ul></ul>
  4. 4. DataObjectHandler 類別 ( 一 ) <ul><li>原本為抽象類別,須繼承後覆寫 get , insert , update , delete 等抽象函數,現在改為一般類別,結合 Table 類別後,提供基本的資料表存取函數: </li></ul><ul><ul><li>Get($id) – 依 Primary key 取得一筆資料 </li></ul></ul><ul><ul><li>Create($is_new) – 建立對應的 DataObject ,存放及管理對應的資料 </li></ul></ul><ul><ul><li>GetObjects($criteria) – 取得數筆資料,可自行指定條件 </li></ul></ul><ul><ul><li>GetCount($criteria) – 依照指定條件,計算符合條件的資料筆數 </li></ul></ul><ul><ul><li>Insert($object) – 新增或修改資料 </li></ul></ul><ul><ul><li>Update($codition, $criteria) – 自行指定欄位及資料並依照自訂條件進行資料更新 </li></ul></ul><ul><ul><li>Delete($mixed) – 主要用於刪除資料,可依據傳入的參數進行各種條件的刪除動作,接受 $int_id, $object, $criteria 三種參數型態 </li></ul></ul>
  5. 5. DataObjectHandler 類別 ( 二 ) Class Diagram Old Class New Class Class Diagram
  6. 6. Table 類別 <ul><li>針對各個資料表進行相關資料的定義,如資料表名稱、主鍵、索引鍵、唯一鍵等。用於 DataObjectHandler 正確產生對應的 SQL 子句,以提供基本的 Handler 函數 [ Get() , Insert() ...] 。 </li></ul>Class Diagram
  7. 7. 繼承 Table 類別 <ul><li>以 User 資料表為例,進行設定資料表名稱 (user) 、主鍵欄位名稱 (user_id) 、唯一鍵欄位名稱 (user_name) 以及可排序的欄位名稱 (user_unick) ,可排序的欄位不限定數量,且自動包含主鍵、索引鍵、唯一鍵。 </li></ul>Source Code Class Diagram
  8. 8. 取得 DataObjectHandler 物件 <ul><li>透過 getHandler 函數,傳入 Handler 名稱可取得對應的 DataObjectHandler ,以 User 資料為例,將會自動引入 UserTable 物件,產生專用於 User 資料的 DataObjectHandler 。若需擴充 DataObjectHandler 的函數時,可自訂 UserHandler 類別並繼承 DataObjectHandler ,於 getHandler 函數將會自動判斷 UserHandler 是否存在來實體化 UserHandler 或 DataObjectHandler 。 </li></ul>Source Code
  9. 9. DataObjectCompose 類別 ( 一 ) <ul><li>使用合成方法的 DataObjectCompose ,將一個以上的 DataObject 物件合成為一個 DataObject 物件。主要用於關聯查詢時,需涉及多個資料表欄位,因此將數個 DataObject 合併後,可存放對應的資料,並且仍然提供 DataObject 原本具有的函數,以利後續的資料處理,例如 getValues() 時,會依據資料型態的不同進行資料轉換,或是 cleanVars() 進行資料檢查過濾。 </li></ul>Source Code
  10. 10. DataObjectCompose 類別 ( 二 ) Class Diagram 1 2..*
  11. 11. 實作自動產生關聯查詢 <ul><li>建立 TableRelation 與 DataObjectRelationHandler 類別來實作自動產生關聯查詢的函數,由於關聯查詢屬於較複雜的 SQL 子句,因此會大幅增加程式的複雜度,因此在這次的版本中,尚未加入成為正式的類別。 </li></ul><ul><li>以下將對幾個類別與方法進行介紹: </li></ul><ul><ul><li>TableRelation 類別 </li></ul></ul><ul><ul><li>TableRelationColumn 類別 </li></ul></ul><ul><ul><li>TableRelationColumnCompose 類別 </li></ul></ul><ul><ul><li>DataObjectRelationHandler 類別 </li></ul></ul><ul><ul><li>getRelationHandler 函數 </li></ul></ul>
  12. 12. TableRelation 與 DataObjectRelationHandler 類別 Class Diagram 1 2..* getRelationHandler($handler_name)
  13. 13. 實際使用 TableRelation 類別 <ul><li>使用 TableRelation 類別需建立新的類別並且繼承後才能進行被保護 (protected) 函數的調用。 </li></ul><ul><li>以下以範例進行說明:建立 UserRelationTable 繼承 RelationTable 後,使用 setTableObject 函數新增關聯的資料表物件,如 UserTable , GroupTable ; 接著使用 createTable(s)Relation 函數建立一組以上的關聯條件及設定關聯名稱以便後續調用, createTable(s)Relation 將會回傳 TableRelationColumn 物件或 TableRelationColumnCompose 物件,並使用該物件函數 setRelation 進行關聯欄位的條件設定即可自動產生對應的關聯查詢物件 (DataObjectRelationHandler) ; 呼叫 getRelationHandler 函數取得對應的 Handler 並開始使用它進行資料表查詢 ( 僅限查詢 ) 。 </li></ul>
  14. 14. 文獻探討 - 自動產生關聯查詢 ( 一 ) <ul><li>雖然自動產生關聯查詢可以帶來許多開發時的便利,節省許多時間,但由於是自動產生的 SQL 子句,在靈活度上勢必比不上親自撰寫 SQL 語法。以此依據作為考量的情況下,參考其他 Framework 的實作方法與使用者情況: </li></ul><ul><ul><li>CakePHP : 提供完整的查詢方法,包含 JOIN 子句或一般關聯方法等,對於中小型專案開發上,能提供便捷的幫助,但在其相關的社群網站中,可常見使用者分享「資料庫結構較為複雜」或「資料筆數較多」時,自動產生的 SQL 子句對於查詢效能上明顯不足,仍建議開發人員自行撰寫 SQL 語法。 </li></ul></ul><ul><ul><li>Zend Framework : 僅提供基礎的查詢類別,可自動產生簡易的查詢語法,保留較高的彈性由開發人員自行擴充,應用範圍較廣,使開發應用上,較不易與 Framework 本身脫離。 </li></ul></ul>
  15. 15. 文獻探討 - 自動產生關聯查詢 ( 二 ) <ul><li>由上述兩個案例中可得知自動產生關聯查詢雖然方便,但也有可能造成使用者的不適用,因此在這次的版本當中,尚未加入關聯查詢的相關類別,而由開發人員自行定義關聯查詢函數 ( 繼承 DataObjectHandler) ,並運用 DataObjectCompose 類別來對應關聯查詢的結果以進行後續處理。目前關聯查詢的相關類別已接近可運作階段,但仍將暫停自動關聯查詢的分支版本開發,待未來整體進度較為成熟後再回來再繼續發展。 </li></ul>

×