PostgreSQL: эффективный способ группировки данных по количеству записей - PullRequest
0 голосов
/ 23 сентября 2018

Пример

CREATE TABLE transactions (
  id    SERIAL PRIMARY KEY,
  value NUMERIC NOT NULL
);

CREATE TABLE batches (
  id          SERIAL PRIMARY KEY,
  total_value NUMERIC NOT NULL
);

CREATE TABLE transaction_batches (
  id             SERIAL PRIMARY KEY,
  batch_id       INT NOT NULL REFERENCES batches (id) ON DELETE CASCADE ON UPDATE CASCADE,
  transaction_id INT NOT NULL REFERENCES transactions (id) ON DELETE CASCADE ON UPDATE CASCADE
);
  • В таблице transaction_batches транзакции должны быть сгруппированы в пакеты по N транзакций
  • Пользователь может удалять или создавать транзакции в любое время
  • Если пользователь изменил транзакции, то партии транзакций должны быть реорганизованы (для обеспечения пакетов из 20 транзакций)

Цель

Эффективно сгруппировать транзакции в партииN транзакций с каждой транзакцией изменяется пользователем

Вопрос

Не могли бы вы предложить решение для достижения цели?

PS Вы можете предложить другоеструктура таблиц

Ответы [ 2 ]

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

Я бы просто сделал:

CREATE TABLE transactions (
  id SERIAL PRIMARY KEY,
  value NUMERIC NOT NULL,
  batch_num INT NOT NULL
);

Установите batch_num равным:

SELECT floor((row_number() over (order by id) - 1) / N)

Вы можете сделать это в триггере.Или вы можете просто использовать представление для вычисления этого при запросе к таблице.

0 голосов
/ 23 сентября 2018
CREATE TABLE transactions (
  id    SERIAL PRIMARY KEY,
  value NUMERIC NOT NULL,
  batch_id INT NOT NULL REFERENCES batches (id)
);

CREATE TABLE batches (
  id          SERIAL PRIMARY KEY,
  num_of_transactions INT,
  total_value NUMERIC NOT NULL
);

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

  1. Устанавливаем для его batch_id значение NULL
  2. Уменьшаем num_of_transactions в партии

Всякий раз, когда мы хотим изменить порядок пакетов:

  1. Найти все партии, для которых num_of_transactions
  2. Для каждой транзакции, для которой batch_id = NULL, добавьте ее вследующий пакет, который имеет вакансию, обновляет num_of_transactions пакета, а также batch_id в транзакции.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...