hstore for versioning fields in postgresql
I would personally prefer to have one history table for each "main" table. 

There is a ready-made solution for this available for PostgreSQL which implements this history using triggers, see Log Table Changes in PostgreSQL with tablelog by Andreas Scherbaum.