带有索引的JSONB与hstore


28

在此阶段,我试图以尽可能少的假设(关于Web应用程序实际如何演变)来决定数据库设计。

第一步,了解JOINS昂贵,因此我考虑使用少量的整体表,而不是大量的规范化较小表。第二点,我对使用hstore与常规表与JSONB(具有GiST索引)之间感到困惑。

AFAIK(请随时纠正):

  1. 通常,在Postgres中,已知hstore的性能要优于其他数据类型。FOSDEM PGDAY的演示文稿有一些有趣的统计数据(在幻灯片的下半部分)。 https://wiki.postgresql.org/images/b/b4/Pg-as-nosql-pgday-fosdem-2013.pdf

  2. hstore的一个优点是快速索引(GiN或GiST)。但是,使用JSONB,GiN和GiST索引也可以应用于JSON数据。

  3. 来自第二象限专家的博客说:“这时可能值得在所有新应用程序中用jsonb替换hstore使用”(滚动到最后):http ://blog.2ndquadrant.com/postgresql-anti-patterns-unnecessary -jsonhstore-dynamic-columns /

因此,我想决定以下几点:

  1. 对于数据的主要(结构化)部分:它应该放在几个关系表中(相对较大,有很多列),还是应该是使用hstore的许多键值存储?
  2. 对于临时(用户提供的/非结构化的)数据,应该将其存储在JSON中还是将其存储在hstore中(存储在主要关系表之一中)?

7
加入并不昂贵。谁对你说的?由于关系数据库的整个概念基本上都围绕联接(从实际角度出发),因此这些产品非常擅长联接。正常的思维方式是从正确规范化的结构开始,然后在性能真正需要阅读方面进入奇特的规范化和类似的工作。 JSON(B)hstore(和EAV)适用于结构未知的数据。
dezso

6
@Yogesch这些链接包含一些有趣且矛盾重重的内容:)从道德上讲,MySQL似乎在联接方面很(很),并且NoSQL人们倾向于在没有任何实际事实依据的情况下对此概念进行概括。另一方面,亚伦(Aaron)和麦克斯(Max)对那个p字很敏感-它的广泛用法表明非母语人士(包括我自己)如何快乐地使用错误的字。
dezso

4
@Yogesch实际上,我敢肯定,互联网上有一个来源可以“证明”一切,就像任何宗教文字都可以用来为暴行辩护一样(在整个历史过程中都可以看到)。的确,您所做的工作越少,成本就越少,但是总会有一些折衷
Erik

4
@Yogesch:对于需要大量了解数据访问模式的大量读取操作,避免联接非常重要,因此可以安全地将所需的所有数据放入一行。但是,这会使其他联接的成本更高。谁说您不需要以许多不同的方式合并数据来回答各种问题?现在,我们将简单地涉及到关系数据建模的理论……
克里斯

5
@Yogesch在我的实践中,数据库的瓶颈很少是RAM或CPU,而是I / O-这样避免存储冗余数据的方法仍然很重要。正如克里斯所说,如果您始终只能以一种方式查看数据,那么这可能是值得的。如果没有,那您​​将拥有庞大且高度灵活的数据块。
dezso

Answers:


41

关系数据库是围绕联接设计的,并进行了优化以使其良好。

除非有充分的理由使用规范化设计,否则请使用规范化设计。

jsonb事情就是这样hstore的,因为当你好的不能用标准化的数据模型,比如当数据模型迅速改变,并且是用户定义的。

如果可以建立关系模型,则可以建立关系模型。如果不能,请考虑使用json等。如果要在json / jsonb / hstore之间进行选择,则通常选择jsonb,除非您有理由不这样做。

这就是我在博客文章中所说,该文章仅涉及此主题。请阅读全文。您引用的段落指出,如果您选择动态结构,则应该选择jsonb而不是hstore,但是博客文章的其余部分是关于为什么通常应该尽可能地进行关系建模的原因。

所以。相关地建模主要结构部分。如果表确实很宽,有很多列,则可能表明需要进一步规范化。不要害怕加入。学会爱加入。连接许多小表通常比查询和维护大的非规范化表快。仅当需要针对特定​​情况进行非规范化时,最好通过实例化视图进行非规范化……但是直到您知道自己需要解决实际的实际问题才可以进行非规范化。

对于自由格式和非结构化的用户贡献数据,请使用jsonb。它的性能应该与hstore一样好,但是它更加灵活且易于使用。

一个相关的事情就明白了:像那些依据和GIN索引上jsonb使用一般比一个普通的B树索引效率较低。它们更灵活,但是普通列上的b树索引几乎总是快得多。


非常感谢Craig,现在我有了更好的理解,知道该怎么做。一个后续问题:如果我储存像喜欢追随者在两种格式(POST_ID和user_ID的,对于喜欢),是它更好地使用关系表有两列,或hstore?(我不介意将这个问题变成一个新问题)
Yogesch 2015年

5
@Yogesch听起来像是沼泽标准的m:n连接表,格式一致且稳定。问题应该始终是:“是否有充分的理由我不应该针对这种特殊情况采用通常的关系方式?”。
Craig Ringer 2015年

hstore不推荐使用。使用jsonb
危险89年

2
@ danger89实际上,它没有被正式弃用,尽管我认为不再有任何理由使用它来支持jsonb了。在任何情况下……这都是要点。问题在于是否要进行关系建模还是使用结构化数据类型。
克雷格·林格
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.