Depende. Se você espera ter muitos usuários, um volume de transações muito alto ou um número insano de buscas de atributos por consulta, eu diria que use HSTORE. Se, no entanto, seu aplicativo começar pequeno e crescer com o tempo, ou tiver relativamente poucas transações que buscam atributos, ou apenas buscar alguns por consulta, use JSON. Mesmo no último caso, se você não estiver buscando muitos atributos, mas verificando uma ou duas chaves frequentemente no
WHERE
cláusula de suas consultas, você pode criar um índice funcional para acelerar as coisas:CREATE INDEX idx_foo_somekey ON foo((bar ->> 'somekey'));
Agora, quando você tem
WHERE bar ->> somekey
, ele deve usar o índice. E, claro, será mais fácil usar dados aninhados e atualizar para jsonb quando estiver disponível para você.
Então, eu me inclinaria para o JSON, a menos que você tenha certeza de que vai chutar o traseiro do seu servidor com o uso pesado de buscas de chaves antes de ter a chance de atualizar para 9.4. Mas para ter certeza disso, eu diria, faça um benchmarking com volumes de consultas antecipados agora e veja o que funciona melhor para você.