Tôi sẽ cần một số truy vấn ở dạng "liệt kê tất cả các đối tượng có một trong các tên thay thế là 'foobar'." Kích thước bảng dự kiến là khoảng vài triệu bản ghi. Các truy vấn Postgres JSON có thể được sử dụng cho việc đó và nó cũng có thể được lập chỉ mục (Ví dụ:Chỉ mục Để Tìm Phần tử trong mảng JSON). Tuy nhiên, NÊN thực hiện theo cách đó hay đó là một cách giải quyết sai lầm không được khuyến khích?
Nó có thể được thực hiện theo cách đó nhưng điều đó không có nghĩa là bạn nên làm. Theo một nghĩa nào đó, phương pháp hay nhất đã được ghi chép đầy đủ (xem ví dụ:sử dụng hstore so với sử dụng XML so với sử dụng EAV so với sử dụng bảng riêng biệt) với một loại dữ liệu mới, cho tất cả các ý định và mục đích thực tế (ngoài xác thực và cú pháp), không có gì khác biệt từ các tùy chọn không có cấu trúc hoặc bán cấu trúc trước đó.
Nói cách khác, đó là cùng một con lợn cũ với trang điểm mới.
JSON cung cấp khả năng sử dụng chỉ mục cây tìm kiếm đảo ngược , theo cách tương tự như hstore, các kiểu mảng và tsvectors đều làm. Chúng hoạt động tốt, nhưng hãy nhớ rằng chúng được thiết kế chủ yếu để trích xuất các điểm trong vùng lân cận (nghĩ các loại hình học) được sắp xếp theo khoảng cách, thay vì trích xuất danh sách các giá trị theo thứ tự từ vựng.
Để minh họa, hãy lấy hai kế hoạch mà câu trả lời của Roman vạch ra:
- Công cụ thực hiện quét chỉ mục cày trực tiếp qua các trang đĩa, truy xuất các hàng theo thứ tự được chỉ mục chỉ định.
- Công cụ thực hiện quét chỉ mục bitmap bắt đầu bằng cách xác định mọi trang đĩa có thể chứa một hàng và đọc chúng khi chúng xuất hiện trên đĩa, như thể (và trên thực tế, chính xác là như vậy) đang thực hiện quét theo trình tự để bỏ qua các vùng vô dụng.
Quay lại câu hỏi của bạn: Chỉ mục cây đảo ngược lộn xộn và quá khổ thực sự sẽ cải thiện hiệu suất của ứng dụng của bạn nếu bạn sử dụng bảng Postgres làm cửa hàng JSON khổng lồ. Nhưng chúng cũng không phải là một viên đạn bạc và chúng sẽ không giúp bạn có được thiết kế quan hệ phù hợp khi giải quyết các nút thắt cổ chai.
Điểm mấu chốt, cuối cùng, không khác gì những gì bạn nhận được khi quyết định sử dụng hstore hoặc EAV:
- Nếu nó cần một chỉ mục (tức là nó thường xuyên xuất hiện trong mệnh đề where hoặc quan trọng hơn là trong mệnh đề nối), bạn có thể muốn dữ liệu trong một trường riêng biệt.
- Nếu chủ yếu là mỹ phẩm thì JSON / hstore / EAV / XML / bất cứ thứ gì giúp bạn ngủ ngon vào ban đêm.