PHP, OOP和数据库-性能问题


PHP, OOP and Databases - performance question

我有一个关于在PHP中与数据库一起使用OOP时性能的问题。我将通过示例问我的问题,假设类foo表示某个表中的一行。现在假设我需要在我的web应用程序的5个不同的页面上使用foo。

问题是,在这5个页面中,我将使用来自不同列的数据。(即第一页将使用column1和column2,而第二页将使用column3和column 4,等等)

OOP方法(据我所知)建议,当我在某些特定的行上初始化foo时,我将连接并获取该行的所有列并构建我的对象。然后我可以继续我的逻辑和使用我可能需要的任何数据。

我的问题是,程序方法(我更习惯于当它涉及到web时)不会浪费资源来下载我不需要的列,因为查询将专门针对特定页面的需求进行定制。如果我在第一页,我只下载column1和column2,因为这是我需要的。

我是在谈论OOP方法错误还是额外的开销如此微不足道,以至于开发人员通常下载他们不需要的数据?

谢谢,抱歉,如果这已经被覆盖,我认为这将是一个有趣的话题!:)

埃里克

进一步说明:

类是这样的:

class foo
{
  $column1;
  $column2;
  $column3;
  $column4;
  public function _construct($id)
  {
    //get column 1,2,3 and 4 from database where table_id = $id
  }
}

问题是,如果我只需要column1一个页面,我下载column2,3和4一无所获。在程序方法中,你不会这样做。是我的OOP模型不好还是这样还行?

仍然可以在OOP类中合并选择性查询,方法是在构造时使用列数组抓取,或者使用公共类方法处理查询抓取。

构造函数示例:

<?php
class Foo{
    public function __construct( $column ) {
        if(is_array($column)){
             if(count($column) > 1){
                 $result = mysql_query('SELECT `'.implode('`,`', $column).'` FROM `table`;');
             }else{
                 $result = mysql_query('SELECT `'.$column[0].'` FROM `table`;');
             }
        }else{
             $result = mysql_query('SELECT `'.$column.'` FROM `table`;');
        }
        $this->result = mysql_result($result, 0);
    }
}
?>

公共函数方法将与此相同,除了您可以返回结果而不是设置$this->result

我不太明白你的问题。我认为有三件事可以适用于你如何处理这个问题:

A)你试图建立一个对象,然后在整个脚本中使用该对象中包含的数据。B)您正在使用PDO风格的数据库拉。C)你正在使用php SPL对一个对象进行迭代,该对象包含从数据库中提取信息的方法。

我假设你现在使用选项a,如果我错了,请原谅我,我并不是想低估你的知识…这才刚刚开始。

OOP的方法不是拉入所有数据,以便在整个脚本中可用。可以把它看作函数的集合,而不是数据的集合,尽管它很容易是其中之一,或者两者兼而有之。编写类方法就像编写没有OOP的函数一样。唯一的区别是,对象可以用来与脚本通信的次数,你需要它…

坦率地回答你的问题,我从来没有获取超过我需要的数据。出于安全和性能的考虑。您应该像使用过程风格那样使用类。您可以在实例化类时(使用构造函数方法)完成脚本所需的所有数据提取,但请确保这只是您需要的数据。

——添加

class foo{
  function getData($page){
       //Query to get the results you want based on the page number entered...
       //Process it as you normally would into a result set, array, or whatever.
       return $results;      
  }
}

然后调用

$foo = new Foo();
$page = "The page or the column that you want to pull";
$data = $foo->getData($page);

你仍然按照程序做所有的事情,但是现在你有一个动态的函数,可以根据你作为页面发送的内容提取数据…在这种情况下,我看不出有任何理由使用构造函数…只有一个getter方法。

有帮助吗?

一般的方法是只选择需要的列foo->db->tablename->select('all', where date = $date)。快速浏览一下cakephp和symfony等框架,它可能会帮助您更好地了解通常是如何完成的。

我的两分钱。这取决于许多事情以及它如何影响整个应用程序。数据库请求数、每条记录大小、行集大小等

当我遇到缓慢的请求或高内存使用率时,我会亲自加载所有列和配置文件来查找瓶颈。如果我遇到瓶颈,那么我会考虑延迟加载,只在那一点上需要的列。