【问题标题】:PostgreSQL: Effective way of grouping data by the number of recordsPostgreSQL:按记录数分组数据的有效方法
【发布时间】:2018-09-23 08:33:12
【问题描述】:

示例

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个交易的批次,每个交易都由用户更改

问题

您能否提出实现目标的解决方案?

P.S.您可以建议其他表格结构

【问题讨论】:

  • 您的查询和预期输出是什么?
  • @TimBiegeleisen 没有查询,请看上面的问题

标签: sql postgresql performance architecture grouping


【解决方案1】:

我会这样做:

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)

您可以在触发器中执行此操作。或者您可以在查询表时简单地使用视图来计算。

【讨论】:

    【解决方案2】:
    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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多