ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-10-09 22:34:21  阅读:200  来源: 互联网

标签:zend-db zend-db-table php zend-framework


在我进行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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有