繁体   English   中英

在Zend中,为什么我们使用DB Model类和Mapper类作为两个独立的?

[英]in Zend, Why do We use DB Model class and Mapper class as two separate?

我正在研究zend项目,我指的是其他zend项目来创建新的Zend Project.But我不喜欢盲目地遵循该项目而不理解。 在Zend目录结构中,在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)

为什么遵循这种特定的结构? 这是分开Object类和Database模型类吗?

请解释。

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

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

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

单一责任原则中,更紧密地遵循其自身层中的映射责任。 您的对象不需要了解DB逻辑,反之亦然。 这为您在编写代码时提供了更大的灵活性。

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

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

模型的概念是在代码中包含逻辑数据集合。

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

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

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

但也许你也希望它包含类似的东西:

  • number_of_reads
  • number_of_likes

现在你可以将所有这些数据存储在一个MySQL表格中,但随着你的博客的发展和你变得超级出名,你会发现你的统计数据遭受了大量的点击,你想把它移到单独的数据库服务器。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM