日志标签 ‘PHP’

PHP开发中使用ORM存不存在性能问题

2010年6月5日

随着PHP开发框架的发展,许多框架都向RoR社区和Java社区取经,引入了 ORM (对象关系映射),方便了我们进行数据库操作。

事实上,一个出色的 ORM,不但要能够支持多种关联关系,以及对象间的泛化和依赖,还应该让开发者可以在对象关系网间自由的导航。开发者不需要操心如何维护对象间的关系,要做的仅仅是将对象间的关系定义出来。只要定义好关系,我们就可以通过直观的代码在对象间进行游历。

以下是从QeePHP的开发手册上抄来的,分析得很有道理:

诸如“作者 -> 撰写的书籍 -> 读者 -> 阅读的书籍 -> 这些书籍的作者”这样的对象导航当然会导致多次数据库查询,但是以此来认为框架的 ORM 性能不佳,其实是不正确的。

因为即便不使用任何 ORM,依赖于手工编写和优化的 SQL 查询,也不可能在一次查询中就从一个“作者”得到跨越了几层关系的“其他作者”的信息。所以,ORM 提供的这种对象导航能力并不等同于性能损失。

另一个更常见的误解就是:查询 10 篇文章及每篇文章的前 5 个评论。这种需求即便是手工编写的 SQL,也需要 10 次查询。所以开发者发现使用“一对多”关联导致多次查询就不应该意外了 :-)

除了一些无法避免的 SQL,QeePHP 的 ORM 已经做了大量的优化工作。并且利用延迟查询、In-Memory 缓存、集合对象等技术来进一步减少和消除不必要的查询操作。

让PHP支持像jQuery那样的链式操作

2010年3月19日

群里有人讨论这个问题,我的想法是在方法里返回this指针(指向对象本身),通过对私有成员$sql的赋值,来获得最终的执行语句,并返回相应结果。

Class Database{
    private $sql;
...
    public function where($condition){
        //此处省略n行...
        return this;
    }
    public function limit($limit){
        //此处省略n行...
        return this;
    }
    public function execute(){
        return this->query($sql);
    }
    public function select(){
        //此处省略n行...
        return this;
    }
}
//调用时:
$DB = new Database();
$DB->where($condition)->limit(20)->select();