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

时间:2011-07-10 05:09:53

标签: php database performance oop

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

问题是,在5页的每一页上,我将使用来自不同列的数据。 (即第一页将使用column1和column2,而第二页使用column3和第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
  }
}

问题是,如果我只需要一个页面的第1列,我就可以下载第2,3和4列。在程序方法中你不会这样做。我的OOP模型是坏的还是可以的?

4 个答案:

答案 0 :(得分:1)

我不完全确定我理解你的问题。我认为有三件事可以适用于你如何处理这个问题:

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);

你仍然在程序上做所有事情,但现在你有一个动态函数可以根据你作为页面发送的内容来提取数据...在这种情况下,我没有看到任何使用构造函数的理由......一个吸气剂方法。

这有帮助吗?

答案 1 :(得分:1)

您仍然可以在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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

当我遇到请求缓慢或内存使用率过高时,我会亲自加载所有列和配置文件以查找瓶颈。如果我有瓶颈,那么我认为延迟加载此时只需要列。

相关问题