Tôi có thể làm gì với trường json mới?


8

PostgreQuery 9.2 giới thiệu jsonloại trường. Tại sao và khi nào tôi nên sử dụng nó? Nó có lợi ích gì đối với một trường văn bản?

Tôi nghĩ rằng có các tùy chọn truy vấn mới có sẵn, tuy nhiên tôi chưa thấy cái nào cả. Tui bỏ lỡ điều gì vậy?

Câu trả lời:


7

Hậu 9,2

Lợi ích của tính năng mới là hai lần. Các cột loạijson xác minh tính hợp lệ của nội dung của nó để những gì trong cột tự động là JSON hợp lệ và bạn sẽ gặp lỗi nếu bạn cố gắng viết bất cứ điều gì khác cho nó.
Và bạn có các hàm cơ bản để tạo JSON hợp lệ khi đang di chuyển từ các hàng hoặc mảng - đây là trường hợp sử dụng rất phổ biến.

Tôi xin trích lời Andrew Dunstan thuộc danh pgsql-hacker :

Ở một số giai đoạn có thể sẽ có một số chức năng xử lý json (trái ngược với các chức năng sản xuất json), nhưng không phải trong 9.2.

Tôi đã sử dụng trích dẫn đó trước câu hỏi liên quan này trên SO .

Hậu 9,3

.. cuối cùng mang lại một số chức năng và toán tử. Kiểm tra trang hướng dẫn cho các hàm JSON .

Câu trả lời liên quan về SO:

@ Sẽ đưa lên bài viết blog. Xem bình luận dưới đây.

Hậu 9,4

Hãy chắc chắn kiểm tra jsonbloại mới với một loạt các chức năng mới.

Trên tất cả, bộ lưu trữ nhị phân, phân tách cho phép lưu trữ nhỏ hơn trên đĩa và toán tử đẳng thức cho jsonb(không giống như json), điều này làm cho một số hoạt động bổ sung có thể (như DISTINCThoặc một UNIQUEchỉ mục).

Tuy nhiên, nhiều chức năng đã được thêm cho cả hai jsonjsonb. json_to_record(), json_to_recordset()vv Nhiều hơn trong các ghi chú phát hành.


1
Ngoài ra, bạn có thể sử dụng pl / v8js để thao tác với chúng, cung cấp cho bạn một số khả năng khá tuyệt vời.
Chris Travers

1
Vâng, nhưng nếu bạn đang sử dụng một cá thể Postgres được lưu trữ (như Heroku), PLV8 có thể không phải là một tùy chọn (chắc chắn không có trên Heroku). Trong trường hợp đó, từ những gì tôi có thể thấy, kiểu dữ liệu JSON có giá trị khá hạn chế trong 9.2. Có vẻ như 9.3 có thể có một số hỗ trợ tốt.
David S

1
Hãy xem các bản cập nhật sắp tới trong 9.3 michael.otacoo.com/postgresql-2/ trên
Will

2

Tóm lại, kiểu dữ liệu JSON (cũng như phần mở rộng và kiểu dữ liệu HSTORE cũ hơn) cho phép bạn sử dụng PostgreQuery như một kho lưu trữ dữ liệu "không có lược đồ" (hoặc kết hợp dữ liệu "không có lược đồ" quan hệ và không liên quan), thay vì phải sử dụng một số tùy chọn NoQuery khác (như MongoDB). Bạn thậm chí còn đạt được một số điều mà bạn không thể làm với MongoDB, như lập chỉ mục được lọc, lập chỉ mục biểu thức, v.v ... Hạn chế duy nhất là PostgreQuery không hỗ trợ loại bỏ lỗi như MongoDB ... tuy nhiên, tôi thực sự đặt câu hỏi về việc thường xuyên shending là thực sự cần thiết. Với cơ sở dữ liệu PostgreQuery 9.3 được cấu hình tốt, có đủ tài nguyên O / S và một số chỉ mục biểu thức được lọc kỹ lưỡng, bạn có thể dễ dàng đạt được các truy xuất hàng không có lược đồ trong phạm vi 0,25 mili giây.

HTH, Dave Sisk


1

Về cơ bản tôi thấy ba trường hợp sử dụng ở đây:

  1. vượt qua các kết quả phức tạp dễ dàng trở lại ứng dụng
  2. truyền dữ liệu phức tạp vào db từ ứng dụng và
  3. Lưu trữ dữ liệu dạng tương đối tự do để xử lý sau.

Cái đầu tiên có thể được thực hiện trực tiếp từ PostgreSQL mà không cần addons. Bạn sẽ có thể làm một cái gì đó như:

SELECT row_to_json(mt.id, mt.testval, array_agg(mt2))
  FROM my_table mt
  JOIN my_table2 mt2 ON mt.id = mt2.mt_id
 WHERE mt.id = 123;

Điều này sau đó có thể được sử dụng để tạo các mảng lồng nhau, vv trong đầu ra của bạn và tránh rất nhiều vấn đề phân tích cú pháp lộn xộn ở phía ứng dụng.

thứ hai là truyền dữ liệu phức tạp vào db để xử lý. Hiện tại không có chức năng tích hợp để tạo điều kiện thuận lợi cho việc này, nhưng với các addon như pl / v8js, bạn có thể lập trình cơ sở dữ liệu của mình trong Javascript và sử dụng json làm định dạng trao đổi. Điều này có thể cho phép tạo ra các giao diện phong phú hơn trong cơ sở dữ liệu của bạn. Lưu ý rằng vì bạn có thể lập chỉ mục các kết quả đầu ra của hàm, bạn có thể sử dụng điều này để tạo các chỉ mục các khía cạnh của JSON được lưu trữ trong db của bạn.

Thứ ba là một lĩnh vực chúng tôi dự định sử dụng nó trong LedgerSMB. Ý tưởng là chúng tôi có thể muốn cho phép các nhà tích hợp hệ thống lưu trữ thông tin rất đơn giản cùng với tài khoản của khách hàng. Điều này sau đó có thể được đóng gói trong một trường JSON sẽ được lưu trữ. Điều này sẽ không thể được truy vấn trực tiếp bởi các ứng dụng chính, nhưng nếu mọi người muốn thêm ứng dụng này bằng pl / v8js thì điều này có thể được thực hiện cho các doanh nghiệp cá nhân sử dụng phần mềm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.