编程语言
首页 > 编程语言> > php-如何在Zend_Db_Table之上以高性能方式使用RDBMS? (如果有的话……)

php-如何在Zend_Db_Table之上以高性能方式使用RDBMS? (如果有的话……)

作者:互联网

在我进行Zend Framework项目时,我的想法一直持续不断地战斗着-良好的应用程序设计要求将数据库查询的数量减到最少.就延迟和RDBMS计算时间而言,每个查询都很昂贵. Zend_Db_Table鼓励您进行很多查询-例如,没有内置的方式可以与其他Zend_Db_Tables进行JOIN.在给定Zend_Db_Table实例的情况下,无法提取基础表的名称,这使得根据Zend_Db_Table编写Zend_Db_Select查询变得很困难.从某种意义上说,Zend_Db_Table鼓励您实现RDBMS已经在PHP中提供的功能,这显然不是最佳选择.

另一方面,Zend_Db_Table通过抽象掉SQL查询本身,使表的行为更像本机PHP对象.用户不必担心经常引用所有内容,并且SQL操作作为简单的PHP方法公开.

最好是Zend_Db_Table之类的东西,但是它将使用惰性操作(如Microsoft对LINQ-to-SQL / Entity Framework / etc的处理),以便将似乎是多个PHP语句压缩为一个(或以RDBMS查询(y | ies).

这样的事情存在吗?它是否包含在Zend中?

解决方法:

我同意您的观点,Zend_Db_Table有时会充当锤子以寻找钉子.它并非总是最自然的工具,用于编写具有联接的自定义性能查询.在我看来,Zend_Db_Table主要是针对没有连接的单个表的最佳选择.但是仍然有可能使用Zend_Db组件的各个方面进行最佳的db查询.

正如@singles指出的那样,所有这些数据库访问都应该埋在模型中(对于ActiveRecord类型的方法),在映射器中(对于DataMapper方法)或在实体管理器(如Doctrine2)中.

例如,可以将自定义BlogPostDataAccess的实例提供给您的自定义BlogPost模型,该模型将获得Zend_Db_Adapter的实例.您的所有查询-包括优化的联接-都将驻留在BlogPost_DataAccess类内.可以使用诸如(伪代码)之类的东西编写DataAccess类中的SELECT查询:

$select = $adapter->select()
        ->join()
        ->join()
        // etc.
        ->join()
        ->where()
        ->limit()
        ->order();

明白了吗?

更新

$tableMap成员变量如何?就像是:

public static $tableMap = array(
    'posts'        => 'table_posts',
    'users'        => 'table_users',
    'categories'   => 'table_categories',
    // etc
);

然后在查询中,您可以使用类似以下内容的方法:

$select = $adapter->select();
$select->from(self::$tableMap['users'], array('name', 'email'));

也许添加名为setTableMap($tableMap),getTableMap(),getTable($k),setTable($k)的方法,将初始映射数据存储在配置文件中,然后在引导过程中填充静态成员.

标签:zend-db,zend-db-table,php,zend-framework
来源: https://codeday.me/bug/20191009/1882458.html