Могу ли я хранить массивы в hstore с Rails

Я хочу сохранить данные, как это:

User.create(name:"Guy", properties:{url:["url1","url2","url3"], street_address:"asdf"})

могу ли я сделать это в Rails 4? До сих пор я пробовал миграцию: add_column :users, :properties, :hstore, array: true

но когда я сохраняю массив в hstore, он возвращает ошибку:

PG::InvalidTextRepresentation: ERROR: array value must start with "{" or dimension information

3 ответов


hstore предназначен для простого хранения ключей / значений, где ключи и значения являются простыми неструктурированными строками. От тонкой ручной:

Ф. 16. hstore

этот модуль реализует store тип данных для хранения наборов пар ключ / значение в пределах одного значения PostgreSQL. [...] Ключи и значения-это просто текстовые строки.

обратите внимание на последнее предложение: ключи и значения в hstore несколько веревка. Это означает, что вы не можете поместить массив в hstore значение без некоторого удержания для преобразования массива в строку и из строки, и вы действительно не хотите возиться с такими вещами.

однако тип данных JSON в наличии:

8.14. В JSON типа

на json тип данных может использоваться для хранения данных JSON (JavaScript Object Notation), как указано в RFC 4627.

и JSON могут легко обрабатывать встроенные массивы и объекты. Попробуйте использовать JSON вместо:

add_column :users, :properties, :json

вам придется удалить старый первый.

кроме того, вы не хотели array: true на hstore столбец, поскольку вы не хранили массив hstores, вы просто хотели один из них.


добавить на ответ му. Hstore также дает очень перспективное Обновление через несколько месяцев (Postgresql 9.4 запустится в 3-м квартале 2014 года).

некоторые основные предстоящих изменений, которые должны решить эти ограничения:

  • поддержка скаляров и типов (числовых, логических, строк, NULL) поддержка, наряду с новыми соответствующими операторами
  • поддержка вложенности и массивов (авторы предлагают вывод формат, т. е. скобки В. фигурные скобки, быть настроены с GUC переменные)
  • по существу, полная совместимость между hstore и JSON, поэтому JSON теперь документы могут в полной мере использовать индексы hstore (с помощью GIN в частности, авторы ballparked улучшение скорости 120x для Производительность поиска JSON)

сейчас очень сложно выбрать между hstore и json. Потому что они просто становятся слишком похожими и обновляются слишком быстро.


мои 2 цента на ответ му. Я публикую это как ответ, потому что у меня недостаточно репутации, чтобы добавить комментарий.

JSON становится решением для хранения "сложных" данных.

Олег Бартунов-один из авторов hstore-сам заявил, что нет преимущества использования hstore над JSON и он поощряет людей использовать jsonb.

23 Марта 2014 JSONB, структурированный формат для хранения json, был официально представлен в списке рассылки разработки pgsql.

15 мая 2014 года JSONB был указан в Бета-Версия СУБД PostgreSQL 9.4: 1 объявление о выпуске.

JSONB: 9.4 включает новый тип JSONB "binary JSON". Этот новый формат хранения данных документа является более высокопроизводительным и поставляется с индексированием, функциями и операторами для управления данными JSON.