Postgresql JSONB来了,现在应该使用什么?Hstore?JSON?EAV?

22
经过关于关系型数据库/NoSQL的研究辩论后,我得出结论,将PG作为我的数据存储前进。这个决定的重要原因是JSONB即将在9.4中推出。现在,我该怎么做,从头开始构建一个应用程序,知道我想迁移到(我是说现在使用!)JSONB?对于我来说DaaS选项会在一段时间内运行9.3。
据我所知(如果我错了,请纠正),考虑到我将在hstore列中查询许多键,hstore运行速度相当快,如果我使用普通json,我将无法利用索引/GIN等功能。然而,我可以利用JSON嵌套,但运行任何查询都会非常慢,并使用户感到沮丧。
那么,我是围绕当前版本的hstore还是json数据类型构建我的应用程序,“good ol” EAV或其他东西?我应该以某种方式构造我的DB和应用程序代码吗?任何建议将不胜感激。我相信,我们等待PostgreSQL的下一个官方版本时,其他人可能会面临同样的问题。
我想构建应用程序的一些额外细节:
-非常关系(除下面的一个异常情况外) -强大的社交网络方面(组,朋友,喜欢,时间轴等) -基于单个对象,具有可变用户分配的属性,可能有10或1000个(这就是无模式设计需要发挥作用的地方)
非常感谢您的任何建议!

1
P.S. Stack需要一个新的标签=>jsonb! - Mike
2个回答

12

这取决于情况。如果您预计会有很多用户、非常高的交易量或每个查询都需要大量属性检索,我建议使用HSTORE。但是,如果您的应用程序将从小开始逐渐增长,或者具有相对较少的提取属性事务,或者仅在查询中获取少量属性,则使用JSON。即使在后一种情况下,如果您没有提取许多属性,但经常在查询的 WHERE 子句中检查一个或两个键,则可以创建一个函数索引以加速查询:

CREATE INDEX idx_foo_somekey ON foo((bar ->> 'somekey'));

现在,当你使用WHERE bar ->> somekey时,它应该使用索引。

当然,如果您使用嵌套数据并且在将来可以升级到jsonb,则会更容易。

因此,我倾向于使用JSON,除非您确定在升级到9.4之前会有大量键获取的重度使用。但为了确保这一点,我建议现在进行一些基准测试,并查看哪种方法最适合您。


3
您可能没有给出足够的信息以提供非常详细的答案,但我会说这个... 如果您的数据是“非常关联的”,那么我认为最好的方法是使用良好的关系设计来构建它。如果它只是一个带有“变量分配属性”的字段,那么这听起来像是使用hstore的好选择。这在目前已经被证明是相当可靠的。我已经阅读了一些关于9.4和jsonb的内容,听起来很酷,但是那需要一段时间才能发布。我猜测,在9.3中进行良好的模式设计并针对性地使用hstore,可能会产生性能和灵活性的良好组合。

感谢您的反馈,David。我现在倾向于使用hstore,即使hstore 2.0将被推出并停用。在普通的json列中进行一致的查询似乎不值得。 - Mike
我相信其他人可能有不同的看法,但我认为你是正确的。除非你有一个非常具有说服力的使用情况,hstore将不起作用,否则我仍然会坚持使用它(至少目前是这样)。 - David S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接