PostgreSQL: soi kèo bóng đá | |||
---|---|---|---|
prev | UP | Chương 8. Kiểu dữ liệu | Tiếp theo |
kèo chấp bóng đá hôm nay loại dữ liệu JSON để lưu trữ dữ liệu JSON (ký hiệu đối tượng JavaScript), như được chỉ định trongRFC 7159. Dữ liệu đó cũng có thể được lưu trữ dưới dạngText, nhưng kèo chấp bóng đá hôm nay loại dữ liệu JSON có lợi thế là thực thi rằng mỗi giá trị được lưu trữ là hợp lệ theo kèo chấp bóng đá hôm nay quy tắc của JSON. Ngoài ra còn có kèo chấp bóng đá hôm nay chức năng và toán tử dành riêng cho JSON và kèo chấp bóng đá hôm nay toán tử có sẵn cho dữ liệu được lưu trữ trong kèo chấp bóng đá hôm nay loại dữ liệu này;Phần 9.15.
Có hai loại dữ liệu kèo chấp bóng đá hôm nay:jsonbvàjsonbb. Họ chấp nhậngần nhưBộ giá trị giống hệt nhau làm đầu vào. Sự khác biệt thực tế chính là một trong những hiệu quả.jsonbKiểu dữ liệu lưu trữ một bản sao chính xác của văn bản đầu vào, kèo chấp bóng đá hôm nay chức năng xử lý phải sửa chữa trên mỗi lần thực thi; trong khijsonbbDữ liệu được lưu trữ ở định dạng nhị phân bị phân hủy làm cho nó chậm hơn một chút so với đầu vào do chi phí chuyển đổi được thêm vào, nhưng nhanh hơn đáng kể để xử lý, vì không cần thiếtJSONBCũng hỗ trợ lập chỉ mục, có thể là một lợi thế đáng kể.
vìjsonbLoại lưu trữ một bản sao chính xác của văn bản đầu vào, nó sẽ bảo tồn khoảng trắng không đáng kể về mặt ngữ nghĩa giữa kèo chấp bóng đá hôm nay mã thông báo, cũng như thứ tự kèo chấp bóng đá hôm nay khóa trong kèo chấp bóng đá hôm nay đối tượng JSON. Ngoài ra, nếu một đối tượng JSON trong giá trị chứa cùng một khóa hơn một lần, tất cả kèo chấp bóng đá hôm nay cặp khóa/giá trị được giữ.jsonbKhông bảo toàn không gian trắng, không bảo toàn thứ tự của kèo chấp bóng đá hôm nay phím đối tượng và không giữ kèo chấp bóng đá hôm nay phím đối tượng trùng lặp. Nếu kèo chấp bóng đá hôm nay khóa trùng lặp được chỉ định trong đầu vào, chỉ có giá trị cuối cùng được giữ.
Nói chung, hầu hết kèo chấp bóng đá hôm nay ứng dụng nên thích lưu trữ dữ liệu JSON dưới dạngjsonbb, Trừ khi có nhu cầu khá chuyên môn, chẳng hạn như kèo chấp bóng đá hôm nay giả định di sản về việc đặt hàng kèo chấp bóng đá hôm nay khóa đối tượng.
PostgreSQLChỉ cho phép một bộ ký tự mã hóa trên mỗi cơ sở dữ liệu. Do đó, kèo chấp bóng đá hôm nay loại JSON không thể phù hợp với đặc tả JSON trừ khi mã hóa cơ sở dữ liệu là UTF8.
RFC 7159 cho phép kèo chấp bóng đá hôm nay chuỗi JSON chứa kèo chấp bóng đá hôm nay chuỗi thoát Unicode được ký hiệu bởi\ Uxxxx. Trong hàm đầu vào chojsonb11251_11410\ u). Tuy nhiên, chức năng đầu vào chojsonbb11497_11580U+007F) trừ khi mã hóa cơ sở dữ liệu là UTF8. TheJSONBLoại cũng từ chối\ U0000(vì điều đó không thể được biểu diễn trongPostgreSQL'sTextLoại), và nó khẳng định rằng bất kỳ việc sử dụng kèo chấp bóng đá hôm nay cặp thay thế unicode để chỉ định kèo chấp bóng đá hôm nay ký tự bên ngoài mặt phẳng đa ngôn ngữ cơ bản không chính xác. Escapes unicode hợp lệ được chuyển đổi thành ký tự ASCII hoặc UTF8 tương đương để lưu trữ;
Lưu ý:Nhiều chức năng xử lý kèo chấp bóng đá hôm nay được mô tả trongPhần 9.15Sẽ chuyển đổi Escapes Unicode sang kèo chấp bóng đá hôm nay ký tự thông thường và do đó sẽ ném kèo chấp bóng đá hôm nay loại lỗi tương tự chỉ được mô tả ngay cả khi đầu vào của chúng thuộc loạikèo chấp bóng đá hôm naykhôngjsonbb. Thực tế làjsonbHàm đầu vào không thực hiện kèo chấp bóng đá hôm nay kiểm tra này có thể được coi là một tạo tác lịch sử, mặc dù nó cho phép lưu trữ đơn giản (không xử lý) của JSON Unicode thoát khỏi mã hóa cơ sở dữ liệu không UTF8. Nói chung, tốt nhất là tránh trộn kèo chấp bóng đá hôm nay lần thoát Unicode trong JSON với mã hóa cơ sở dữ liệu không UTF8, nếu có thể.
Khi chuyển đổi đầu vào kèo chấp bóng đá hôm nay văn bản thànhjsonbb, kèo chấp bóng đá hôm nay loại nguyên thủy được mô tả bởiRFC7159 được ánh xạ hiệu quả vào bản địaPostgreSQLkèo chấp bóng đá hôm nay loại, như thể hiện trongBảng 8-23. Do đó, có một số ràng buộc bổ sung nhỏ về những gì cấu thành hợp lệjsonbbDữ liệu không áp dụng chojsonbLoại, cũng như JSON trong bản tóm tắt, tương ứng với kèo chấp bóng đá hôm nay giới hạn về những gì có thể được biểu diễn bằng kiểu dữ liệu cơ bản. Đáng chú ý,JSONBsẽ từ chối kèo chấp bóng đá hôm nay số nằm ngoài phạm vi củaPostgreSQL SốKiểu dữ liệu, trong khijsonbSẽ không. kèo chấp bóng đá hôm nay hạn chế được xác định theo triển khai như vậy được cho phép bởiRFC7159. Tuy nhiên, trong thực tế, kèo chấp bóng đá hôm nay vấn đề như vậy có nhiều khả năng xảy ra trong kèo chấp bóng đá hôm nay triển khai khác, vì thông thường đại diện cho JSONSốLoại nguyên thủy là IEEE 754 Điểm nổi chính xác gấp đôi (màRFC7159 dự đoán rõ ràng và cho phép). Khi sử dụng JSON làm định dạng trao đổi với kèo chấp bóng đá hôm nay hệ thống như vậy, nguy cơ mất độ chính xác số so với dữ liệu được lưu trữ ban đầu bởiPostgreSQLnên được xem xét.
Ngược lại, như đã lưu ý trong bảng có một số hạn chế nhỏ đối với định dạng đầu vào của kèo chấp bóng đá hôm nay loại nguyên thủy JSON không áp dụng cho tương ứngPostgreSQLloại.
Bảng 8-23. kèo chấp bóng đá hôm nay loại nguyên thủy của JSON và tương ứngPostgreSQLkèo chấp bóng đá hôm nay loại
Loại nguyên thủy kèo chấp bóng đá hôm nay | PostgreSQLloại | Ghi chú |
---|---|---|
chuỗi | Text | \ U000015050_15133 |
Số | Số | NANvàVô cựcGiá trị không được phép |
Boolean | Boolean | Chỉ chữ thườngTRUEvàSaiChính tả được chấp nhận |
null | (Không) | SQLnulllà một khái niệm khác |
Cú pháp đầu vào/đầu ra cho kèo chấp bóng đá hôm nay loại dữ liệu JSON được chỉ định trongRFC7159.
Sau đây đều hợp lệkèo chấp bóng đá hôm nay(hoặcjsonb) Biểu thức:
- Giá trị vô hướng/nguyên thủy đơn giản
Như đã nêu trước đây, khi giá trị kèo chấp bóng đá hôm nay được nhập và sau đó được in mà không có bất kỳ xử lý bổ sung nào,jsonbxuất bản cùng một văn bản được nhập, trong khiJSONBKhông bảo tồn kèo chấp bóng đá hôm nay chi tiết đáng kể về mặt ngữ nghĩa như khoảng trắng. Ví dụ: lưu ý sự khác biệt ở đây:
Chọn '"Bar": "Baz", "Balance": 7.77, "Active": Sai' :: kèo chấp bóng đá hôm nay;
Một chi tiết đáng chú ý về mặt ngữ nghĩa là trongJSONB, Số sẽ được in theo hành vi của cơ bảnSốLoại. Trong thực tế, điều này có nghĩa là kèo chấp bóng đá hôm nay số được nhập vớiEKý hiệu sẽ được in mà không có nó, ví dụ:
Chọn '"Đọc": 1.230E-5' :: jsonb, '"Đọc": 1.230E-5' :: jsonbb;
Tuy nhiên,jsonbb18026_18182
Đại diện cho dữ liệu là JSON có thể linh hoạt hơn đáng kể so với mô hình dữ liệu quan hệ truyền thống, hấp dẫn trong kèo chấp bóng đá hôm nay môi trường nơi kèo chấp bóng đá hôm nay yêu cầu là chất lỏng. Hoàn toàn có thể cho cả hai cách tiếp cận để cùng tồn tại và bổ sung cho nhau trong cùng một ứng dụng."Tài liệu"(mốc dữ liệu) trong bảng.
Dữ liệu JSON phải tuân theo kèo chấp bóng đá hôm nay cân nhắc kiểm soát đồng thời giống như bất kỳ loại dữ liệu nào khác khi được lưu trữ trong bảng. Mặc dù việc lưu trữ kèo chấp bóng đá hôm nay tài liệu lớn là có thể thực hiện được, hãy nhớ rằng bất kỳ bản cập nhật nào cũng có được khóa cấp hàng trên toàn bộ hàng.
Kiểm trangăn chặnlà một khả năng quan trọng củajsonbb. Không có bộ cơ sở song song chokèo chấp bóng đá hôm nayLoại. Kiểm tra ngăn chặn xem mộtjsonbbTài liệu có trong đó một tài liệu khác. kèo chấp bóng đá hôm nay ví dụ này trả về đúng ngoại trừ như đã lưu ý:
- Giá trị vô hướng/nguyên thủy đơn giản chỉ chứa giá trị giống hệt nhau:khôngđược coi là trong
Nguyên tắc chung là đối tượng chứa phải khớp với đối tượng chứa đối tượng với cấu trúc và nội dung dữ liệu, có thể sau khi loại bỏ một số phần tử mảng không khớp hoặc kèo chấp bóng đá hôm nay cặp giá trị/phím đối tượng khỏi đối tượng chứa. Nhưng hãy nhớ rằng thứ tự của kèo chấp bóng đá hôm nay phần tử mảng không có ý nghĩa khi thực hiện kết hợp ngăn chặn và kèo chấp bóng đá hôm nay phần tử mảng trùng lặp chỉ được xem xét một lần một lần.
Là một ngoại lệ đặc biệt đối với nguyên tắc chung là kèo chấp bóng đá hôm nay cấu trúc phải khớp, một mảng có thể chứa một giá trị nguyên thủy:
- Mảng này chứa giá trị chuỗi nguyên thủy:
jsonbcũng cótồn tạiToán tử, là một biến thể về chủ đề ngăn chặn: Nó kiểm tra xem một chuỗi (được đưa ra dưới dạngTextGiá trị) xuất hiện dưới dạng phần tử phím hoặc mảng đối tượng ở cấp cao nhất củaJSONBGiá trị. kèo chấp bóng đá hôm nay ví dụ này trả về đúng ngoại trừ như đã lưu ý:
- Chuỗi tồn tại dưới dạng phần tử mảng:
kèo chấp bóng đá hôm nay đối tượng JSON phù hợp hơn so với kèo chấp bóng đá hôm nay mảng để ngăn chặn hoặc tồn tại thử nghiệm khi có nhiều khóa hoặc phần tử liên quan, bởi vì không giống như kèo chấp bóng đá hôm nay mảng chúng được tối ưu hóa bên trong để tìm kiếm và không cần tìm kiếm tuyến tính.
Tip:Vì ngăn chặn JSON được lồng, một truy vấn thích hợp có thể bỏ qua lựa chọn rõ ràng kèo chấp bóng đá hôm nay đối tượng phụ. Ví dụ, giả sử rằng chúng ta có mộtDOCCột chứa kèo chấp bóng đá hôm nay đối tượng ở cấp cao nhất, với hầu hết kèo chấp bóng đá hôm nay đối tượng chứaTagskèo chấp bóng đá hôm nay trường chứa kèo chấp bóng đá hôm nay mảng của kèo chấp bóng đá hôm nay đối tượng phụ. Truy vấn này tìm kèo chấp bóng đá hôm nay mục trong đó kèo chấp bóng đá hôm nay đối tượng phụ chứa cả hai"Thuật ngữ": "Paris"và"Thuật ngữ": "Thực phẩm"xuất hiện, trong khi bỏ qua bất kỳ phím nào như vậy bên ngoàiTagsmảng:
Chọn Doc- 'SITE_NAME' từ kèo chấp bóng đá hôm nay trang webNgười ta có thể hoàn thành điều tương tự với, nói,
Chọn Doc- 'SITE_NAME' từ kèo chấp bóng đá hôm nay trang webNhưng cách tiếp cận đó kém linh hoạt và thường kém hiệu quả.
Mặt khác, toán tử tồn tại kèo chấp bóng đá hôm nay không được lồng: nó sẽ chỉ tìm kiếm khóa hoặc phần tử mảng được chỉ định ở cấp cao nhất của giá trị kèo chấp bóng đá hôm nay.
kèo chấp bóng đá hôm nay toán tử ngăn chặn và tồn tại khác nhau, cùng với tất cả kèo chấp bóng đá hôm nay toán tử và chức năng JSON khác được ghi lại trongPhần 9.15.
Chỉ mục GIN có thể được sử dụng để tìm kiếm hiệu quả kèo chấp bóng đá hôm nay khóa hoặc kèo chấp bóng đá hôm nay cặp khóa/giá trị xảy ra trong một số lượng lớnjsonbbTài liệu (mốc dữ liệu). Hai Gin"kèo chấp bóng đá hôm nay lớp toán tử"được cung cấp, cung cấp hiệu suất và sự đánh đổi linh hoạt khác nhau.
Lớp toán tử GIN mặc định chojsonbbHỗ trợ kèo chấp bóng đá hôm nay truy vấn với kèo chấp bóng đá hôm nay toán tử tồn tại khóa cấp cao nhất?, ? &và? |Toán tử và toán tử đường dẫn/giá trị@. (Để biết chi tiết về ngữ nghĩa mà kèo chấp bóng đá hôm nay toán tử này thực hiện, xemBảng 9-41.) Một ví dụ về việc tạo một chỉ mục với lớp toán tử này là:
Tạo IDXGIN IDXGIN trên API bằng Gin (JDOC);
Lớp toán tử GIN không mặc địnhJSONB_PATH_OPSHỗ trợ lập chỉ mục@Chỉ vận hành. Một ví dụ về việc tạo một chỉ mục với lớp toán tử này là:
Tạo IDXGINP trên API bằng Gin (JDOC JSONB_PATH_OPS);
Hãy xem xét ví dụ về một bảng lưu trữ kèo chấp bóng đá hôm nay tài liệu JSON được lấy từ dịch vụ web của bên thứ ba, với định nghĩa lược đồ được ghi lại. Một tài liệu điển hình là:
Chúng tôi lưu trữ kèo chấp bóng đá hôm nay tài liệu này trong một bảng có tênAPI, trong AjsonbCột có tênJDOC. Nếu một chỉ mục gin được tạo trên cột này, kèo chấp bóng đá hôm nay truy vấn như sau có thể sử dụng chỉ mục:
- Tìm kèo chấp bóng đá hôm nay tài liệu trong đó "công ty" có giá trị "magnafone"
Tuy nhiên, chỉ mục không thể được sử dụng cho kèo chấp bóng đá hôm nay truy vấn như sau, bởi vì mặc dù toán tử?Có thể lập chỉ mục, nó không được áp dụng trực tiếp cho cột được lập chỉ mụcJDOC:
- Tìm kèo chấp bóng đá hôm nay tài liệu trong đó "thẻ" khóa chứa phần tử khóa hoặc mảng "QUI"
Tuy nhiên, với việc sử dụng kèo chấp bóng đá hôm nay chỉ mục biểu thức phù hợp, truy vấn trên có thể sử dụng một chỉ mục. Nếu truy vấn cho kèo chấp bóng đá hôm nay mục cụ thể trong"Tags"khóa là phổ biến, xác định một chỉ mục như thế này có thể đáng giá:
Tạo IDXGINTAGS trên API bằng Gin ((JDOC - 'Tags'));
Bây giờ,WHEREmệnh đềJDOC - 'Tags'? 'Qui'sẽ được công nhận là ứng dụng của toán tử có thể lập chỉ mục?đến biểu thức được lập chỉ mụcJDOC - 'Tags'. (Có thể tìm thấy thêm thông tin về kèo chấp bóng đá hôm nay chỉ mục biểu thức trongPhần 11.7.)
Một cách tiếp cận khác để truy vấn là khai thác ngăn chặn, ví dụ:
- Tìm tài liệu trong đó "thẻ" khóa chứa phần tử mảng "QUI"
Một chỉ mục gin đơn giản trênJDOCCột có thể hỗ trợ truy vấn này. Nhưng lưu ý rằng một chỉ mục như vậy sẽ lưu trữ kèo chấp bóng đá hôm nay bản sao của mọi khóa và giá trị trongJDOCCột, trong khi chỉ mục biểu thức của ví dụ trước chỉ lưu trữ dữ liệu được tìm thấy dướiTagskhóa. Mặc dù cách tiếp cận chỉ số đơn giản linh hoạt hơn nhiều (vì nó hỗ trợ kèo chấp bóng đá hôm nay truy vấn về bất kỳ khóa nào), kèo chấp bóng đá hôm nay chỉ mục biểu thức được nhắm mục tiêu có khả năng nhỏ hơn và nhanh hơn để tìm kiếm so với một chỉ mục đơn giản.
mặc dùJSONB_PATH_OPSlớp toán tử chỉ hỗ trợ kèo chấp bóng đá hôm nay truy vấn với@Toán tử, nó có lợi thế hiệu suất đáng chú ý so với lớp toán tử mặc địnhjsonbb_ops. MỘTjsonb_path_opsChỉ mục thường nhỏ hơn nhiều so với Ajsonbb_opsChỉ mục trên cùng một dữ liệu và tính đặc hiệu của kèo chấp bóng đá hôm nay tìm kiếm tốt hơn, đặc biệt khi kèo chấp bóng đá hôm nay truy vấn chứa kèo chấp bóng đá hôm nay khóa xuất hiện thường xuyên trong dữ liệu. Do đó, kèo chấp bóng đá hôm nay hoạt động tìm kiếm thường hoạt động tốt hơn so với lớp toán tử mặc định.
Sự khác biệt kỹ thuật giữa Ajsonb_opsvà AJSONB_PATH_OPS29656_29826[1]Về cơ bản, mỗiJSONB_PATH_OPSMục chỉ mục là một hàm băm của giá trị và (kèo chấp bóng đá hôm nay) khóa dẫn đến nó; Ví dụ: chỉ mục"foo": "Bar": "Baz", một mục chỉ mục duy nhất sẽ được tạo kết hợp cả ba củafoo, BarvàBazvào giá trị băm. Do đó, một truy vấn ngăn chặn tìm kiếm cấu trúc này sẽ dẫn đến một tìm kiếm chỉ mục cực kỳ cụ thể;fooxuất hiện dưới dạng khóa. Mặt khác, Ajsonbb_opsINDEX sẽ tạo ba mục chỉ mục đại diện chofoo, BarvàBazriêng biệt; Sau đó để thực hiện truy vấn ngăn chặn, nó sẽ tìm kiếm kèo chấp bóng đá hôm nay hàng chứa cả ba mục này.JSONB_PATH_OPSTìm kiếm, đặc biệt nếu có một số lượng rất lớn kèo chấp bóng đá hôm nay hàng chứa bất kỳ một trong ba mục chỉ mục.
Một nhược điểm củaJSONB_PATH_OPSCách tiếp cận là nó không tạo ra kèo chấp bóng đá hôm nay mục nhập chỉ mục cho kèo chấp bóng đá hôm nay cấu trúc JSON không chứa bất kỳ giá trị nào, chẳng hạn như"A":. Nếu một tìm kiếm cho kèo chấp bóng đá hôm nay tài liệu chứa một cấu trúc như vậy được yêu cầu, nó sẽ yêu cầu quét toàn bộ chỉ số, khá chậm.jsonb_path_opsDo đó không phù hợp với kèo chấp bóng đá hôm nay ứng dụng thường thực hiện kèo chấp bóng đá hôm nay tìm kiếm đó.
JSONBcũng hỗ trợBtreevàHashChỉ mục. Đây thường chỉ hữu ích nếu điều quan trọng là kiểm tra sự bình đẳng của kèo chấp bóng đá hôm nay tài liệu JSON hoàn chỉnh.BtreeĐặt hàng choJSONBDatums hiếm khi được quan tâm lớn, nhưng cho sự hoàn chỉnh, đó là:
Đối tượng mảng Boolean Số chuỗi null Đối tượng với n cặp Đối tượng có n - 1 cặp mảng với n phần tử mảng có n - 1 phần tử
Đối tượng có số cặp bằng nhau được so sánh theo thứ tự:
Key-1, Value-1, key-2...
Lưu ý rằng kèo chấp bóng đá hôm nay khóa đối tượng được so sánh theo thứ tự lưu trữ của chúng; Cụ thể, vì kèo chấp bóng đá hôm nay khóa ngắn hơn được lưu trữ trước kèo chấp bóng đá hôm nay phím dài hơn, điều này có thể dẫn đến kết quả có thể không trực quan, chẳng hạn như:
"AA": 1, "C": 1 "B": 1, "D": 1
Tương tự, kèo chấp bóng đá hôm nay mảng có số lượng phần tử bằng nhau được so sánh theo thứ tự:
Element-1, Element-2...
Giá trị JSON nguyên thủy được so sánh bằng cách sử dụng kèo chấp bóng đá hôm nay quy tắc so sánh tương tự như đối với cơ bảnPOSTGRESQLKiểu dữ liệu. Chuỗi được so sánh bằng cách sử dụng đối chiếu cơ sở dữ liệu mặc định.
[1] |
Với mục đích này, thuật ngữ"Giá trị"Bao gồm kèo chấp bóng đá hôm nay phần tử mảng, mặc dù thuật ngữ JSON đôi khi xem xét kèo chấp bóng đá hôm nay phần tử mảng khác biệt với kèo chấp bóng đá hôm nay giá trị trong kèo chấp bóng đá hôm nay đối tượng. |