簡體   English   中英

PHP、OOP 和數據庫 - 性能問題

[英]PHP, OOP and Databases - performance question

在 PHP 中與數據庫一起使用 OOP 時,我有一個關於性能的問題。 我將通過示例問我的問題,假設 class foo 代表某個表中的一行。 現在假設我需要在我的 web 應用程序的 5 個不同頁面上使用 foo。

問題在於,在 5 頁中的每一頁上,我都將使用來自不同列的數據。 (即第一頁將使用column1 和column2,而第二頁使用column3 和column 4,等等。)

OOP 方法(據我所知)建議當我在某個特定行上初始化 foo 時,我將連接並獲取該行的所有列並構建我的 object。 然后我可以繼續我的邏輯並使用我可能需要的任何數據。

我遇到的問題是,使用程序方法(我更習慣於使用網絡)不會浪費資源來下載我不需要的列,因為查詢將專門針對需求而定制特定頁面。(即,如果我在第一頁上,我只會下載 column1 和 column2,因為那是我需要的。)

我是在談論 OOP 方法是錯誤的,還是額外的開銷如此微不足道,以至於開發人員通常會下載他們不需要的數據?

謝謝和抱歉,如果這已經被覆蓋了,我認為這將是一個有趣的話題::)

埃里克

進一步澄清:

class 就像:

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 model 壞了還是這樣?

我不完全確定我理解你的問題。 我認為有三件事可以適用於你如何解決這個問題:

A) 您正在嘗試構建 object,然后在整個腳本中使用 object 中包含的數據。 B) 您正在使用 PDO 風格的數據庫拉取。 C) 您正在使用 PHP SPL 對 object 進行迭代,其中包含從數據庫中提取信息的方法。

我現在假設您使用的是選項 A。如果我錯了,請原諒我,我並不想低估您的知識……只是從這里開始。

OOP 的方法不是提取所有數據以使其在整個腳本中可用。 將其視為函數的集合而不是數據的集合,盡管它很容易成為其中之一或兩者兼而有之。 您將編寫 class 方法,就像編寫沒有 OOP 的函數一樣。 唯一的區別是,object 可用於與您的腳本進行多次通信,您需要它...

為了清楚地回答你的問題,我從不提取比我需要的更多的數據。 出於安全和性能原因。 您應該像使用程序樣式一樣使用 class。 您可以在實例化 class(使用構造函數方法)時執行腳本所需的所有數據提取,但請確保它只是您需要的數據。

- - 添加

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

你仍然在程序上做所有事情,但現在你有一個動態 function 可以根據你作為頁面發送的內容提取數據......在這種情況下,我看不出有任何理由使用構造函數......只有一個 getter 方法.

這有幫助嗎?

您仍然可以將選擇性查詢合並到 OOP class 中,方法是在構造時使用要抓取的列數組,或者使用公共 class 方法來處理查詢抓取。

構造函數示例:

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

公共 function 方法將與此相同,只是您可以返回結果而不是設置$this->result

一般的方法是 select 只需要foo->db->tablename->select('all', where date = $date)的列。 快速瀏覽一下諸如 cakephp 和 symfony 之類的框架,它可能會幫助您更好地了解它通常是如何完成的。

我的兩分錢。 這取決於許多事情以及它如何影響整個應用程序,即。 # 數據庫請求數、每條記錄的大小、行集的大小等

當我遇到緩慢的請求或高 memory 使用率時,我個人會加載所有列和配置文件以查找瓶頸。 如果我遇到瓶頸,那么我會考慮延遲加載僅需要的列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM