В моей базе данных PostgreSQL содержится таблица для хранения экземпляров зарегистрированного объекта. Эта таблица заполняется через загрузку электронных таблиц. Веб-интерфейс позволяет оператору изменять представленную информацию. Однако исходные данные не изменяются. Все изменения сохраняются в отдельной таблице changes
с столбцами unique_id
, column_name
, value
и updated_at
.
После внесения изменений они представляются оператору, сначала запрашивая исходную таблицу, а затем запрашивая таблицу изменений (используя идентификатор экземпляра и дату последнего изменения, сгруппированные по имени столбца). Два результата объединены в PHP и представлены в веб-интерфейсе. Это довольно жесткий способ выполнения задачи, и я хотел бы сохранить всю логику в SQL.
Я могу легко выбрать последние изменения для таблицы, используя следующий запрос:
SELECT fltr_chg.unique_id, fltr_chg.column_name, chg_val.value
FROM changes AS chg_val
JOIN (
SELECT chg_rec.unique_id, chg_rec.column_name, MAX( chg_rec.updated_at )
FROM information_schema.columns AS source
JOIN changes AS chg_rec ON source.table_name = 'instances'
AND source.column_name = chg_rec.column_name
GROUP BY chg_rec.unique_id, chg_rec.column_name
) AS fltr_chg ON fltr_chg.unique_id = chg_val.unique_id
AND fltr_chg.column_name = chg_val.column_name;
И выбор записей из таблицы instances
так же просто:
SELECT * FROM instances;
Теперь, если бы был только способ преобразования первого результата и подстановки итоговых значений в последние, на основе unique_id
и column_name
, и все еще сохраняя результат в виде таблицы, проблема будет решена, Можно ли это сделать?
Я уверен, что это не самые редкие проблемы, и, скорее всего, некоторые системы отслеживают изменения данных аналогичным образом. Как они применяют их обратно к данным, если не через один из вышеописанных способов (текущие и искаженные решения)?