PHP OOP高效的数据库读取减少


PHP OOP Efficient DB Read Reduction

六年前,我在没有任何经验的情况下开始了一个新的PHP OOP项目,所以我只是随口编了一个。无论如何,我注意到我的相当强大的mySQL服务器有时太容易陷入困境,并且想知道限制一些db活动的最佳方法,当我想到这个时,作为一个例子…

private $q_enghours;
public function gEngHours() {
    if ( isset($this->q_enghours) ) {
    } else {
        $q = "SELECT q_eh FROM " . quQUOTES . " WHERE id = " . $this->id;
        if ($r = $this->_dblink->query($q)) {
            $row = $r->fetch_row();
            $r->free();
            $this->q_enghours = $row[0];
        }
        else {
            $this->q_enghours = 0;
        }
    }
    return $this->q_enghours;
}

这似乎可以有效地大大减少对db的必要读取。如果填充了object属性,则不需要访问db。请注意,几乎有24个类都对"getter"使用相同的db访问例程。我只在一个地方实现了这个改变,我想知道是否有一个"最佳实践",我可能在重写所有的类之前错过了。

我想说这个问题是建立在错误的前提之上的。

如果您想处理"容易陷入困境"的数据库,那么您必须挖掘的特定原因,而不仅仅是猜测。你所关心的这些琐碎的小事,实际上不会有什么区别。您必须配置您的整个应用程序,并找到的真正原因。

如果你想减少读的次数,那么让你的对象映射特定的数据库记录,通过读取记录和填充所有属性一次,在对象创建时。构造函数就是为它设计的。

作为旁注,您确实需要一个好的数据库包装器,只是为了减少为每个数据库调用编写的代码量,因此,此代码可以写成

public function gEngHours() {
    if ( !isset($this->q_enghours) ) {
        $this->q_enghours = $this->db->getOne("SELECT q_eh FROM ?n WHERE id = ?", quQUOTES,  $this->id);
    }
    return $this->q_enghours;
}

getOne()方法正在执行所有的工作,运行查询,获取行,从它获得第一个结果和许多其他的想法,如正确的错误处理和使查询安全