Zend_Db_Table连接查询vs数据库视图


Zend_Db_Table joined queries vs database view

我想知道在访问数据库数据时实现一致性的最佳实践和最佳方法是什么:

当前结构如下

Data Access --> Business Logic --> Controller --> View

我的数据访问层由每个表的Zend_Db_Table, Zend_Db_TableRowsetZend_Db_TableRow组成。

我的业务逻辑存储在基于table命名的模型中

问题查询示例:

我想根据用户名获得一个特定的用户。为此,我有一个user表和一个role表(role.id在用户表中称为role_id)。

我不想使用findDependentRowset,它将为返回的每一行运行额外的查询。(在显示数据的数据网格中会出现问题,因为可以返回许多行)。

我的选择(在本例中使用getName()来简化,但它可以是任何处理):

  • 在用户表中的角色表上创建一个自定义连接,它将返回一个由associative array组成的index array。在这种情况下,我不能调用Model_DbTable_User中定义的getName()函数来构建名称(名+中+姓)。即使我"cast"我的数组到Zend_Db_Table_Rowset(或我的自定义table_rowset),我不能访问我的自定义类方法,因为我得到一个通用的Zend_Db_Table_Row对象。

  • 使自定义连接,但在运行时在我的查询中使用CONCAT()构建名称,我仍然得到一个数组,但名称是构建的,所以我不需要getName()方法。但如果我有特定的逻辑应用,我就卡住了。

  • 在我的数据库中创建一个视图,连接userrole表,并创建一组新的Zend_DbTable, Zend_DbTableRowsetZend_DbTableRow

  • ORM(推进或学说(1或2)),我没有这些经验,我可能需要更多的信息来做出正确的选择。

我的另一个目标是确保我的数据结构的一致性

即:数组:

array(
    array(row1), 
    array(row2)
);

object all way

$row = $rowset->current();
$row->field;

无论如何都应该创建视图,因为它是对其他想法的补充,而不是与它们竞争。视图将:

  • 将数据库抽象为更容易使用的东西。
  • 更快,因为没有解析
  • 可以在应用程序之外访问。

一旦创建了视图,就可以选择最能解决问题的策略。如果要创建一个表示单个实体的表单,那么ORM可能是一个很好的选择。但是,如果您要显示大量数据列表或生成包含许多实体的报告,那么使用像SQL这样的声明性语言可能更容易,并且性能更好。