Pull to refresh

Comments 12

NoSQL (посредством HStore, JSON и JSONB)

Чорт. Перестаньте называть тип данных json NoSQL!
Это вполне себе «реляционный» тип. Он индексируется, он участвует в SQL-запросах.
но значение в JSON-поле — это ведь уже документ! %) вот отсюда и «логика» ;) а то, что по части этого документа можно построить индекс или сделать выборку — это уже приятные плюшки постгреса.
Это не документ, вы не в монге же. Это просто составной тип. Такой же, как, к примеру, массив int[]
Документация по postgres. Там нет слова документ.
Это сложный тип. Объект, если вам угодно (да-да, объектно-реляционная БД). Но это не документ.
Перестаньте тащить ваши дурные подходы из монги в почтенную реляционную базу.
8.14.2. Designing JSON documents effectively

https://www.postgresql.org/docs/9.5/static/datatype-json.html

концентрация метана превышена, милейший!
UFO just landed and posted this here
Вы можете привести практичный пример использования в индексе/запросе непосредственно типа json/jsonb? Вы же в курсе, что в результате создания такого индекса планировщик ничего не будет знать о структуре документа и использовать его для поиска по свойствам вашего json вы не сможете?

Другое дело — когда мы создаем функциональные индексы. Скажем, по doc->'item'->>'property'. Но под капотом — это всего лишь тип text полученный в результате выполнения функций json_object_field_text(json_object_field(…

Может я чего-то не понимаю, но где здесь SQL? Смогу я в ANSI найти описание диалекта a->b->>c? А XPath найду, если буду создавать индексы по xpath('/item/@property')? Имхо, это чистой воды NoSQL в интерпретации «Not Only SQL».
Маленькое замечание. В postgresql для json и jsonb нет синтаксиса, который бы позволил обновить только одно поле (поправьте меня если ошибаюсь). Документ нужно перезаписывать целиком. Поэтому, для исключения состояния гонки, приходится навешивать критические секции на код обновляющий json и jsonb. Для hstore же подобный синтаксис имеется.
function jsonb_set(target jsonb, path text[], new_value jsonb[, create_missing boolean])
единственный пока доступный вариант
В 9.5 теперь можно и так делать: select '{«a»: «b»}'::jsonb || '{«a»: «c»}'::jsonb
Жаль на проде еще не 9.5 в моей конторе.
Два года назад рассказывал в Токио про hstore и jsonb, может кому пригодится — http://www.sai.msu.su/~megera/postgres/talks/semi-structured-postgresql-japan.pdf
Sign up to leave a comment.

Articles