使用Rails 4(和Hstore)在PostgreSQL中存储嵌套的哈希

我有一个Rails应用程序,它汇集了来自Google API的大量数据。 我目前在MongoDB中存储JSON响应(因此我的Rails应用程序同时包含pg和mongo)。 但是,今天,我遇到了PostgreSQL Hstore扩展,我决定尝试一下。

不幸的是,我遇到了一个问题。 API提供的JSON是多层深度的,因此JSON.parse之后的Ruby Hash包含哈希,其中包含新的哈希值。 但是, Hstore是字符串键/值存储,它只有1级深度。 所以第一个哈希中的哈希就变成了字符串。

我发现真正讨厌的黑客是eval变成字符串的哈希:

 eval("{ "foo" => "bar" }") 

我不喜欢这个。 关于该怎么做的任何提示? 我应该继续使用MongoDB还是有更好的方法在PG中存储多级深度哈希值?

您应该尝试使用Postgresql的JSON扩展。 它将完全符合您的要求:validation并存储JSON。 最初在9.2中添加了JSON扩展。 Postgres 9.3为JSON扩展添加了更多function,包括新的运算符和函数。 postgres 9.4将为JSON提供高级索引支持,因此您可以通过此设置获得未来保障。

相关链接: http : //www.postgresql.org/docs/9.3/static/functions-json.html http://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.3#JSON:_Additional_functionality

嵌套Hstore是一个支持hstores中嵌套哈希(以及数组和其他类型)的gem,实现类似MongoDB之类的文档存储。 它使用hstore和JSON序列化的混合。 但是,它尚未在Rails 4上进行过测试。

正如Hstore的文档所述 ,Hstore中的键和值只是文本字符串。 Hstore不能存储多级json对象,也不能用于此目的。

因此,为简单起见,只需使用Hstore就不能用PostgreSQL替换MongoDb。 相反,您需要为每种对象创建表,就像在任何其他关系数据库中一样。 如果对象的模式非常动态,那么继续使用MongoDB会更好。

作为问题的后续内容,似乎Postgresql 9.4提供了一些很棒的好东西:

  1. Hstore现在嵌套并支持数组,这意味着从简单的键值模型转移到基于文档的丰富模型。
  2. Hstore对指定字段的访问速度很快(多亏二进制表示)
  3. Hstore运算符可以使用GiST和GIN索引
  4. Json用户可以使用functionGIN索引并获得相当大的加速
  5. Hson的二进制表示可以由json使用

资源

使用json数据类型来存储json,而不是hstore。

如果你对将多级json转换为可以存储在postgres中的对象不感兴趣,你可以将所有内容粘贴在postgres的text字段中,并在查找多级键时序列化/反序列化json字符串/值存储在mongo之外。

如上所述,Hstore没有做你想做的事。

 setting[:quizzes] # => "{:score=>true, :percent=>true, :weight=>true}" JSON.parse setting[:quizzes].gsub(/:(\w+)/){"\"#{$1}\""}.gsub('=>', ':') # => {"score"=>true, "percent"=>true, "weight"=>true}