2012-02-17 56 views
7

我在zend项目上工作,我指的是其他zend项目来创建新的Zend项目。但我不喜欢盲目地跟随该项目而不理解。在Zend目录结构中,In Model类主要有两类我看到的类,如在Zend中,为什么我们使用DB Model类和Mapper类作为两个单独的?

- models 
    - DbTables 
     - Blog.php //Extends Zend_Db_Table_Abstract 
    - Blog.php  // Contains methods like validate() and save() 
    - BlogMapper.php // Also Contains methods like validate(Blog b) & save(Blog b) 

为什么要遵循这个特定的结构? 这是分离对象类和数据库模型类吗?

请解释。

+0

总之:是的。你期待什么作为答案? (注:当'Blog'具有'save()'等方法时,它更像是主动记录实现,而不是模型映射器概念中的模型) – KingCrunch 2012-02-17 14:23:14

+0

@KingCrunch,我想知道为什么这个是用结构吗?我们不能直接使用一个类来存储数据库中的值吗?我刚开始使用zend,那是wny。不知道这种模式的理由? – 2012-02-17 14:27:21

+0

我没有阅读答案,因此我猜这是在某处回答的。简单的原因是:分离业务和数据访问逻辑。 – KingCrunch 2012-02-18 13:22:51

回答

12

DataMapper is a design pattern from Patterns of Enterprise Application Architecture

Data Mapper是一个软件层,它将内存中的对象与数据库分开。它的责任是在两者之间传输数据,并将它们彼此隔离。使用Data Mapper,内存中的对象甚至不需要知道存在数据库;他们不需要SQL接口代码,当然也不需要知道数据库模式。

如何在关系数据库中存储数据通常与在内存中构造对象的方式不同。例如,一个对象将有一个包含其他对象的数组,而在一个数据库中,您的表将会有另一个表的外键。由于object-relational impedance mismatch,您在域对象和数据库之间使用中介层。这样,你可以在不影响另一方的情况下发展。

在其自己的层中分离映射职责也更接近Single Responsibility Principle。你的对象不需要知道DB逻辑,反之亦然。这在编写代码时给你更大的灵活性。

当您不想使用域模型时,通常不需要DataMapper。如果你的数据库表很简单,用TableModule和TableDataGateway甚至ActiveRecord可能会更好。

对于其他各种形状看我的回答

6

模型的想法是包裹起来的代码内部的数据的逻辑集合。

DataMapper的想法是将这个应用程序级别的数据集与您如何存储数据相关联。

对于很多ActiveRecord实现,框架不提供这种意图分离,这可能会导致问题。例如,博文模型可以包一个博客文章的基本信息,如

  • 标题
  • 作者
  • date_posted

但是,也许你也想拥有它包含如下内容:

  • number_of_reads
  • number_of_likes

现在你可以存储所有这些数据在一个MySQL表来开始的,但因为你的博客的增长,你成为超级有名的,你会发现,你的统计资料时,一个可怕的很多点击并且你想把它移到一个单独的数据库服务器上。

如何在不更改应用程序代码的情况下将BlogPost对象的这些字段迁移到其他数据存储?

使用DataMapper,可以修改对象保存到数据库的方式以及从数据库加载的方式。这使您可以调整存储机制,而无需更改应用程序依赖的实际信息集合。

相关问题