Это хороший способ реализовать нумерацию страниц в BigQuery? - PullRequest
1 голос
/ 30 марта 2020

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

  1. Выполнить задание запроса
  2. Получить идентификатор задания
  3. Выполнить getQueryResults с этим идентификатором задания и получить результат и page_token
  4. Если page_token null - вы сделали, в противном случае переходите к следующему шагу
  5. Выполните getQueryResults (все еще с jobid из # 2) и получите результат и page_token Перейти к шагу # 4

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

let options = token ? { 'pageToken': token, 'maxResults': maxRows } : { 'maxResults': maxRows };
  if (!token) {
    bigqueryClient.createQueryJob(query).then(function(data) {
      const job = data[0];
      return job.getQueryResults({ 'maxResults': maxRows });
    }).then(function(data) {
      if (data[1]) {
        return res.json({ token: data[1]['pageToken'], rows: data[0], totalRows: data[2]['totalRows'] });
      } else {
        return res.json({ rows: data[0] });
      }
    })
    .catch(e => {
      log.error(e);
      return res.status(500).json({
        e: e.message
      });
    });
  } else {
    const job = bigqueryClient.job(jobId);
    job.getQueryResults(options)
    .then(function(data) {
      if (data[1]) {
        return res.json({ token: data[1]['pageToken'], rows: data[0] });
      } else {
        return res.json({ rows: data[0] });
      }
    })
    .catch(e => {
      log.error(e);
      return res.status(500).json({
        e: e.message
      });
    });
  }

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

Ответы [ 2 ]

1 голос
/ 31 марта 2020

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

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

1 голос
/ 30 марта 2020

Мое первое чувство - вы не используете правильный инструмент для своего приложения. BigQuery - это потрясающий инструмент для аналитики и сканирования петабайт данных. И он имеет 1 значение по умолчанию: разогрев запроса длинный: около 1 с не сжимается.

Поэтому я не рекомендую BigQuery для внешнего интерфейса. Представьте себе: нажмите на кнопку, подождите 1 с, еще один клик, еще один второй, ... Ужасно! Облако SQL является наиболее подходящим для этого. Извлеките подмножество данных из BigQuery и загрузите их в Cloud SQL. Пользователи запрашивают только данные Cloud SQL.

Дополнительным преимуществом этого шаблона является стоимость. Действительно, вы сказали, что клиент может выполнить много запросов. С BigQuery вы оплачиваете количество данных, которые вы сканируете в своем запросе (а не количество, которое вы читаете и возвращаете). Конечно, если ваш запрос находится в кеше, вы не будете платить снова, но, в любом случае, я все равно не рекомендую вам использовать непосредственно BigQuery в вашем приложении, за исключением случаев, когда ваш вариант использования очень специфичен c и вам это нужно.

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