我想知道在访问数据库数据时实现一致性的最佳实践和最佳方法是什么:
当前结构如下
Data Access --> Business Logic --> Controller --> View
我的数据访问层由每个表的Zend_Db_Table
, Zend_Db_TableRowset
和Zend_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()
方法。但如果我有特定的逻辑应用,我就卡住了。在我的数据库中创建一个视图,连接
user
和role
表,并创建一组新的Zend_DbTable
,Zend_DbTableRowset
和Zend_DbTableRow
。ORM(推进或学说(1或2)),我没有这些经验,我可能需要更多的信息来做出正确的选择。
我的另一个目标是确保我的数据结构的一致性
即:数组:
array(
array(row1),
array(row2)
);
object all way
$row = $rowset->current();
$row->field;
无论如何都应该创建视图,因为它是对其他想法的补充,而不是与它们竞争。视图将:
- 将数据库抽象为更容易使用的东西。
- 更快,因为没有解析
- 可以在应用程序之外访问。
一旦创建了视图,就可以选择最能解决问题的策略。如果要创建一个表示单个实体的表单,那么ORM可能是一个很好的选择。但是,如果您要显示大量数据列表或生成包含许多实体的报告,那么使用像SQL这样的声明性语言可能更容易,并且性能更好。