【问题标题】:Can I store arrays in hstore with Rails我可以使用 Rails 将数组存储在 hstore 中吗
【发布时间】:2014-04-13 22:13:41
【问题描述】:

我想这样保存数据:

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

【问题讨论】:

标签: ruby-on-rails arrays postgresql ruby-on-rails-4 hstore


【解决方案1】:

hstore 用于简单的键/值存储,其中键和值都是简单的非结构化字符串。来自fine manual

F.16。 hstore

该模块实现了store 数据类型,用于在单个 PostgreSQL 值中存储键/值对集。 [...] 键和值只是文本字符串。

注意最后一句:hstore 中的键和值都是字符串。这意味着您不能将数组放入 hstore 值中,而无需手动将数组与字符串相互转换,而且您真的不想搞砸这类事情。

但是,有一个JSON data type 可用:

8.14。 JSON 类型

json 数据类型可用于存储 JSON(JavaScript 对象表示法)数据,如 RFC 4627 中所述。

JSON 可以轻松处理嵌入的数组和对象。尝试改用 JSON:

add_column :users, :properties, :json

不过,您必须先删除旧的 hstore 列。

另外,您不希望 array: true 出现在您的 hstore 列上,因为您没有存储 hstores 的数组,您只想要其中一个。

【讨论】:

  • 解释得很好,谢谢。使用 JSON 代替 hstore 有什么缺点吗?比如性能问题?
  • 我认为在存储简单属性时不会出现任何性能问题。 JSON 将由数据库验证,但这应该不是问题。
  • 您应该知道,目前 hstore 在查询数据和索引方面提供了灵活性。
  • 注意:hstore 扩展具有从 hstore 到 json 的转换,因此转换后的 hstore 值表示为 JSON 对象,而不是字符串值。摘自 PostgresDocs
  • @SaadMasood 9.4 应该清理很多 hstore 与 json 的东西(如 Ivan Wang below 所指出的),当 hstore 和 jsonb 几乎相等时,不是吗?
【解决方案2】:

添加穆的答案。 Hstore 也在几个月内提供了非常有希望的更新(Postgresql 9.4 将于 2014 年第三季度推出)。

一些highlights 即将解决这些限制的更改:

  • 支持标量和类型(数字、布尔值、字符串、NULL) 支持,以及新的相应运营商
  • 支持嵌套和数组(作者建议输出 格式,即括号与花括号,使用 GUC 进行配置 变量)
  • 本质上,hstore和JSON完全兼容,所以JSON 文档现在可以充分利用 hstore 的索引(使用 GIN 特别是,作者将速度提高了 120 倍 JSON 搜索性能)

现在很难在 hstore 和 json 之间选择一个。因为它们变得太相似并且更新太快了。

【讨论】:

    【解决方案3】:

    我的 2 美分对穆的回答。我将其发布为答案,因为我没有足够的声誉来添加评论。

    JSON 正在成为存储“复杂”数据的首选解决方案。

    Oleg Bartunov——hstore 的作者之一——他自己表示使用 hstore 与 JSON 相比没有优势,他encourages people use jsonb

    2014年3月23日jsonb, a structured format for storing json,正式引入pgsql开发邮件列表。

    2014 年 5 月 15 日 JSONB 在PostgreSQL 9.4 Beta 1 发布公告中列出。

    JSONB:9.4 包含新的 JSONB“二进制 JSON”类型。这种用于文档数据的新存储格式具有更高的性能,并带有用于操作 JSON 数据的索引、函数和运算符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2020-03-11
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多