Полезно ли выбирать конкретные столбцы в Symfony - PullRequest
0 голосов
/ 28 сентября 2018

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

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

Я покажу примеры наших версий кода:

Моя версия:

public function getRecord($fromDate, $toDate)
{
    $query = $this->createQueryBuilder('table')
        ->andwhere('table.sendFrom <=:sendFrom')
        ->andwhere('table.sendTo >=:sendTo')
        ->setParameter('sendFrom', $fromDate)
        ->setParameter('sendTo', $toDate)
        ->getQuery();

    return $query->getResult();
}

Их версия:

public function getRecord($fromDate, $toDate)
{
    // Sorry had to hide column names
    $query = $this->createQueryBuilder('table')
        ->select('table.id,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.sendFrom,table.sendTo,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,'
            . 'table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.column_1,table.sendTo,'
            . 'table.sendFrom')
        ->andwhere('table.sendFrom <=:sendFrom')
        ->andwhere('table.sendTo >=:sendTo')
        ->setParameter('sendFrom', $fromDate)
        ->setParameter('sendTo', $toDate)
        ->getQuery();

    return $query->getResult();
}

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

Я ищу ваши мнения по поводу:

  1. Прав ли я или нет в своем аргументе.
  2. Если я прав, то какое доказательство / аргумент я могу представить команде

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

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

Однако качество кода и удобство сопровождения также являются важным фактором, и это не так.всегда стоит устраивать беспорядок только для того, чтобы получить 0,00000% производительности.Поэтому, если вам нужны все столбцы в строке, кроме одного, содержащего что-то крошечное, например, int, я бы пошел со всей строкой.

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

public function initQuery() 
{
    $this->qb = $this->createQueryBuilder('table');

    return $this;
}

public function selectRows()
{
    $this->qb->addSelect('table.row1, table.row2, table.row3...');

    return $this;
}

public function orderByDate() 
{
    $this->qb->addOrderBy('table.date', 'ASC');

    return $this;
}

public function getResult()
{
    return $this->qb
        ->getQuery()
        ->getResult()
    ;
}

Затем я могу использовать это так:

$rows = $repository
    ->initQuery()
    ->selectRows()
    ->orderByDate()
    ->getResult()
;
0 голосов
/ 28 сентября 2018

С точки зрения производительности «Их версия» является лучшей, будут отображаться только необходимые поля (но я думаю, что выигрыш незначителен).

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

С точки зрения безопасности, я думаю, что это не аргумент, задача не состоит в том, чтобы выставлять чувствительные поля в вашемответ (HTML-ответ, ответ Json ...)

Но это мое личное мнение.

...