簡體   English   中英

Data Mapper通常是什么樣的?

[英]What does a Data Mapper typically look like?

我有一個名為Cat的表,還有一個名為Cat的PHP類。 現在我想創建一個CatDataMapper類,以便Cat extends CatDataMapper

我希望Data Mapper類提供執行ORM以及創建,編輯和刪除Cat的基本功能。

為此目的,也許能夠很好地了解這種模式的人可以給我一些有用的建議嗎? 我覺得提供一些函數如update(),delete(),save()會有點太簡單了。

我意識到數據映射器有這個問題:首先你創建了Cat的實例,然后初始化所有變量,如name,furColor,eyeColor,purrSound,meowSound,atte者等等。在設置好所有內容之后,你調用save( )函數,它繼承自CatDataMapper。 這很簡單;)但現在,真正的問題是:你在數據庫中查詢貓並獲得一個包含大量貓數據的無聊結果集。

PDO具有一些ORM功能來創建Cat實例。 讓我說我使用它,或者甚至說我有一個帶有關聯數組的mapDataset()函數。 但是,只要我從數據集中獲取Cat對象,就會有冗余數據。 同時,20個用戶可以從數據庫中獲取相同的cat數據並編輯cat對象,即重命名cat,並保存()它,而另一個用戶仍然可以設置另一個furColor。 當所有人都保存他們的編輯時,一切都搞砸了。

呃...好吧,保持這個問題非常簡短:這里有什么好的做法?

來自PoEA中的DataMapper

Data Mapper是一個軟件層,用於將內存中對象與數據庫分開。 它的職責是在兩者之間傳輸數據,並將它們彼此隔離。 使用Data Mapper,即使存在數據庫,內存中的對象也不需要知道; 他們不需要SQL接口代碼,當然也不了解數據庫模式。 (數據庫模式總是不知道使用它的對象。)由於它是Mapper(473)的一種形式,因此數據映射器本身甚至不為域層所知。

因此,Cat不應該擴展CatDataMapper,因為這會創建一個is-a關系並將Cat綁定到持久層。 如果您希望能夠以這種方式處理Cats的持久性,請查看ActiveRecord或任何其他數據源架構模式。

在使用域模型時,通常使用DataMapper。 一個簡單的DataMapper只是在一個字段到字段的基礎上將數據庫表映射到等效的內存中類。 但是,當出現對DataMapper的需求時,通常不會有這樣簡單的關系。 表格不會將1:1映射到您的對象。 相反,多個表可以形成一個Object Aggregate而反之亦然。 因此, 實施CRUD方法很容易成為一個挑戰。

除此之外,它是更復雜的模式之一(PoEA中包含15頁),通常與Repository模式結合使用。 查看本頁右側的相關問題欄,了解類似問題。

至於你關於多個用戶編輯同一個Cat的問題,這是一個稱為並發的常見問題。 一個解決方案是鎖定行 ,而有人編輯它。 但就像所有事情一樣,這可能導致其他問題

如果依靠ORM的象學說行走 ,其基本原理是創建一個靜態類會從數據庫中獲取的實際數據,(例如行走會造成CatPeer),然后由Peer類檢索的結果將是“水合“成貓對象。

水化過程是將“無聊的”MySQL結果集轉換為具有getter和setter的漂亮對象的過程。

因此,對於檢索,您可以使用像CatPeer::doSelect()這樣的東西。 然后,對於一個新對象,您首先要實例化它(或從數據庫中檢索和實例): $cat = new Cat();

插入就像執行一樣簡單: $cat->save(); 這相當於一個插入(或者如果對象已經存在於db中則更新...... ORM應該知道如何通過使用,例如,存在或不存在主要對象來區分新對象和現有對象鍵)。

在PHP <5.3中實現數據映射器非常困難,因為您無法讀取/寫入受保護/私有字段。 加載和保存對象時有幾個選擇:

  1. 使用某種解決方法,例如序列化對象,修改它的字符串表示形式,並使用反序列化將其恢復
  2. 公開所有字段
  3. 保持私密/受保護,並為每個人編寫變更器/訪問器

第一種方法有可能破壞新版本,並且是非常粗糙的黑客,第二種方法被認為是(非常)不好的做法。

第三種選擇也被認為是不好的做法,因為您不應該為所有字段提供getter / setter,只提供需要它的字段。 您的模型從純DDD(域驅動設計)角度“受損”,因為它包含僅由於持久性機制而需要的方法。 這也意味着現在你必須描述字段的另一個映射 - > setter方法,在字段旁邊 - >表列。

PHP 5.3引入了使用反射訪問/更改所有類型字段的功能:

http://hu2.php.net/manual/en/reflectionproperty.setaccessible.php

有了這個,您就可以實現真正的數據映射器,因為為所有字段提供mutator的需求已經停止。

PDO具有一些ORM功能來創建Cat實例。 讓我說我使用它,或者甚至說我有一個帶有關聯數組的mapDataset()函數。 但是,只要我從數據集中獲取Cat對象,就會有冗余數據。 同時,20個用戶可以從數據庫中獲取相同的cat數據並編輯cat對象,即重命名cat,並保存()它,而另一個用戶仍然可以設置另一個furColor。 當所有人都保存他們的編輯時,一切都搞砸了。

為了通常跟蹤數據的狀態並且將使用IdentityMap和/或UnitOfWork,跟蹤映射實體上的所有不同操作......以及請求周期的結束,然后將執行操作。

保持答案簡短:你有一個Cat的實例。 (也許它擴展了CatDbMapper,或者Cat3rdpartycatstoreMapper)你可以調用:

$cats = $cat_model->getBlueEyedCats();
//then you get an array of Cat objects, in the $cats array

不知道你用了什么,你可能會看看一些php框架,以便更好地理解。

暫無
暫無

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

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