我有一个规范化的数据库,用于存储Internet上文件的位置。 一个文件可能具有分布在不同站点上的多个位置。 我将URL分两部分存储(Site.UrlStart,FileLocation.UrlEnd)。 UrlEnd是该文件(对于站点)唯一的部分。

简化的Db结构:

http://img231.imageshack.us/img231/9134/dblayout.jpg

我正在使用Zend_Db作为我的ORM(如果是的话),以及从Zend_Db_Table_Abstract继承的表的类。

问题是,检索位置数据(例如url)需要使用多个表,并且据我所知,我要么必须同时使用两个表类(从而公开我的表结构),要么将sql分散到整个我应用程序,这两个听起来都不有吸引力。

我能看到的唯一解决方案是创建一个外观与Zend_Db_Table_Abstract相似的外观(也许是继承自该外观),并且隐藏了数据实际上在两个表上的事实。

我的问题如下:

  • 我在创建立面类时是否朝着正确的方向前进(是否有其他替代方法)?
  • 门面类应该从Zend_Db_Table_Abstract继承吗?

#1楼 票数:10 已采纳

除了非常简单的用例之外,Zend Db Table并不是真正的ORM。 它应与系统中的每个表紧密相关。 因此,每个表将有一个Zend_Db_Table类。

要管理大局,您将需要另一种类型的课程。

因此,是的,关于使用某种外观,您处于正确的位置。

但是,我不会使其继承自Zend_Db_Table_Abstract,因为它的职责范围非常不同。

可能值得研究一下Data Mapper模式-有点像外观(Martin Fowler,企业体系结构模式)。 每个“域实体类型”将有一个映射器(不一定与每个表相同),而对于整个类型家族,可能会有另一个额外的映射器。

在Zend Framework的简介页上有一个简单的Data Mapper模式示例: http : //framework.zend.com/manual/en/learning.quickstart.create-model.html

请注意Application_Model_GuestbookMapper如何使用 Application_Model_DbTable_Guestbook-而不进行扩展。

但是,这是一个非常简单的示例,有时可能会给您带来比答案更多的问题。

关于如何将数据库映射到模型的另一个很好的资源是Scott Ambler的

在线文章: http : //www.agiledata.org/essays/mappingObjects.html

这涵盖了处理数据到数据与对象到对象以及数据到对象之间的关系的过程: http : //www.agiledata.org/essays/mappingObjects.html#MappingRelationships

它还涉及到Data Mapper Pattern,并且是在少数地方可以很好地解释如何将类层次结构映射到db表的地方之一。

此外,埃里克·埃文斯(Eric Evans)还描述了“存储库”的使用,“存储库”是位于模型和数据层之间的立面。 如果使用Data Mappers创建完整的ORM似乎令人生畏,这可能是一个快速的起点。 通常,每个重要的域实体(例如,聚合根实体,即“一串串葡萄”)都有一个存储库。

查看有关存储库的更多信息: http : //books.google.co.uk/books?id=7dlaMs0SECsC&lpg=PP1&dq=Domain-Driven%20Design&pg=PA147#v=onepage&q&f=false

基本上,存储库除其他外,还有一个FindById()类型的方法,这些方法然后可以封装其外观背后的三个Zend Db Table对象的使用。 您的模型可以立即开始使用“回购”。 然后,有一天,如果您想添加更多精美的ORM内容,只需将其交换到Repo Facade后面,您的模型甚至不必知道它。

如果这三个表代表领导独立生活的实体,那么最好有三组类来管理其每个生命周期。 如果是这种情况,则可以使用“一种服务”(特别是Eric Evans的模式中的另一种)来管理其交互。 服务是放置似乎不适合任何一个独占实体的操作的地方。

请参阅: http : //books.google.co.uk/books?id=7dlaMs0SECsC&lpg=PP1&dq=Domain-Driven%20Design&pg=PA106#v=onepage&q=service&f=false

要点是从心理上摆脱Zend Db Table的统治地位-它只是次要角色,是db表的代表,仅此而已。

  ask by Yacoby translate from so

未解决问题?本站智能推荐:

1回复

使用Zend Framework利用多个数据源

我正在启动一个基于zend框架的应用程序; 此应用程序应该能够使用除数据库之外的多个数据源; 例如,一个网络服务。 我一直在阅读如何构建我的模型以便允许这种情况。 我遇到过似乎提供解决方案的各种概念(DataMapper模式,服务模式,适配器层等)。 但是,我仍然对如何将这些内容整
4回复

使用多个AND运算符的Zend_Db的复杂WHERE子句

我想在Zend_Db中生成这个复杂的WHERE子句: 我试过这个: 那产生了: 我确实找到了一种方法来完成这项工作,但我觉得通过先使用PHP组合“OR”子句然后使用Zend_Db where()子句将它们组合起来,这有点“作弊”。 PHP代码: 这产生了我想要的
1回复

使用Zend_Db连接表时出错

为什么我得到这个: 同时尝试加入两个表? 我的模型中包含以下代码,该代码扩展了Zend_Db_Table_Abstract 我在控制器中使用它: $this->view->entries = $this->sub_projects->getProje
1回复

Zend_Db,如何使用相关表?

我想学习使用ZF中的相关表到最后。 (1)有人可以帮忙吗? 有2个用户表和* users_openid *及其链接。 我想在Zend_Db上实现表之间的关系,以便此类用户从毒品上的openid上找到findDependentRowset,添加openid,openid以使用户通过findP
1回复

Zend_Db子查询

我一直在尝试用ZendFW构造一个sql查询,但是我似乎无法使其功能像我想要的那样(或根本不起作用)。 这是我尝试使用zend_db select()构建的查询 我不知道的是如何正确地在那里获得该子查询,而我尝试的一切似乎都没有效果。 任何帮助将不胜感激! 谢谢! 编
1回复

zend_db并加入

我试图了解如何在程序中使用Zend_DB,但遇到了一些问题。 当我向其传递简单查询时,下面的类(DatabaseService)起作用。 但是,如果我通过带有join子句的查询将其挂起,则不会返回任何错误。 我在查询浏览器中剪切并粘贴了qry,它是有效的 任何帮助都会很棒
1回复

Zend_Db更新问题

嘿,我有以下SQL: 我想在PHP中反映... 它不起作用,没有错误,什么也没有...从$ db转储是这个... class Zend_Db_Adapter_Pdo_Mysql#149(12){protected $ _pdoType => string(5)“ my
1回复

如何使用Zend_Db有效读取大量行?

是否有一种简单的:)高效方式,还是使用Zend_Db顺序读取大量行? 基本上,我需要逐行处理整个表。 表很大,不能保证主键序列(即不是自动递增,而是UNSIGNED INT)。 解决此问题的最佳方法是什么? 环境:PHP 5.2,Zend Framework 1.10,MySQL