8.14. Ð¢Ð¸Ð¿Ñ JSON
Ð¢Ð¸Ð¿Ñ JSON пÑедназнаÑÐµÐ½Ñ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
JSON (JavaScript Object Notation, ÐапиÑÑ Ð¾Ð±ÑекÑа JavaScript) ÑоглаÑно ÑÑандаÑÑÑ RFC 7159. Такие даннÑе можно Ñ
ÑаниÑÑ Ð¸ в Ñипе text, но ÑÐ¸Ð¿Ñ JSON лÑÑÑе Ñем, ÑÑо пÑовеÑÑÑÑ, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ вводимое знаÑение ÑоÑмаÑÑ JSON. ÐÐ»Ñ ÑабоÑÑ Ñ Ð½Ð¸Ð¼Ð¸ еÑÑÑ Ñакже неÑколÑко ÑпеÑиалÑнÑÑ
ÑÑнкÑий и опеÑаÑоÑов; Ñм. Раздел 9.15.
СÑÑеÑÑвÑÑÑ Ð´Ð²Ð° Ñипа даннÑÑ
JSON: json и jsonb. Ðни пÑинимаÑÑ Ð½Ð° вÑ
од поÑÑи одинаковÑе набоÑÑ Ð·Ð½Ð°Ñений, а оÑлиÑаÑÑÑÑ Ð³Ð»Ð°Ð²Ð½Ñм обÑазом Ñ ÑоÑки зÑÐµÐ½Ð¸Ñ ÑÑÑекÑивноÑÑи. Тип json ÑоÑ
ÑанÑÐµÑ ÑоÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð²Ð²ÐµÐ´Ñнного ÑекÑÑа, коÑоÑÑÑ ÑÑнкÑии обÑабоÑки Ð´Ð¾Ð»Ð¶Ð½Ñ ÑазбиÑаÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾ пÑи каждом вÑполнении запÑоÑа, Ñогда как даннÑе jsonb ÑоÑ
ÑанÑÑÑÑÑ Ð² ÑазобÑанном двоиÑном ÑоÑмаÑе, ÑÑо неÑколÑко замедлÑÐµÑ Ð²Ð²Ð¾Ð´ из-за пÑеобÑазованиÑ, но знаÑиÑелÑно ÑÑкоÑÑÐµÑ Ð¾Ð±ÑабоÑкÑ, не ÑÑебÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑаÑного ÑазбоÑа ÑекÑÑа. ÐÑоме Ñого, jsonb поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑаÑиÑ, ÑÑо Ñоже Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑÐµÐ½Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾.
Так как Ñип json ÑоÑ
ÑанÑÐµÑ ÑоÑнÑÑ ÐºÐ¾Ð¿Ð¸Ñ Ð²Ð²ÐµÐ´Ñнного ÑекÑÑа, он ÑоÑ
ÑанÑÐµÑ ÑеманÑиÑеÑки незнаÑаÑие пÑÐ¾Ð±ÐµÐ»Ñ Ð¼ÐµÐ¶Ð´Ñ ÑлеменÑами, а Ñакже поÑÑдок клÑÑей в JSON-обÑекÑаÑ
. РеÑли JSON-обÑÐµÐºÑ Ð²Ð½ÑÑÑи ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð²ÑоÑÑÑÑиеÑÑ ÐºÐ»ÑÑи, ÑÑÐ¾Ñ Ñип ÑоÑ
ÑÐ°Ð½Ð¸Ñ Ð²Ñе паÑÑ ÐºÐ»ÑÑ/знаÑение. (ФÑнкÑии обÑабоÑки бÑдÑÑ ÑÑиÑаÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑной поÑледнÑÑ Ð¿Ð°ÑÑ.) Тип jsonb, напÑоÑив, не ÑоÑ
ÑанÑÐµÑ Ð¿ÑобелÑ, поÑÑдок клÑÑей и знаÑÐµÐ½Ð¸Ñ Ñ Ð´ÑблиÑÑÑÑимиÑÑ ÐºÐ»ÑÑами. ÐÑли во вÑ
однÑÑ
даннÑÑ
оказÑваÑÑÑÑ Ð´ÑблиÑÑÑÑиеÑÑ ÐºÐ»ÑÑи, ÑоÑ
ÑанÑеÑÑÑ ÑолÑко поÑледнее знаÑение.
ÐÐ»Ñ Ð±Ð¾Ð»ÑÑинÑÑва пÑиложений пÑедпоÑÑиÑелÑнее Ñ
ÑаниÑÑ Ð´Ð°Ð½Ð½Ñе JSON в Ñипе jsonb (еÑли Ð½ÐµÑ Ð¾ÑобÑÑ
пÑоÑивопоказаний, напÑÐ¸Ð¼ÐµÑ Ð²Ð°Ð¶Ð½Ñ Ð¿Ñежние пÑÐµÐ´Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¾ поÑÑдке клÑÑей обÑекÑов).
Postgres Pro позволÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑолÑко Ð¾Ð´Ð½Ñ ÐºÐ¾Ð´Ð¸ÑÐ¾Ð²ÐºÑ Ñимволов в базе даннÑÑ , поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ñе JSON не бÑдÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑооÑвеÑÑÑвоваÑÑ ÑпеÑиÑикаÑии, еÑли кодиÑовка Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð½Ðµ UTF-8. ÐÑи ÑÑом нелÑÐ·Ñ Ð±ÑÐ´ÐµÑ Ð²ÑÑавиÑÑ ÑимволÑ, непÑедÑÑавимÑе в кодиÑовке ÑеÑвеÑа, и наобоÑоÑ, допÑÑÑимÑми бÑдÑÑ ÑимволÑ, пÑедÑÑавимÑе в кодиÑовке ÑеÑвеÑа, но не в UTF-8.
RFC 7159 ÑазÑеÑÐ°ÐµÑ Ð²ÐºÐ»ÑÑаÑÑ Ð² ÑÑÑоки JSON ÑпеÑпоÑледоваÑелÑноÑÑи Unicode в виде \u. Ð ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° Ð´Ð»Ñ Ñипа XXXXjson ÑÑи ÑпеÑпоÑледоваÑелÑноÑÑи допÑÑкаÑÑÑÑ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ ÐºÐ¾Ð´Ð¸Ñовки Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, и пÑовеÑÑеÑÑÑ ÑолÑко пÑавилÑноÑÑÑ Ð¸Ñ
ÑинÑакÑиÑа (за \u Ð´Ð¾Ð»Ð¶Ð½Ñ ÑледоваÑÑ ÑеÑÑÑе ÑеÑÑнадÑаÑеÑиÑнÑÑ
ÑиÑÑÑ). Ðднако, ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° Ð´Ð»Ñ Ñипа jsonb более ÑÑÑогаÑ: она не допÑÑÐºÐ°ÐµÑ ÑпеÑпоÑледоваÑелÑноÑÑи Unicode Ð´Ð»Ñ Ð½Ðµ ASCII-Ñимволов (Ñимволов поÑле U+007F), еÑли кодиÑовка Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
не UTF8. Тип jsonb Ñакже не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ \u0000 (Ñак как ÑÑо знаÑение не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑедÑÑавлено в Ñипе text Postgres Pro), и ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ ÑÑÑÑогаÑнÑе паÑÑ Unicode иÑполÑзовалиÑÑ Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ñимволов вне оÑновной многоÑзÑковой плоÑкоÑÑи (BMP) пÑавилÑно. ÐоÑÑекÑнÑе ÑпеÑпоÑледоваÑелÑноÑÑи Unicode пÑеобÑазÑÑÑÑÑ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð² ÑооÑвеÑÑÑвÑÑÑий Ñимвол ASCII или UTF8 (ÑÑо подÑазÑÐ¼ÐµÐ²Ð°ÐµÑ ÑвоÑаÑивание ÑÑÑÑогаÑнÑÑ
Ð¿Ð°Ñ Ð² один Ñимвол).
ÐÑимеÑание
Ðногие из ÑÑнкÑий обÑабоÑки JSON, опиÑаннÑе в Разделе 9.15, пÑеобÑазÑÑÑ ÑпеÑпоÑледоваÑелÑноÑÑи Unicode в обÑÑнÑе ÑимволÑ, поÑÑÐ¾Ð¼Ñ Ð¼Ð¾Ð³ÑÑ Ð²ÑдаваÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе оÑибки, даже еÑли им на вÑ
од поÑÑÑÐ¿Ð°ÐµÑ Ñип json, а не jsonb. То, ÑÑо ÑÑнкÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð° в Ñип json не пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ ÑÑиÑ
пÑовеÑок, можно ÑÑиÑаÑÑ Ð¸ÑÑоÑиÑеÑким аÑÑеÑакÑом, Ñ
оÑÑ ÑÑо и позволÑÐµÑ Ð¿ÑоÑÑо ÑоÑ
ÑанÑÑÑ (но не обÑабаÑÑваÑÑ) в JSON ÑпеÑÐºÐ¾Ð´Ñ Unicode в базе даннÑÑ
Ñ ÐºÐ¾Ð´Ð¸Ñовкой не UTF8. ÐообÑе же, по возможноÑÑи ÑледÑÐµÑ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ ÑмеÑÐµÐ½Ð¸Ñ ÑпеÑкодов Unicode в JSON Ñ ÐºÐ¾Ð´Ð¸Ñовкой базой даннÑÑ
не UTF8.
ÐÑи пÑеобÑазовании вводимого ÑекÑÑа JSON в Ñип jsonb, пÑимиÑивнÑе ÑипÑ, опиÑаннÑе в RFC 7159, по ÑÑÑи оÑобÑажаÑÑÑÑ Ð² ÑобÑÑвеннÑе ÑÐ¸Ð¿Ñ Postgres Pro как показано в ТаблиÑе 8.23. Таким обÑазом, к ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ Ñипа jsonb пÑедÑÑвлÑÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе дополниÑелÑнÑе ÑÑебованиÑ, пÑодикÑованнÑе огÑаниÑениÑми пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñего Ñипа даннÑÑ
, коÑоÑÑе не ÑаÑпÑоÑÑÑанÑÑÑÑÑ Ð½Ð¸ на Ñип json, ни на ÑоÑÐ¼Ð°Ñ JSON вообÑе. Ð ÑаÑÑноÑÑи, Ñип jsonb не пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑиÑла, вÑÑ
одÑÑие за диапазон Ñипа даннÑÑ
Postgres Pro numeric, Ñогда как Ñ json Ñакого огÑаниÑÐµÐ½Ð¸Ñ Ð½ÐµÑ. Такие огÑаниÑениÑ, накладÑваемÑе ÑеализаÑией, допÑÑкаÑÑÑÑ ÑоглаÑно RFC 7159. Ðднако, на пÑакÑике Ñакие пÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð±Ð¾Ð»ÐµÐµ веÑоÑÑÐ½Ñ Ð² дÑÑгиÑ
ÑеализаÑиÑÑ
, Ñак как обÑÑно пÑимиÑивнÑй Ñип JSON number пÑедÑÑавлÑеÑÑÑ Ð² виде ÑиÑла Ñ Ð¿Ð»Ð°Ð²Ð°ÑÑей ÑоÑкой двойной ÑоÑноÑÑи IEEE 754 (ÑÑо RFC 7159 Ñвно пÑизнаÑÑ Ð¸ допÑÑкаеÑ). ÐÑи иÑполÑзовании JSON в каÑеÑÑве ÑоÑмаÑа обмена даннÑми Ñ Ñакими ÑиÑÑемами ÑледÑÐµÑ ÑÑиÑÑваÑÑ ÑиÑки поÑеÑи ÑоÑноÑÑи ÑиÑел, Ñ
ÑанивÑиÑ
ÑÑ Ð² Postgres Pro.
РнапÑоÑив, как показано в ÑаблиÑе, еÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе огÑаниÑÐµÐ½Ð¸Ñ Ð² ÑоÑмаÑе ввода пÑимиÑивнÑÑ Ñипов JSON, не акÑÑалÑнÑе Ð´Ð»Ñ ÑооÑвеÑÑÑвÑÑÑÐ¸Ñ Ñипов Postgres Pro.
ТаблиÑа 8.23. ÐÑимиÑивнÑе ÑÐ¸Ð¿Ñ JSON и ÑооÑвеÑÑÑвÑÑÑие им ÑÐ¸Ð¿Ñ Postgres Pro
| ÐÑимиÑивнÑй Ñип JSON | Тип Postgres Pro | ÐамеÑÐ°Ð½Ð¸Ñ |
|---|---|---|
string | text | \u0000 не допÑÑкаеÑÑÑ, как не ASCII Ñимвол, еÑли кодиÑовка Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
не UTF8 |
number | numeric | ÐнаÑÐµÐ½Ð¸Ñ NaN и infinity не допÑÑкаÑÑÑÑ |
boolean | boolean | ÐопÑÑкаÑÑÑÑ ÑолÑко ваÑианÑÑ true и false (в нижнем ÑегиÑÑÑе) |
null | (неÑ) | NULL в SQL Ð¸Ð¼ÐµÐµÑ Ð´ÑÑгой ÑмÑÑл |
8.14.1. СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð¸Ð¼ÑÑ Ð¸ вÑводимÑÑ Ð·Ð½Ð°Ñений JSON
СинÑакÑÐ¸Ñ Ð²Ð²Ð¾Ð´Ð°/вÑвода Ñипов даннÑÑ JSON ÑооÑвеÑÑÑвÑÐµÑ ÑÑандаÑÑÑ RFC 7159.
ÐÑимеÑÑ Ð´Ð¾Ð¿ÑÑÑимÑÑ
вÑÑажений Ñ Ñипом json (или jsonb):
-- ÐÑоÑÑое ÑкалÑÑное/пÑимиÑивное знаÑение
-- ÐÑоÑÑÑми знаÑениÑми могÑÑ Ð±ÑÑÑ ÑиÑла, ÑÑÑоки в кавÑÑкаÑ
, true, false или null
SELECT '5'::json;
-- ÐаÑÑив из нÑÐ»Ñ Ð¸ более ÑлеменÑов (ÑлеменÑÑ Ð¼Ð¾Ð³ÑÑ Ð±ÑÑÑ ÑазнÑÑ
Ñипов)
SELECT '[1, 2, "foo", null]'::json;
-- ÐбÑекÑ, ÑодеÑжаÑий паÑÑ ÐºÐ»ÑÑей и знаÑений
-- ÐамеÑÑÑе, ÑÑо клÑÑи обÑекÑов â ÑÑо вÑегда ÑÑÑоки в кавÑÑкаÑ
SELECT '{"bar": "baz", "balance": 7.77, "active": false}'::json;
-- ÐаÑÑÐ¸Ð²Ñ Ð¸ обÑекÑÑ Ð¼Ð¾Ð³ÑÑ Ð²ÐºÐ»Ð°Ð´ÑваÑÑÑÑ Ð¿ÑоизволÑнÑм обÑазом
SELECT '{"foo": [true, "bar"], "tags": {"a": 1, "b": null}}'::json;Ðак бÑло Ñказано Ñанее, когда знаÑение JSON вводиÑÑÑ Ð¸ заÑем вÑводиÑÑÑ Ð±ÐµÐ· дополниÑелÑной обÑабоÑки, Ñип json вÑÐ²Ð¾Ð´Ð¸Ñ ÑÐ¾Ñ Ð¶Ðµ ÑекÑÑ, ÑÑо поÑÑÑпил на вÑ
од, а jsonb не ÑоÑ
ÑанÑÐµÑ ÑеманÑиÑеÑки незнаÑаÑие деÑали, Ñакие как пÑобелÑ. ÐапÑимеÑ, поÑмоÑÑиÑе на ÑÑи ÑазлиÑиÑ:
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json;
json
-------------------------------------------------
{"bar": "baz", "balance": 7.77, "active":false}
(1 row)
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb;
jsonb
--------------------------------------------------
{"bar": "baz", "active": false, "balance": 7.77}
(1 row) ÐеÑÐ²Ð°Ñ ÑеманÑиÑеÑки незнаÑÐ¸Ð¼Ð°Ñ Ð´ÐµÑалÑ, заÑлÑживаÑÑÐ°Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ: Ñ jsonb ÑиÑла вÑводÑÑÑÑ Ð¿Ð¾ пÑавилам нижележаÑего Ñипа numeric. Ðа пÑакÑике ÑÑо ознаÑаеÑ, ÑÑо ÑиÑла, заданнÑе в запиÑи Ñ E, бÑдÑÑ Ð²ÑÐ²ÐµÐ´ÐµÐ½Ñ Ð±ÐµÐ· неÑ, напÑимеÑ:
SELECT '{"reading": 1.230e-5}'::json, '{"reading": 1.230e-5}'::jsonb;
json | jsonb
-----------------------+-------------------------
{"reading": 1.230e-5} | {"reading": 0.00001230}
(1 row) Ðднако, как видно из ÑÑого пÑимеÑа, jsonb ÑоÑ
ÑанÑÐµÑ ÐºÐ¾Ð½ÐµÑнÑе нÑли дÑобного ÑиÑла, Ñ
оÑÑ Ð¾Ð½Ð¸ и не имеÑÑ ÑеманÑиÑеÑкой знаÑимоÑÑи, в ÑаÑÑноÑÑи Ð´Ð»Ñ Ð¿ÑовеÑки на ÑавенÑÑво.
8.14.2. ÐÑÑекÑÐ¸Ð²Ð½Ð°Ñ Ð¾ÑганизаÑÐ¸Ñ Ð´Ð¾ÐºÑменÑов JSON
ÐÑедÑÑавлÑÑÑ Ð´Ð°Ð½Ð½Ñе в JSON можно гоÑаздо более гибко, Ñем в ÑÑадиÑионной ÑелÑÑионной модели даннÑÑ , ÑÑо оÑÐµÐ½Ñ Ð¿ÑивлекаÑелÑно Ñам, где Ð½ÐµÑ Ð¶ÑÑÑÐºÐ¸Ñ ÑÑловий. Роба ÑÑÐ¸Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð° вполне могÑÑ ÑоÑÑÑеÑÑвоваÑÑ Ð¸ дополнÑÑÑ Ð´ÑÑг дÑÑга в одном пÑиложении. Ðднако даже Ð´Ð»Ñ Ð¿Ñиложений, коÑоÑÑм нÑжна макÑималÑÐ½Ð°Ñ Ð³Ð¸Ð±ÐºÐ¾ÑÑÑ, ÑекомендÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð´Ð¾ÐºÑменÑÑ JSON имели некоÑоÑÑÑ ÑикÑиÑованнÑÑ ÑÑÑÑкÑÑÑÑ. ÐÑа ÑÑÑÑкÑÑÑа обÑÑно не навÑзÑваеÑÑÑ Ð¶ÑÑÑко (Ñ Ð¾ÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ деклаÑаÑивно дикÑоваÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе бизнеÑ-пÑавила), но когда она пÑедÑказÑема, ÑÑановиÑÑÑ Ð³Ð¾Ñаздо пÑоÑе пиÑаÑÑ Ð·Ð°Ð¿ÑоÑÑ, коÑоÑÑе извлекаÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñе даннÑе из набоÑа «докÑменÑов» (инÑоÑмаÑии) в ÑаблиÑе.
ÐаннÑе JSON, как и даннÑе лÑбÑÑ Ð´ÑÑÐ³Ð¸Ñ Ñипов, Ñ ÑанÑÑиеÑÑ Ð² ÑаблиÑÐ°Ñ , Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ Ð¿Ð¾Ð´ конÑÑолем Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° паÑаллелÑного доÑÑÑпа. ХоÑÑ Ñ ÑаниÑÑ Ð±Ð¾Ð»ÑÑие докÑменÑÑ Ð²Ð¿Ð¾Ð»Ð½Ðµ возможно, не забÑвайÑе, ÑÑо пÑи лÑбом изменении ÑÑÑанавливаеÑÑÑ Ð±Ð»Ð¾ÐºÐ¸Ñовка вÑей ÑÑÑоки (на ÑÑовне ÑÑÑоки). ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¾Ð¿ÑимизаÑии блокиÑовок ÑÑанзакÑий, изменÑÑÑÐ¸Ñ Ð´Ð°Ð½Ð½Ñе, ÑÑÐ¾Ð¸Ñ Ð¾Ð³ÑаниÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð´Ð¾ÐºÑменÑов JSON ÑазÑмнÑми пÑеделами. Ридеале каждÑй докÑÐ¼ÐµÐ½Ñ JSON должен Ñобой пÑедÑÑавлÑÑÑ Ð°ÑомаÑнÑй инÑоÑмаÑионнÑй блок, коÑоÑÑй, ÑоглаÑно бизнеÑ-логике, нелÑÐ·Ñ ÑазделиÑÑ Ð½Ð° менÑÑие, индивидÑалÑно изменÑемÑе блоки.
8.14.3. ÐÑовеÑки на вÑ
ождение и ÑÑÑеÑÑвование jsonb
ÐÑовеÑка вÑ
Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ â Ð²Ð°Ð¶Ð½Ð°Ñ Ð¾ÑобенноÑÑÑ Ñипа jsonb, не имеÑÑÐ°Ñ Ð°Ð½Ð°Ð»Ð¾Ð³Ð° Ð´Ð»Ñ Ñипа json. ÐÑа пÑовеÑка опÑеделÑеÑ, вÑ
Ð¾Ð´Ð¸Ñ Ð»Ð¸ один докÑÐ¼ÐµÐ½Ñ jsonb в дÑÑгой. Ð ÑледÑÑÑиÑ
пÑимеÑаÑ
возвÑаÑаеÑÑÑ Ð¸ÑÑинное знаÑение (кÑоме ÑпомÑнÑÑÑÑ
иÑклÑÑений):
-- ÐÑоÑÑÑе ÑкалÑÑнÑе/пÑимиÑивнÑе знаÑÐµÐ½Ð¸Ñ Ð²ÐºÐ»ÑÑаÑÑ ÑолÑко одно иденÑиÑное знаÑение:
SELECT '"foo"'::jsonb @> '"foo"'::jsonb;
-- ÐаÑÑив Ñ Ð¿Ñавой ÑÑоÑÐ¾Ð½Ñ Ð²Ñ
Ð¾Ð´Ð¸Ñ Ð² маÑÑив Ñлева:
SELECT '[1, 2, 3]'::jsonb @> '[1, 3]'::jsonb;
-- ÐоÑÑдок ÑлеменÑов в маÑÑиве не важен, поÑÑÐ¾Ð¼Ñ ÑÑо ÑÑловие Ñоже вÑполнÑеÑÑÑ:
SELECT '[1, 2, 3]'::jsonb @> '[3, 1]'::jsonb;
-- РповÑоÑÑÑÑиеÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива не имеÑÑ Ð·Ð½Ð°ÑениÑ:
SELECT '[1, 2, 3]'::jsonb @> '[1, 2, 2]'::jsonb;
-- ÐбÑÐµÐºÑ Ñ Ð¾Ð´Ð½Ð¾Ð¹ паÑой ÑпÑава вÑ
Ð¾Ð´Ð¸Ñ Ð² обÑÐµÐºÑ Ñлева:
SELECT '{"product": "PostgreSQL", "version": 9.4, "jsonb": true}'::jsonb @> '{"version": 9.4}'::jsonb;
-- ÐаÑÑив ÑпÑава не ÑÑиÑаеÑÑÑ Ð²Ñ
одÑÑим в
-- маÑÑив Ñлева, Ñ
оÑÑ Ð² поÑледний и вложен подобнÑй маÑÑив:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[1, 3]'::jsonb; -- вÑдаÑÑ false
-- Ðо еÑли добавиÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑи, пÑовеÑка на вÑ
ождение вÑполнÑеÑÑÑ:
SELECT '[1, 2, [1, 3]]'::jsonb @> '[[1, 3]]'::jsonb;
-- ÐналогиÑно, ÑÑо вÑ
ождением не ÑÑиÑаеÑÑÑ:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"bar": "baz"}'::jsonb; -- вÑдаÑÑ false
-- ÐлÑÑ Ñ Ð¿ÑÑÑÑм обÑекÑом на веÑÑ
нем ÑÑовне вÑ
Ð¾Ð´Ð¸Ñ Ð² обÑÐµÐºÑ Ñ Ñаким клÑÑом:
SELECT '{"foo": {"bar": "baz"}}'::jsonb @> '{"foo": {}}'::jsonb;ÐбÑий пÑинÑип ÑÑой пÑовеÑки в Ñом, ÑÑо Ð²Ñ Ð¾Ð´ÑÑий обÑÐµÐºÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑооÑвеÑÑÑвоваÑÑ Ð¾Ð±ÑекÑÑ, ÑодеÑжаÑÐµÐ¼Ñ ÐµÐ³Ð¾, по ÑÑÑÑкÑÑÑе и даннÑм, возможно, поÑле иÑклÑÑÐµÐ½Ð¸Ñ Ð¸Ð· ÑодеÑжаÑего обÑекÑа лиÑÐ½Ð¸Ñ ÑлеменÑов маÑÑива или Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение. Ðо помниÑе, ÑÑо поÑÑдок ÑлеменÑов маÑÑива Ð´Ð»Ñ Ð¿ÑовеÑки на Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ðµ не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ, а повÑоÑÑÑÑиеÑÑ ÑлеменÑÑ Ð¼Ð°ÑÑива ÑÑиÑаÑÑÑÑ ÑолÑко один Ñаз.
РкаÑеÑÑве оÑобого иÑклÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸Ð´ÐµÐ½ÑиÑноÑÑи ÑÑÑÑкÑÑÑ, маÑÑив Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ Ð¿ÑимиÑивное знаÑение:
-- Ð ÑÑÐ¾Ñ Ð¼Ð°ÑÑив Ð²Ñ Ð¾Ð´Ð¸Ñ Ð¿ÑимиÑивное ÑÑÑоковое знаÑение: SELECT '["foo", "bar"]'::jsonb @> '"bar"'::jsonb; -- ÐÑо иÑклÑÑение дейÑÑвÑÐµÑ ÑолÑко в Ð¾Ð´Ð½Ñ ÑÑоÑÐ¾Ð½Ñ -- здеÑÑ Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½ÐµÑ: SELECT '"bar"'::jsonb @> '["bar"]'::jsonb; -- вÑдаÑÑ false
ÐÐ»Ñ Ñипа jsonb введÑн Ñакже опеÑаÑÐ¾Ñ ÑÑÑеÑÑвованиÑ, коÑоÑÑй ÑвлÑеÑÑÑ Ð²Ð°ÑиаÑией на ÑÐµÐ¼Ñ Ð²Ñ
ождениÑ: он пÑовеÑÑеÑ, ÑвлÑеÑÑÑ Ð»Ð¸ ÑÑÑока (Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ð² виде знаÑÐµÐ½Ð¸Ñ text) клÑÑом обÑекÑа или ÑлеменÑом маÑÑива на веÑÑ
нем ÑÑовне знаÑÐµÐ½Ð¸Ñ jsonb. Ð ÑледÑÑÑиÑ
пÑимеÑаÑ
возвÑаÑаеÑÑÑ Ð¸ÑÑинное знаÑение (кÑоме ÑпомÑнÑÑÑÑ
иÑклÑÑений):
-- СÑÑока ÑÑÑеÑÑвÑÐµÑ Ð² каÑеÑÑве ÑлеменÑа маÑÑива:
SELECT '["foo", "bar", "baz"]'::jsonb ? 'bar';
-- СÑÑока ÑÑÑеÑÑвÑÐµÑ Ð² каÑеÑÑве клÑÑа обÑекÑа:
SELECT '{"foo": "bar"}'::jsonb ? 'foo';
-- ÐнаÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов не ÑаÑÑмаÑÑиваÑÑÑÑ:
SELECT '{"foo": "bar"}'::jsonb ? 'bar'; -- вÑдаÑÑ false
-- Ðак и вÑ
ождение, ÑÑÑеÑÑвование опÑеделÑеÑÑÑ Ð½Ð° веÑÑ
нем ÑÑовне:
SELECT '{"foo": {"bar": "baz"}}'::jsonb ? 'bar'; -- вÑдаÑÑ false
-- СÑÑока ÑÑиÑаеÑÑÑ ÑÑÑеÑÑвÑÑÑей, еÑли она ÑооÑвеÑÑÑвÑÐµÑ Ð¿ÑимиÑивной ÑÑÑоке JSON:
SELECT '"foo"'::jsonb ? 'foo';ÐбÑекÑÑ JSON Ð´Ð»Ñ Ð¿ÑовеÑок на ÑÑÑеÑÑвование и Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ðµ Ñо множеÑÑвом клÑÑей или ÑлеменÑов Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑ Ð±Ð¾Ð»ÑÑе, Ñем маÑÑивÑ, Ñак как, в оÑлиÑие Ð¾Ñ Ð¼Ð°ÑÑивов, они внÑÑÑи опÑимизиÑÑÑÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка, и поиÑк ÑлеменÑа не бÑÐ´ÐµÑ Ð»Ð¸Ð½ÐµÐ¹Ð½Ñм.
ÐодÑказка
Так как вÑ
ождение в JSON пÑовеÑÑеÑÑÑ Ñ ÑÑÑÑом вложенноÑÑи, пÑавилÑно напиÑаннÑй запÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð¼ÐµÐ½Ð¸ÑÑ ÑвнÑÑ Ð²ÑбоÑÐºÑ Ð²Ð½ÑÑÑенниÑ
обÑекÑов. ÐапÑимеÑ, пÑедположим, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑÑÐ¾Ð»Ð±ÐµÑ doc, ÑодеÑжаÑий обÑекÑÑ Ð½Ð° веÑÑ
нем ÑÑовне, и болÑÑинÑÑво ÑÑиÑ
обÑекÑов ÑодеÑÐ¶Ð¸Ñ Ð¿Ð¾Ð»Ñ tags Ñ Ð¼Ð°ÑÑивами вложеннÑÑ
обÑекÑов. ÐаннÑй запÑÐ¾Ñ Ð½Ð°Ð¹Ð´ÑÑ Ð·Ð°Ð¿Ð¸Ñи, в коÑоÑÑÑ
вложеннÑе обÑекÑÑ ÑодеÑÐ¶Ð°Ñ ÐºÐ»ÑÑи "term":"paris" и "term":"food", и пÑи ÑÑом пÑопÑÑÑÐ¸Ñ Ñакие клÑÑи, наÑ
одÑÑиеÑÑ Ð²Ð½Ðµ маÑÑива tags:
SELECT doc->'site_name' FROM websites
WHERE doc @> '{"tags":[{"term":"paris"}, {"term":"food"}]}';ÐÑого же ÑезÑлÑÑаÑа можно добиÑÑÑÑ, напÑимеÑ, Ñак:
SELECT doc->'site_name' FROM websites
WHERE doc->'tags' @> '[{"term":"paris"}, {"term":"food"}]';Ðо даннÑй Ð¿Ð¾Ð´Ñ Ð¾Ð´ менее гибкий и ÑаÑÑо Ñакже менее ÑÑÑекÑивнÑй.
С дÑÑгой ÑÑоÑонÑ, опеÑаÑÐ¾Ñ ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ JSON не ÑÑиÑÑÐ²Ð°ÐµÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾ÑÑÑ: он бÑÐ´ÐµÑ Ð¸ÑкаÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñй клÑÑ Ð¸Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива ÑолÑко на веÑÑ Ð½ÐµÐ¼ ÑÑовне знаÑÐµÐ½Ð¸Ñ JSON.
РазлиÑнÑе опеÑаÑоÑÑ Ð²Ñ Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ ÑÑÑеÑÑвованиÑ, а Ñакже вÑе дÑÑгие опеÑаÑоÑÑ Ð¸ ÑÑнкÑии Ð´Ð»Ñ ÑабоÑÑ Ñ JSON докÑменÑиÑÐ¾Ð²Ð°Ð½Ñ Ð² Разделе 9.15.
8.14.4. ÐндекÑаÑÐ¸Ñ jsonb
ÐÐ»Ñ ÑÑÑекÑивного поиÑка клÑÑей или Ð¿Ð°Ñ ÐºÐ»ÑÑ/знаÑение в болÑÑом колиÑеÑÑве докÑменÑов jsonb можно ÑÑпеÑно пÑименÑÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ GIN. ÐÐ»Ñ ÑÑого пÑедоÑÑавлÑÑÑÑÑ Ð´Ð²Ð° «клаÑÑа опеÑаÑоÑов» GIN, пÑедлагаÑÑие вÑÐ±Ð¾Ñ Ð¼ÐµÐ¶Ð´Ñ Ð¿ÑоизводиÑелÑноÑÑÑÑ Ð¸ гибкоÑÑÑÑ.
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GIN по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ jsonb поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑами ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑÑа на веÑÑ
нем ÑÑовне (?, ?& и ?|) и опеÑаÑоÑом ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑÑи/знаÑÐµÐ½Ð¸Ñ (@>). (ÐодÑобнее ÑеманÑика, ÑеализÑÐµÐ¼Ð°Ñ ÑÑими опеÑаÑоÑами, опиÑана в ТаблиÑе 9.41.) ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа Ñ ÑÑим клаÑÑом опеÑаÑоÑов:
CREATE INDEX idxgin ON api USING GIN (jdoc);
ÐополниÑелÑнÑй клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GIN jsonb_path_ops поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑаÑÐ¸Ñ ÑолÑко Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа @>. ÐÑÐ¸Ð¼ÐµÑ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑа Ñ ÑÑим клаÑÑом опеÑаÑоÑов:
CREATE INDEX idxginp ON api USING GIN (jdoc jsonb_path_ops);
РаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ ÑаблиÑÑ, в коÑоÑой Ñ ÑанÑÑÑÑ Ð´Ð¾ÐºÑменÑÑ JSON, полÑÑаемÑе Ð¾Ñ ÑÑоÑонней веб-ÑлÑжбÑ, Ñ Ð´Ð¾ÐºÑменÑиÑованнÑм опÑеделением ÑÑ ÐµÐ¼Ñ. ТипиÑнÑй докÑменÑ:
{
"guid": "9c36adc1-7fb5-4d5b-83b4-90356a46061a",
"name": "Angela Barton",
"is_active": true,
"company": "Magnafone",
"address": "178 Howard Place, Gulf, Washington, 702",
"registered": "2009-11-07T08:53:22 +08:00",
"latitude": 19.793713,
"longitude": 86.513373,
"tags": [
"enim",
"aliquip",
"qui"
]
} ÐÑ ÑоÑ
ÑанÑем ÑÑи докÑменÑÑ Ð² ÑаблиÑе api, в ÑÑолбÑе jdoc Ñипа jsonb. ÐÑли по ÑÑÐ¾Ð¼Ñ ÑÑолбÑÑ ÑоздаÑÑÑÑ GIN-индекÑ, он Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑименÑÑÑÑÑ Ð² подобнÑÑ
запÑоÑаÑ
:
-- ÐайÑи докÑменÑÑ, в коÑоÑÑÑ
клÑÑ "company" Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение "Magnafone"
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"company": "Magnafone"}'; Ðднако, в ÑледÑÑÑиÑ
запÑоÑаÑ
он не бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ, поÑÐ¾Ð¼Ñ ÑÑо, неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо опеÑаÑÐ¾Ñ ? â индекÑиÑÑемÑй, он пÑименÑеÑÑÑ Ð½Ðµ к индекÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÑолбÑÑ jdoc непоÑÑедÑÑвенно:
-- ÐайÑи докÑменÑÑ, в коÑоÑÑÑ ÐºÐ»ÑÑ "tags" ÑодеÑÐ¶Ð¸Ñ ÐºÐ»ÑÑ Ð¸Ð»Ð¸ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива "qui" SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc -> 'tags' ? 'qui';
РвÑÑ Ð¶Ðµ, пÑавилÑно пÑименÑÑ Ð¸Ð½Ð´ÐµÐºÑÑ Ð²ÑÑажений, в ÑÑом запÑоÑе можно задейÑÑвоваÑÑ Ð¸Ð½Ð´ÐµÐºÑ. ÐÑли запÑÐ¾Ñ Ð¾Ð¿ÑеделÑннÑÑ
ÑлеменÑов в клÑÑе "tags" вÑполнÑеÑÑÑ ÑаÑÑо, веÑоÑÑно ÑÑÐ¾Ð¸Ñ Ð¾Ð¿ÑеделиÑÑ Ñакой индекÑ:
CREATE INDEX idxgintags ON api USING GIN ((jdoc -> 'tags'));
ТепеÑÑ Ð¿Ñедложение WHERE jdoc -> 'tags' ? 'qui' бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ ÐºÐ°Ðº пÑименение индекÑиÑÑемого опеÑаÑоÑа ? к индекÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ jdoc -> 'tags'. (ÐодÑобнее об индекÑаÑ
вÑÑажений можно ÑзнаÑÑ Ð² Разделе 11.7.)
ÐÑÑ Ð¾Ð´Ð¸Ð½ Ð¿Ð¾Ð´Ñ Ð¾Ð´ к иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿ÑовеÑок на ÑÑÑеÑÑвование:
-- ÐайÑи докÑменÑÑ, в коÑоÑÑÑ
клÑÑ "tags" ÑодеÑÐ¶Ð¸Ñ ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива "qui"
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @> '{"tags": ["qui"]}'; ÐÑÐ¾Ñ Ð·Ð°Ð¿ÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´ÐµÐ¹ÑÑвоваÑÑ Ð¿ÑоÑÑой GIN-Ð¸Ð½Ð´ÐµÐºÑ Ð¿Ð¾ ÑÑолбÑÑ jdoc. Ðо замеÑÑÑе, ÑÑо Ñакой Ð¸Ð½Ð´ÐµÐºÑ Ð±ÑÐ´ÐµÑ Ñ
ÑаниÑÑ ÐºÐ¾Ð¿Ð¸Ð¸ вÑеÑ
клÑÑей и знаÑений в поле jdoc, Ñогда как Ð¸Ð½Ð´ÐµÐºÑ Ð²ÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð· пÑедÑдÑÑего пÑимеÑа Ñ
ÑÐ°Ð½Ð¸Ñ ÑолÑко даннÑе внÑÑÑи обÑекÑа Ñ ÐºÐ»ÑÑом tags. ХоÑÑ Ð¿Ð¾Ð´Ñ
од Ñ Ð¿ÑоÑÑÑм индекÑом гоÑаздо более гибкий (Ñак как он поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ð¿Ð¾ лÑÐ±Ð¾Ð¼Ñ ÐºÐ»ÑÑÑ), индекÑÑ ÐºÐ¾Ð½ÐºÑеÑнÑÑ
вÑÑажений ÑкоÑее вÑего бÑдÑÑ Ð¼ÐµÐ½ÑÑе и бÑÑÑÑее, Ñем пÑоÑÑÑе индекÑÑ.
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов jsonb_path_ops поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко запÑоÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑом @>, но заÑо он знаÑиÑелÑно пÑоизводиÑелÑнее клаÑÑа по ÑмолÑÐ°Ð½Ð¸Ñ jsonb_ops. ÐÐ½Ð´ÐµÐºÑ jsonb_path_ops обÑÑно гоÑаздо менÑÑе индекÑа jsonb_ops Ð´Ð»Ñ ÑеÑ
же даннÑÑ
и более ÑоÑен пÑи поиÑке, оÑобенно еÑли запÑоÑÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº клÑÑам, ÑаÑÑо вÑÑÑеÑаÑÑимÑÑ Ð² даннÑÑ
. Таким обÑазом, Ñ Ð½Ð¸Ð¼ опеÑаÑии поиÑка вÑполнÑÑÑÑÑ Ð³Ð¾Ñаздо лÑÑÑе, Ñем Ñ ÐºÐ»Ð°ÑÑом опеÑаÑоÑов по ÑмолÑаниÑ.
ТеÑ
ниÑеÑкое ÑазлиÑие Ð¼ÐµÐ¶Ð´Ñ GIN-индекÑами jsonb_ops и jsonb_path_ops ÑоÑÑÐ¾Ð¸Ñ Ð² Ñом, ÑÑо Ð´Ð»Ñ Ð¿ÐµÑвÑÑ
ÑоздаÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸ÑимÑе ÑлеменÑÑ Ð¸Ð½Ð´ÐµÐºÑа Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клÑÑа/знаÑÐµÐ½Ð¸Ñ Ð² даннÑÑ
, Ñогда как Ð´Ð»Ñ Ð²ÑоÑÑÑ
ÑоздаÑÑÑÑ ÑлеменÑÑ ÑолÑко Ð´Ð»Ñ Ð·Ð½Ð°Ñений. [6] Ðо ÑÑÑи, каждÑй ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð½Ð´ÐµÐºÑа jsonb_path_ops пÑедÑÑавлÑÐµÑ Ñобой Ñ
ÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¸ клÑÑа(ей), пÑиводÑÑего к немÑ; напÑимеÑ, пÑи индекÑаÑии {"foo": {"bar": "baz"}} бÑÐ´ÐµÑ Ñоздан один ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¸Ð½Ð´ÐµÐºÑа Ñ Ñ
еÑем, ÑаÑÑÑиÑаннÑм по вÑем ÑÑÑм знаÑениÑм: foo, bar и baz. Таким обÑазом, пÑовеÑка на вÑ
ождение ÑÑой ÑÑÑÑкÑÑÑÑ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ ÐºÑайне ÑоÑнÑй поиÑк по индекÑÑ, но опÑеделиÑÑ, ÑвлÑеÑÑÑ Ð»Ð¸ foo клÑÑом, Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ñакого индекÑа нелÑзÑ. С дÑÑгой ÑÑоÑонÑ, Ð¸Ð½Ð´ÐµÐºÑ jsonb_ops ÑоздаÑÑ ÑÑи оÑделÑнÑÑ
ÑлеменÑа индекÑа, пÑедÑÑавлÑÑÑиÑ
foo, bar и baz по оÑделÑноÑÑи; Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿ÑовеÑки на вÑ
ождение бÑдÑÑ Ð¿ÑовеÑÐµÐ½Ñ ÑÑÑоки ÑаблиÑÑ, ÑодеÑжаÑие вÑе ÑÑи ÑÑи знаÑениÑ. ХоÑÑ GIN-индекÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ Ð²ÑÑиÑлиÑÑ AND доволÑно ÑÑÑекÑивно, Ñакой поиÑк вÑÑ Ð¶Ðµ бÑÐ´ÐµÑ Ð¼ÐµÐ½ÐµÐµ ÑоÑнÑм и более медленнÑм, Ñем ÑавнознаÑнÑй поиÑк Ñ jsonb_path_ops, оÑобенно еÑли лÑбое одно из ÑÑиÑ
ÑÑÑÑ
знаÑений ÑодеÑжиÑÑÑ Ð² болÑÑом колиÑеÑÑве ÑÑÑок.
ÐедоÑÑаÑок клаÑÑа jsonb_path_ops заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо он не ÑÑиÑÑÐ²Ð°ÐµÑ Ð² индекÑе ÑÑÑÑкÑÑÑÑ JSON, не ÑодеÑжаÑие никакиÑ
знаÑений {"a": {}}. ÐÐ»Ñ Ð¿Ð¾Ð¸Ñка по докÑменÑам, ÑодеÑжаÑиÑ
Ñакие ÑÑÑÑкÑÑÑÑ, поÑÑебÑеÑÑÑ Ð²ÑполниÑÑ Ð¿Ð¾Ð»Ð½Ð¾Ðµ ÑканиÑование индекÑа, ÑÑо доволÑно долго, поÑÑÐ¾Ð¼Ñ jsonb_path_ops не оÑÐµÐ½Ñ Ð¿Ð¾Ð´Ñ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð¿Ñиложений, ÑаÑÑо вÑполнÑÑÑиÑ
Ñакие запÑоÑÑ.
Тип jsonb Ñакже поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¸Ð½Ð´ÐµÐºÑÑ btree и hash. Ðни полезнÑ, ÑолÑко еÑли ÑÑебÑеÑÑÑ Ð¿ÑовеÑÑÑÑ ÑавенÑÑво JSON-докÑменÑов в Ñелом. ÐоÑÑдок ÑоÑÑиÑовки btree Ð´Ð»Ñ Ñипа jsonb Ñедко Ð¸Ð¼ÐµÐµÑ Ð±Ð¾Ð»ÑÑое знаÑение, но Ð´Ð»Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑ Ð¾Ð½ пÑиводиÑÑÑ Ð½Ð¸Ð¶Ðµ:
ÐбÑекÑ>ÐаÑÑив>ÐогиÑеÑкое знаÑение>ЧиÑло>СÑÑока>NullÐбÑÐµÐºÑ Ñ n паÑами>ÐбÑÐµÐºÑ Ñ n - 1 паÑамиÐаÑÑив Ñ n ÑлеменÑами>ÐаÑÑив Ñ n - 1 ÑлеменÑами
ÐбÑекÑÑ Ñ ÑавнÑм колиÑеÑÑвом Ð¿Ð°Ñ ÑÑавниваÑÑÑÑ Ð² Ñаком поÑÑдке:
клÑÑ-1,знаÑение-1,клÑÑ-2...
ÐамеÑÑÑе, ÑÑо клÑÑи обÑекÑов ÑÑавниваÑÑÑÑ ÑоглаÑно поÑÑÐ´ÐºÑ Ð¿Ñи Ñ Ñанении; в ÑаÑÑноÑÑи, из-за Ñого, ÑÑо коÑоÑкие клÑÑи Ñ ÑанÑÑÑÑ Ð¿ÐµÑед длиннÑми, ÑезÑлÑÑаÑÑ Ð¼Ð¾Ð³ÑÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÑколÑко не инÑÑиÑивнÑми:
{ "aa": 1, "c": 1} > {"b": 1, "d": 1}ÐаÑÑÐ¸Ð²Ñ Ñ ÑавнÑм ÑиÑлом ÑлеменÑом ÑпоÑÑдоÑиваÑÑÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñно:
ÑлеменÑ-1,ÑлеменÑ-2...
ÐÑимиÑивнÑе знаÑÐµÐ½Ð¸Ñ JSON ÑÑавниваÑÑÑÑ Ð¿Ð¾ Ñем же пÑавилам ÑÑавнениÑ, ÑÑо и нижележаÑие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ Postgres Pro. СÑÑоки ÑÑавниваÑÑÑÑ Ñ ÑÑÑÑом поÑÑдка ÑоÑÑиÑовки по ÑмолÑÐ°Ð½Ð¸Ñ Ð² ÑекÑÑей базе даннÑÑ .
[6] ÐоÑÑÐ¾Ð¼Ñ Ð¿Ð¾Ð½ÑÑие «знаÑение» вклÑÑÐ°ÐµÑ Ð¸ ÑлеменÑÑ Ð¼Ð°ÑÑивов, Ñ Ð¾ÑÑ Ð² ÑеÑминологии JSON иногда ÑлеменÑÑ Ð¼Ð°ÑÑивов ÑÑиÑаÑÑÑÑ Ð¾ÑлиÑнÑми Ð¾Ñ Ð·Ð½Ð°Ñений внÑÑÑи обÑекÑов.