Должен ли я пойти в базу данных один раз и получить все данные или два раза и получить то, что мне нужно каждый раз - PullRequest
1 голос
/ 08 января 2011

Мне нужен совет по структурированию некоторого (базового) php-кода.

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

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

Для тех, кто хочет видеть это в коде:

Метод A:

// Create and execute a MySQL query
function tasks_not_done(){
        // Open a PDO dtabase connection
        $link = new PDO(DB_INFO, DB_USER, DB_PASS);

        $sql = " SELECT title, created_date
                FROM todos
                WHERE list_id = ? AND checked = '0'
                ORDER BY created_date DESC";
        $stmt = $link->prepare($sql);
        $stmt->execute(array($_REQUEST['list_id']));

        // loop throught all the rows
        while($row = $stmt->fetch()) {
            $date = strtotime($row['created_date']);
            $date = date('d/m/y' , $date);
            echo '<div class="task">' . "\n";
            echo '<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
            echo '</div>';

            }
       $stmt->closeCursor();
}

Метод B

function tasks_all(){
       // Open a PDO dtabase connection
       $link = new PDO(DB_INFO, DB_USER, DB_PASS);

       $sql = " SELECT title, created_date, checked
                FROM todos
                WHERE list_id = ?
                ORDER BY created_date DESC";
        $stmt = $link->prepare($sql);
        $stmt->execute(array($_REQUEST['list_id']));

        // loop throught all the rows
        $tasks['not_done'] = "";
        $tasks['done'] = "";

        while($row = $stmt->fetch("FETCH_ASSOC")) {
            $date = strtotime($row['created_date']);
            $date = date('d/m/y' , $date);

            if($row['checked'] =='0'){
                $tasks['not_done'] .= '<div class="task">' . "\n";
                $tasks['not_done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
                $tasks['not_done'] .='</div>';
                } elseif ($row['checked'] =='1') {
                $tasks['done'] .= '<div class="task">' . "\n" .
                $tasks['done'] .='<span class="taskcdtate">' .$date . '</span>'. '<span class="tasktitle"> ' . $row['title'] . ' </span>' . "\n";
                $tasks['done'] .='</div>';
                }

            }
       $stmt->closeCursor();
       return $tasks;
}

спасибо

Ответы [ 5 ]

4 голосов
/ 08 января 2011

Нет правильного ответа на этот вопрос, но я могу дать вам несколько советов.

Мое общее правило: получать данные, которые вам нужны, когда вам это нужно. Но есть много вещей, которые могут повлиять на это.

  1. Будете ли вы всегда использовать данные из обоих запросов? если да, вы должны получить все в одном запросе. Если Никогда, то есть они исключают друг друга, ответ - нет.
  2. Если вам всегда нужен запрос 1, а иногда и запрос, вам нужно сделать еще несколько соображений. Требует ли запрос 1 гораздо больше времени, если вы включите запрос 2? Как часто вам нужен запрос 2, почти всегда или почти никогда.
  3. Что произойдет, если кто-то обновит данные одновременно. Допустим, вы получаете оба одновременно, а кто-то другой обновляет данные, влияющие на запрос 2. Это означает, что вы используете устаревшие данные. Если вы извлекаете данные тогда, когда вам это нужно, вы можете получить правильные обновленные данные.
1 голос
/ 08 января 2011

Метод А - мой выбор.

Я думаю, что у Фернеса пока одни из лучших ответов, но вот еще несколько вещей, которые стоит рассмотреть ...

  1. Из того, что я могу сказать ... Ваш код не так уж и сложен - стоит ли беспокоиться о производительности с этим фрагментом кода?

  2. Использование кода других пользователейобычно приводит к повышению производительности, гибкости и расширяемости в долгосрочной перспективе.Меньше вашего собственного кода - это хорошо.Если вы решите делегировать работу в базу данных, есть много возможностей для оптимизации, которые вы можете буквально включить, в отличие от того, что вы полагаетесь на собственный код.Например, добавление индексов в таблицу, которую вы запрашиваете, может иметь большее значение, чем выбор маршрута программирования.

  3. Если вы все еще хотите знать абсолютно самый эффективный способ ...почему не время / профиль кода?Узнайте, какой метод быстрее использовать конкретные показатели, используя собственный набор данных, а не играть в теоретическую игру.

0 голосов
/ 08 января 2011

Почему бы не сделать это более элегантно:

$sql = " SELECT title, created_date
        FROM todos
        WHERE list_id = ? AND checked = ?
        ORDER BY created_date DESC";
$stmt = $link->prepare($sql);

$stmt->execute(array($_REQUEST['list_id'], '0'));
# do stuff

# and later...
$stmt->execute(array($_REQUEST['list_id'], '1'));

Это позволяет избежать дублирования кода и (в зависимости от серверной части БД) также должно выполняться быстрее.

0 голосов
/ 08 января 2011

Почему бы не сделать это?

$sql = " SELECT title, created_date
            FROM todos
            WHERE list_id = ? AND checked = '$filterValue'
            ORDER BY created_date DESC";
0 голосов
/ 08 января 2011

Я не вижу второго запроса здесь, но вы, вероятно, можете использовать JOIN для ввода дополнительных данных.

например, если у меня есть таблица клиентов и таблица карт лояльности, но не все клиенты могут иметь карту лояльности, я мог бы сделать это:

SELECT c.CustomerID, c.CustomerName, l.LoyaltyCardType, l.LoyaltyCardBalance
FROM Customers c 
     LEFT JOIN LoyaltyCardInformation l 
     ON c.CustomerID = l.CustomerID

Для MySQL объединениеСинтаксис здесь: http://dev.mysql.com/doc/refman/5.0/en/join.html

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