Возврат различных запросов вместе как объекта JSON против нескольких запросов - PullRequest
0 голосов
/ 19 декабря 2018

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

До сих пор я преобразовывал каждый результат запроса в виде объекта JSON, а затем возвращал их вместе с чем-то в форме:

SELECT (SELECT array_to_json(array_agg(Q1)), (SELECT array_to_json(array_agg(Q2))

... создавая, таким образом, строку с одним результатом запроса на столбец.

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

Я рассматриваю возможность разделения запросов и использования pg-promise 'db.batch внутри db.taskиспользовать одну и ту же связь между запросами.

Существуют ли предостережения, использующие этот метод по сравнению с первым?Что было бы лучшим с точки зрения производительности?

1 Ответ

0 голосов
/ 19 декабря 2018

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

Модуль pg-prom имеет метод метода multi специально для этого.И если вам нужно передать параметры форматирования, вы можете либо передать их как обычные переменные, охватывающие индексы / имена всех запросов на этот раз, либо вы можете предоставить параметры форматирования отдельно для каждого запроса с помощью гибкого помощника helpers.concat для получения окончательной строки нескольких запросов в одной команде:

const queries = [
    {query: 'SELECT ...', values: ...},
    {query: 'SELECT ...', values: ...},
    {query: 'SELECT ...', values: ...}
    ...
];

const q = ()=> pgp.helpers.concat(queries);

db.multi(q)
    .then(([data1, data2, data3]) => {...})
    .catch(error => {...})

Обратите внимание, что мы определяем q как функцию, поэтому ошибки, связанные с форматированием, инкапсулируются в запросеметод и обрабатывается в пределах .catch.

...