Nó phụ thuộc. Nếu bạn mong đợi có nhiều người dùng, khối lượng giao dịch rất cao hoặc số lượng lớn các lần tìm nạp thuộc tính trên mỗi truy vấn, tôi sẽ nói hãy sử dụng HSTORE. Tuy nhiên, nếu ứng dụng của bạn sẽ bắt đầu nhỏ và phát triển theo thời gian hoặc có tương đối ít giao dịch tìm nạp thuộc tính hoặc chỉ tìm nạp một vài thuộc tính cho mỗi truy vấn, thì hãy sử dụng JSON. Ngay cả trong trường hợp sau, nếu bạn không tìm nạp nhiều thuộc tính nhưng thường xuyên kiểm tra một hoặc hai khóa trong WHERE
của các truy vấn của bạn, bạn có thể tạo một chỉ mục chức năng để tăng tốc mọi thứ:
CREATE INDEX idx_foo_somekey ON foo((bar ->> 'somekey'));
Bây giờ, khi bạn có WHERE bar ->> somekey
, nó sẽ sử dụng chỉ mục.
Và tất nhiên, sẽ dễ dàng hơn khi sử dụng dữ liệu lồng nhau và nâng cấp lên jsonb khi nó có sẵn cho bạn.
Vì vậy, tôi sẽ nghiêng về phía JSON trừ khi bạn biết chắc chắn rằng bạn sẽ đá đít máy chủ của mình với việc sử dụng nhiều tìm nạp khóa trước khi bạn có cơ hội nâng cấp lên 9.4. Nhưng để chắc chắn về điều đó, tôi sẽ nói, hãy thực hiện một số đo điểm chuẩn với khối lượng truy vấn dự kiến ngay bây giờ và xem điều gì phù hợp nhất với bạn.