У меня есть веб-приложение, поддерживаемое базой данных Postgres (v11) и главной таблицей, где каждая строка в таблице может рассматриваться как объект, а каждый столбец - это поле объекта.
Итак, мыhave:
| id | name | field1 | field2| .... | field 100|
-----------------------------------------------
| 1 | foo | 12.2 | blue | .... | 13.7 |
| 2 | bar | 22.1 | green | .... | 78.0 |
Таблица была создана с использованием:
CREATE TABLE records(
id VARCHAR(50) PRIMARY KEY,
name VARCHAR(50),
field1 NUMERIC,
field2 VARCHAR(355),
field100 NUMERIC);
Теперь у меня есть таблица аудита, в которой хранятся обновления для каждого поля каждого объекта.Таблица аудита определяется следующим образом:
| timestamp | objid | fieldname | oldval | newval |
-----------------------------------------------
| 1234 | 1 | field2 | white | blue |
| 1367 | 1 | field1 | "11.5" | "12.2" |
| 1372 | 2 | field1 | "11.9" | "22.1" |
| 1387 | 1 | name | baz | foo |
Таблица была создана с использованием:
CREATE TABLE audit_log(
timestamp TIMESTAMP,
objid VARCHAR (50) REFERENCES records(id),
fieldname VARCHAR (50) NOT NULL,
oldval VARCHAR(355),
newval VARCHAR(355));
oldval
/ newval
сохраняются как varchar
, поскольку они предназначены исключительно для аудитацель, поэтому фактический тип данных на самом деле не имеет значения.
По очевидным причинам эта таблица стала огромной за последние несколько лет или около того, поэтому я хотел удалить некоторые старые данные.Кто-то предложил сохранить только последние 5 обновлений для каждого объекта (т.е. пользовательский интерфейс может затем показать последние 5 обновлений из таблицы аудита).
Я понимаю, что вы можете получить это, используя GROUP BY
и LIMIT
, но проблема в том, что у меня более миллиона объектов, причем некоторые из них были обновлены более тысячи раз, в то время как другие имеют лишь несколько обновлений за несколько раз.года.И журнал аудита очень тяжел для чтения / записи (как и следовало ожидать).
Каков наилучший способ удаления всех записей, которые старше 5-го последнего обновления для каждого объекта (конечно, в идеале я перенесу это в какое-нибудь дополнительное хранилище)?