2011-07-10 64 views
0

在PHP中使用OOP和数据库时,我有一个关于性能的问题。我会通过例子来问我的问题,假设一个类foo代表某个表中的一行。现在假设我需要在我的web应用程序的5个不同页面上使用foo。PHP,面向对象和数据库 - 性能问题

美中不足的是,在每个5页的,我将使用来自不同列中的数据。 (即第一页将使用第一列和第二列,而第二页使用第三列和第四列等)。

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

我遇到的问题是,使用过程方法(我更习惯于涉及网络)不会浪费资源来下载我不需要的列,因为查询将专门为(即如果我在第一页我只下载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模型是坏的还是这可以吗?

+0

你会把你的示例代码吗?不清楚你想要达到什么!? –

+0

如果你使用的是数据库,你的查询只能返回你需要的行,没有别的。 – Ibu

回答

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的。

+0

这很有意义,如果你只是初始化删除,你甚至可以添加一个空构造。我想我已经看到如此多的未经优化和写得不好的代码,我开始认为这是常态! – Erik

+0

它发生在我们身上。坦率地说,我发布的代码对我来说是严重写入和未优化的。就我个人而言,我甚至会实现Zend的数据库函数,或者手动扩展到mysqli并创建一个完整的数据库对象设置,但这取决于项目的范围。我目前做的项目往往是100%OOP,而其他一些我将旧程序网站从程序转换为OOP,这会创建一个独特的代码组合,您有时会想到“这是如何工作的?”。 –

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

你还在做程序上的一切,但现在你有一个可以拉基于你送什么作为数据的动态功能页面...在这种情况下,我看不到任何理由使用构造函数...只有一个getter方法。

这有帮助吗?

+0

我在帖子中添加了一些说明。我问,因为我现在做php 100%的程序,并且从我开始使用php开始就这样做了。但是,我看到有人使用对象只从特定行中获取所有数据,以便他们可以启动一个类来访问其中的删除方法。对我来说这似乎很奇怪,这种类型的oop模型是错误的,你会建议什么? – Erik

+0

是的,我认为根据你的说法,这是一种错误的方法。我已经添加了代码来向你展示我将如何做到这一点...... – espradley

+0

是的,我正在考虑这样的事情,但是如果没有将你拉出的数据存储在对象中,那么你会错过OOP。我认为travis提出的类变量的动态设置可能更多是我在寻找的。感谢寿! – Erik

0

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

0

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

我个人加载所有列和配置文件以在遇到缓慢请求或高内存使用率时查找瓶颈。如果我有瓶颈,那么我认为在这一点上懒惰加载只需要列。