Data Mapper通常是什么样的?

ope*_*rog 8 php orm datamapper

我有一个名为的表Cat,以及一个名为的PHP类Cat.现在我想要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.当所有人都保存他们的编辑时,一切都搞砸了.

呃...好吧,保持这个问题非常简短:这里有什么好的做法?

Gor*_*don 12

来自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的问题,这是一个称为并发的常见问题.一个解决方案是锁定行,而有人编辑它.但就像所有事情一样,这可能导致其他问题.