Wrap-around undo/redo log of temporal/time travel/versioned table - Mailing list pgsql-general

From Patrick Bakker
Subject Wrap-around undo/redo log of temporal/time travel/versioned table
Date
Msg-id 000801c21df4$9be61c90$3a0a0a0a@20PVBL3
Whole thread Raw
List pgsql-general
The temporal sql / time travel thread brought to mind a feature for an
application I'm developing which I'd like to implement but am unsure of an
appropriate approach. Each record in a major table (ie. order, inventory
item, customer) has a user foreign key and a modification date. I'd like to
also keep a versioned history of the table. The main difference over the
solutions given earlier in the temporal sql / time travel thread is that I'd
like it to be a limited history governed either by a fixed number of steps
back or more preferably by some limited number of days from the present. The
main purpose of these historical logs is not for history records since other
tables are designed to store history where it is needed explicitly. Instead
with the application I'm developing each field of the database is updated as
soon as focus leaves the field the user was working on (and only if changes
were made to the field). Since changes are instantaneous from the user's
perspective and there is no save/cancel, I'd like to be able to give some
room to undo/redo and review changes which have been made (ie. in the
previous two weeks perhaps). I picture the ability to turn on a history view
window for a given object's view, then select a historical entry in the
window (ie. presented as a columned list of date/time, user and maybe a
presentable name of the field which was changed) which changes the displayed
values of all modified fields from the selected history line up to the
present. This may be made more visible by having the modified fields change
background colour to red or something similar. The user could then
optionally choose to explicitly persist these changes.

Given that apart from the initial creation of a record, each update will be
of a single field, I also wonder if there isn't a more efficient way to
store the changes. One possibility, I've considered is leaving each
historical record 'open' as long as some limited time span has not elapsed
(ie. 15 minutes since first update) and as long as the updates are
non-overlapping. In this way lots of consecutive changes could be written to
the same record. Multi-user, concurrent editing would be problematic to
reconstruct accurately in this fashion, however. Perhaps a further
simplification of this problem could be to store the value of each modified
record at the end of each day. In effect this would be a small scale backup.
However, both of this possibilities make the live undo/redo editing
capabilities an impossibility but preserve the broader review capability.
Finally, assuming that the original table cannot have any NULL values would
it save any space by writing only the value of the fields to be updated into
the otherwise NULL record of the historical table (ie. therefore a NULL
value in the historical table means the field was not changed).

I think the problem is that two different methods are needed. When
immediately making changes it is useful to undo/redo every field change in
sequence. However, coming back later it is more useful (in general) to see a
higher level overview of the changes.

I suppose it might work to do updates as previously described (select
current record into historical table, then apply current update or using a
trigger - which is better?). Later some other process could perform the
winnowing out of records which are too old and perhaps collapse concurrent,
non-overlapping changes into a single record.

Any other thoughts on this?

Patrick.




pgsql-general by date:

Previous
From: Andrew Sullivan
Date:
Subject: Re: Shared Memory Sizing
Next
From: Martijn van Oosterhout
Date:
Subject: Re: Strange behaviour of SELECT ... IN