我可以使用Rails在hstore中存储数组
我想保存这样的数据:
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
hstore
用于简单的键/值存储,其中键和值都是简单的非结构化字符串。 从精细手册 :
F.16。 hstore
此模块实现
store
数据类型,用于在单个PostgreSQL值中存储键/值对集合。 […]键和值只是文本字符串。
注意最后一句: hstore
中的键和值是字符串。 这意味着你不能将一个数组放在一个hstore
值中,如果没有一些手持操作来将数组转换为字符串和从字符串转换数组,你真的不想hstore
那种东西。
但是,有一种JSON数据类型可用:
8.14。 JSON类型
json
数据类型可用于存储JSON(JavaScript Object Notation)数据,如RFC 4627中所述。
和JSON可以轻松处理嵌入式数组和对象。 请尝试使用JSON:
add_column :users, :properties, :json
您必须首先删除旧的hstore
列。
另外,你不希望在你的hstore
列上使用array: true
,因为你没有存储一个hstore
数组,你只需要其中一个。
加上穆的答案。 Hstore也在几个月内提供了非常有前景的更新(Postgresql 9.4将于2014年第3季度推出)。
应对这些限制的未来变化的一些亮点 :
- 支持标量和类型(数字,布尔,字符串,NULL)支持,以及新的相应运算符
- 支持嵌套和数组(作者建议使用GUC变量配置输出格式,即括号v。花括号)
- 基本上,hstore和JSON之间完全兼容,因此JSON文档现在可以充分利用hstore的索引(尤其是GIN,作者为JSON搜索性能提高了120倍的速度)
现在很难在hstore和json之间选择一个。 因为它们太过相似而且更新太快了。
我对穆的回答是2美分。 我发布这个作为答案因为我没有足够的声誉来添加评论。
JSON正在成为存储“复杂”数据的首选解决方案。
Oleg Bartunov– hstore的作者之一 – 他自己说使用hstore而不是JSON没有优势,他鼓励人们使用jsonb 。
2014年3月23日,用于存储json的结构化格式jsonb在pgsql开发邮件列表中正式引入。
2014年5月15日,JSONB被列入PostgreSQL 9.4 Beta 1发布公告。
JSONB:9.4包含新的JSONB“二进制JSON”类型。 这种用于文档数据的新存储格式具有更高的性能,并带有用于操作JSON数据的索引,函数和运算符。