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

if *_*one 10 postgresql ruby-on-rails hstore ruby-on-rails-4

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

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

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

eval("{ "foo" => "bar" }")
Run Code Online (Sandbox Code Playgroud)

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

小智 6

您应该尝试使用Postgresql的JSON扩展.它将完全符合您的要求:验证并存储JSON.最初在9.2中添加了JSON扩展.Postgres 9.3为JSON扩展添加了更多功能,包括新的运算符和函数.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


Tom*_*Tom 6

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


Che*_*ang 5

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

所以简单来说,你不能简单地使用 Hstore 将 MongoDb 替换为 PostgreSQL。相反,您需要为每种类型的对象创建表,就像在任何其他关系数据库中一样。如果您的对象的架构非常动态,那么最好继续使用 MongoDB。