In the past, to accomplish the same thing I've done this:

- store the data in hstore/json.  instead of storing snapshots, I store deltas. 
 i've been using a second table though, because it's improved performance on 
reads and writes.
- use a "transaction" log.  every write session gets logged into the 
transaction table (serial, timestamp, user_id).  all updates to the recorded 
tables include the transaction's serial.  then there is a "transactions" table, 
that is just "transaction_serial ,  object_id , object_action".  

whenever I have needs for auditing or versioning, I can just query the 
transaction table for the records I want... then use that to grab the data out 
of hstore.



On Sep 28, 2014, at 10:00 PM, Abelard Hoffman wrote:

> Hi. I need to maintain a record of all changes to certain tables so assist in 
> viewing history and reverting changes when necessary (customer service makes 
> an incorrect edit, etc.).
> 
> I have studied these two audit trigger examples:
> https://wiki.postgresql.org/wiki/Audit_trigger
> https://wiki.postgresql.org/wiki/Audit_trigger_91plus
> 
> I've also read about two other approaches to versioning:
> 1. maintain all versions in one table, with a flag to indicate which is the 
> current version
> 2. have a separate versions table for each real table, and insert into the 
> associated version table whenever an update or insert is done.
> 
> My current implementation is based on the wiki trigger examples, using a 
> single table, and a json column to record the row changes (rather than 
> hstore). What I like about that, in particular, is I can have a "global," 
> chronological view of all versioned changes very easily.
> 
> But there are two types of queries I need to run.
> 1. Find all changes made by a specific user
> 2. Find all changes related to a specific record
> 
> #1 is simple to do. The versioning table has a user_id column of who made the 
> change, so I can query on that.
> 
> #2 is more difficult. I may want to fetch all changes to a group of tables 
> that are all related by foreign keys (e.g., find all changes to "user" record 
> 849, along with any changes to their "articles," "photos," etc.). All of the 
> data is in the json column, of course, but it seems like a pain to try and 
> build a query on the json column that can fetch all those relationships (and 
> if I mess it up, I probably won't generate any errors, since the json is so 
> free-form).
> 
> So my question is, do you think using the json approach is wrong for this 
> case? Does it seem better to have separate versioning tables associated with 
> each real table? Or another approach?
> 
> Thanks


Reply via email to