PHP, ООП и базы данных - вопрос производительности - PullRequest
0 голосов
/ 10 июля 2011

У меня есть вопрос относительно производительности при использовании ООП в PHP вместе с базами данных.Я задам свой вопрос на примере, предположим, что класс foo представляет строку из некоторой таблицы.Теперь предположим, что мне нужно использовать foo на 5 разных страницах моего веб-приложения.

Суть в том, что на каждой из 5 страниц я буду использовать данные из разных столбцов.(то есть первая страница будет использовать column1 и column2, в то время как вторая страница использует column3 и column 4 и т. д.)

Подход ООП (насколько я вижу) предполагает, что когда я инициализирую foo на некоторыхконкретный ряд я бы подключить и получить все столбцы этого ряда и построить свой объект.Затем я мог бы продолжить свою логику и использовать любые данные, которые мне могут понадобиться.

Проблема, с которой я столкнулся, заключается в том, что с процедурным подходом (к которому я более привык, когда дело доходит до сети) не будеттратить ресурсы на загрузку ненужных мне столбцов, так как запрос будет специально адаптирован к потребностям конкретной страницы (т. е. если я на первой странице, то я буду загружать только столбцы 1 и 2, так как это то, что мне нужно).

Я ошибаюсь в подходе ООП или дополнительные издержки настолько незначительны, что разработчики вообще загружают данные, которые им не нужны?

Спасибо и извините, если это уже было рассмотрено, я думал, что это будетбыть интересной темой!:)

Эрик

дальнейшие разъяснения:

Класс подобен:

class foo
{
  $column1;
  $column2;
  $column3;
  $column4;

  public function _construct($id)
  {
    //get column 1,2,3 and 4 from database where table_id = $id
  }
}

Проблема в том, что если мне нужен только column1 одна одна страницая скачиваю колонки 2,3 и 4 даром.При процедурном подходе вы бы этого не сделали.Моя модель ООП плохая или это нормально?

Ответы [ 4 ]

1 голос
/ 10 июля 2011

Вы все еще можете включить выборочный запрос в класс ООП, используя либо массив столбцов для захвата при построении, либо используя метод открытого класса для обработки захвата запроса.

Пример конструктора:

<?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.

1 голос
/ 10 июля 2011

Я не совсем уверен, что понимаю ваш вопрос. Есть три вещи, которые, я думаю, могут относиться к тому, как вы подходите к этой проблеме:

A) Вы пытаетесь построить объект, а затем использовать данные, содержащиеся в этом объекте, по всему сценарию. Б) Вы используете тягу базы данных в стиле PDO. C) Вы используете PHPs SPL для создания итерации объекта, который содержит методы для извлечения информации из базы данных.

Я пока предположу, что вы используете вариант А. Пожалуйста, прости меня, если я ошибаюсь, и я не пытаюсь недооценивать ваши знания вообще ... просто начинаю здесь.

Подход ООП заключается в том, чтобы не извлекать все данные, чтобы они были доступны в вашем скрипте. Думайте об этом как о наборе функций вместо набора данных, хотя это может легко быть и то, и другое. Вы будете писать свои методы класса так же, как пишете функции без ООП. Единственное отличие состоит в том, что объект может использоваться для связи с вашим сценарием столько раз, сколько вам нужно ...

Если ответить прямо на ваш вопрос, я никогда не получаю больше данных, чем мне нужно. По соображениям безопасности и производительности. Вы должны использовать класс так же, как вы используете процедурный стиль. Вы можете выполнить все операции извлечения данных, которые потребуются сценарию при создании экземпляра класса (с помощью метода конструктора), но убедитесь, что вам нужны только данные.

---- Добавлен

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

Вы все еще делаете все процедурно, но теперь у вас есть динамическая функция, которая может извлекать данные на основе того, что вы отправляете в виде страницы ... В этом случае я не вижу никакой причины использовать конструктор ... только метод получения.

Это помогает?

0 голосов
/ 10 июля 2011

Мои два цента.Это зависит от ряда вещей и от того, как это влияет на приложение в целом, т.е.Количество запросов к базе данных, размер каждой записи, размер набора строк и т. д.

Я лично загружаю все столбцы и профиль для поиска узких мест при медленных запросах или большом использовании памяти.Если у меня есть узкие места, тогда я считаю, что в этот момент загрузка лен только обязательных столбцов

0 голосов
/ 10 июля 2011

Общий подход заключается в выборе только нужных вам столбцов. foo->db->tablename->select('all', where date = $date). Кратко рассмотрим фреймворки, такие как cakephp и symfony, они могут помочь вам лучше понять, как это обычно делается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...