PostgreSQL 9.2: arrays, hstore, JSON — в чем разница?

222 views
Skip to first unread message

targence

unread,
Aug 5, 2012, 11:24:51 PM8/5/12
to ror...@googlegroups.com
В сентябре обещают стабильный релиз PostgreSQL 9.2 с поддержкой JSON (пока только бета 2) и я начал интересоваться, что к чему.

Я завис на том, что в PostgreSQL теперь получается 3 оч. похожих типа данных: 


И на самом деле не всегда очевидно, что и в каком случае стоит использовать.

Нашел оч. полезную презентацию - http://ritconf.ru/2012/abstracts/264.html где вроде объясняется разница, но все равно не понятно.

Ну с arrays - допустим вопросов меньше всего - это простые массивы.
hstore - как я понимаю - это JSON, но без вложенности, т.е всего один уровень. Есть хорошие примеры тут - https://postgres.heroku.com/blog/past/2012/3/14/introducing_keyvalue_data_storage_in_heroku_postgres/ и тут - https://github.com/heroku/hstore_example


  create_table :products do |t|
    t.string :name
    t.hstore :data
    t.timestamps
  end

    Product.create(:name => "Geek Love: A Novel", :data => {'author' => 'Katherine Dunn', 'pages' => 368, 'category' => 'fiction'})
    Product.last.data['category']  # => 'fiction'

OK, получается в hstore можно засунуть только плоский JSON, без вложенности. Тогда для чего нужен новый тип JSON?
Вот тут - http://lwn.net/Articles/497069/ - приводятся примеры новых функций типа row_to_json() and array_to_json(), котрые выдают результат обращения к таблице в в JSON формате.

OK, а как хранить многоуровненые JSON объекты и делать к ним запросы? Про это нигде не нашел.


=

Вопросы

Проясните разницу между hstore и JSON, как писать в базу многоуровневые JSON объекты?
Кто ждет появление JSON в PostgreSQL? Как будете использовать?

Max Lapshin

unread,
Aug 6, 2012, 12:42:22 AM8/6/12
to ror...@googlegroups.com
Я могу сразу сказать: поддержка arrays в рельсах практически отсутствует.
Пользоваться ими ужасно неудобно. Причем сразу отмечу, что хваленый
datamapper ещё хуже.

Поэтому с точки зрения рельс этими типами пользоваться неудобно, как ни верти.

Sergey Kojin

unread,
Aug 6, 2012, 4:17:49 AM8/6/12
to RubyOnRails to russian
поддержка hstore в 4х рельсах из коробки будет

Max Lapshin

unread,
Aug 6, 2012, 4:21:41 AM8/6/12
to ror...@googlegroups.com
2012/8/6 Sergey Kojin <sergey...@gmail.com>:

> поддержка hstore в 4х рельсах из коробки будет
>

Может это и неплохо. Когда я во вторых рельсах пытался использовать
postgres types, то столкнулся с тем, что воткнуть
собственный десериализатор данных, пришедших из базы, очень и очень сложно.

Sergey Kojin

unread,
Aug 6, 2012, 5:41:32 AM8/6/12
to RubyOnRails to russian
ну сейчас и сериализатор легко втыкается, я недавно использовал для
двоичных данных сериализатор через Marchal всесто стандартного

On 6 авг, 12:21, Max Lapshin <max.laps...@gmail.com> wrote:
> 2012/8/6 Sergey Kojin <sergey.ko...@gmail.com>:

Max Lapshin

unread,
Aug 6, 2012, 5:46:47 AM8/6/12
to ror...@googlegroups.com
Это было бы удобно для всяких штук типа мускльного типа "1,2,3,4,5"
для которого есть удобные функции или JSON-сериализации в базу.

Хорошо, что это появилось.

koulikoff

unread,
Aug 6, 2012, 5:45:29 PM8/6/12
to ror...@googlegroups.com
Я как-то особых трудностей не обнаружил. Мне потребовалось формироать массив в запросе с group by. Потом просто в контроллере я пришу .gsub(/[{}]/, '').split(',').map(&:to_i)

С А

unread,
Aug 7, 2012, 1:00:47 AM8/7/12
to ror...@googlegroups.com
Можно последить за этим гемом:
https://github.com/dockyard/postgres_ext -- там что-то уже есть и он
вроде собирается развиваться дальше.

7 августа 2012 г., 4:45 пользователь koulikoff <koul...@gmail.com> написал:

> --
> --
> Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы
> "RubyOnRails to russian" на группах Google.
> FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
>
> Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
> ror...@googlegroups.com
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу:
> ror2ru-un...@googlegroups.com
> Дополнительные варианты находятся на странице группы
> http://groups.google.com/group/ror2ru?hl=ru

oleg dashevskii

unread,
Aug 7, 2012, 1:06:07 AM8/7/12
to ror...@googlegroups.com
Для массивов есть еще activerecord-postgres-array

7 августа 2012 г., 12:00 пользователь С А <eleq...@gmail.com> написал:



--
Олег.
Reply all
Reply to author
Forward
0 new messages