To zależy. Jeśli spodziewasz się, że będziesz mieć wielu użytkowników, bardzo dużą liczbę transakcji lub niesamowitą liczbę pobieranych atrybutów na zapytanie, powiedziałbym, że użyj HSTORE. Jeśli jednak Twoja aplikacja zacznie się mała i będzie się rozwijać z czasem, lub będzie miała stosunkowo niewiele transakcji, które pobierają atrybuty, lub po prostu pobiera kilka na zapytanie, użyj JSON. Nawet w tym drugim przypadku, jeśli nie pobierasz wielu atrybutów, ale często sprawdzasz jeden lub dwa klucze w WHERE
klauzuli zapytań, możesz utworzyć indeks funkcjonalny, aby przyspieszyć działanie:
CREATE INDEX idx_foo_somekey ON foo((bar ->> 'somekey'));
Teraz, gdy masz WHERE bar ->> somekey
, powinien używać indeksu.
I oczywiście łatwiej będzie używać zagnieżdżonych danych i uaktualnić do jsonb, gdy staną się one dla Ciebie dostępne.
Więc skłaniałbym się ku JSON, chyba że masz pewność, że skopiesz tyłek swojemu serwerowi, używając intensywnego pobierania kluczy, zanim będziesz miał szansę na uaktualnienie do wersji 9.4. Ale aby się tego upewnić, powiedziałbym, że przeprowadź teraz kilka testów porównawczych z przewidywanymi ilościami zapytań i zobacz, co działa najlepiej dla Ciebie.