[英]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.