Как агрегировать данные транзакционного приложения, чтобы сформировать моментальный снимок / представление с сохранением состояния, которое можно эффективно обновить?
Например, как включить следующие неизменные транзакции:
+------+-------+-------+----------+--------+
| From | To | Price | Quantity | Item |
+------+-------+-------+----------+--------+
| Tom | Sam | 10 | 2 | Book |
+------+-------+-------+----------+--------+
| Sam | Jerry | 2 | 1 | Pen |
+------+-------+-------+----------+--------+
| Bill | Sam | 1 | 3 | Pencil |
+------+-------+-------+----------+--------+
| Matt | Sam | 1.5 | 4 | Pencil |
+------+-------+-------+----------+--------+
В снимок и обновляйте представление вместо того, чтобы пересчитывать его каждый раз, когда добавляется новая транзакция:
+-------+--------+----------+---------------+
| Name | Item | Quantity | Average Price |
+-------+--------+----------+---------------+
| Tom | Book | -2 | 10 |
+-------+--------+----------+---------------+
| Sam | Book | 2 | 10 |
+-------+--------+----------+---------------+
| Sam | Pen | -1 | 2 |
+-------+--------+----------+---------------+
| Jerry | Pen | 1 | 2 |
+-------+--------+----------+---------------+
| Sam | Pencil | 7 | 1.29 |
+-------+--------+----------+---------------+
| Bill | Pencil | -3 | 1 |
+-------+--------+----------+---------------+
| Matt | Pencil | -4 | 1.5 |
+-------+--------+----------+---------------+
Цель состоит в том, чтобы создать моментальный снимок в базе данных и использовать его в приложении, а не создавать его в самом приложении. Это главным образом для поддержания согласованности между транзакциями и снимками.
От некоторых исследований решение может включать в себя использование LISTEN
, NOTIFY
, TRIGGER
а также VIEW
, Я использую PostgreSQL 10 и имею возможность использовать TimescaleDB.