7

我正在做 zend 项目,我指的是其他 zend 项目来创建新的 Zend 项目。但我不喜欢在没有理解的情况下盲目地遵循该项目。在 Zend Directory 结构中,在 Model 类中,我看到的主要有两种类型的类,如

- 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)

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

请解释。

4

2 回答 2

12

DataMapper 是来自企业应用程序架构模式的设计模式

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

在关系数据库中存储数据的方式通常不同于在内存中构造对象的方式。例如,一个对象将有一个包含其他对象的数组,而在数据库中,您的表将具有另一个表的外键。由于对象关系阻抗不匹配,您在域对象和数据库之间使用了一个中介层。这样,您可以在不影响另一个的情况下同时进化。

将 Mapping 职责分离在自己的层中也更接近于单一职责原则。您的对象不需要了解数据库逻辑,反之亦然。这为您在编写代码时提供了更大的灵活性。

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

对于其他各种模式,请参阅我的回答

于 2012-02-17T14:29:16.080 回答
7

模型的想法是将数据的逻辑集合包装在代码中。

DataMapper 的想法是将这个应用程序级别的数据集合与您存储它的方式联系起来。

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

  • 标题
  • 作者
  • 身体
  • 发布日期

但也许您还希望它包含以下内容:

  • number_of_reads
  • number_of_likes

现在您可以将所有这些数据存储在一个 MySQL 表中,但是随着您的博客的增长和您变得超级有名,您会发现您的统计数据正在受到大量点击,您希望将其移至一个单独的数据库服务器。

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

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

于 2012-02-17T14:30:12.013 回答