带索引的 JSONB 与 hstore

Yog*_*sch 32 postgresql database-design

我试图决定数据库设计,在这个阶段尽可能少的假设(关于 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 中的临时键值存储(键存储在主要关系表之一中)?

Cra*_*ger 48

关系数据库是围绕连接设计的,并经过优化以很好地完成它们。

除非您有充分的理由使用标准化设计,否则请使用标准化设计。

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

如果您可以对其进行关系建模,请对其进行关系建模。如果你不能,考虑 json 等。如果你在 json/jsonb/hstore 之间进行选择,一般选择 jsonb,除非你有理由不这样做。

这就是我在我的博客文章中所说,它只是针对这个主题。请阅读整篇文章。您引用的段落指出,如果您选择动态结构,您应该选择 jsonb 而不是 hstore,但博客文章的其余部分是关于为什么如果可以的话,您通常应该更喜欢关系建模。

所以。对主要结构部件进行相关建模。如果表格真的很宽,有很多列,这可能表明需要进一步规范化。不要害怕加入。学会爱加入。连接许多小表通常比查询和维护大的非规范化表要快。仅在您需要针对特定​​情况进行非规范化时,最好通过物化视图……但在您知道需要并有实际的具体问题需要解决之前不要这样做。

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

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

  • @Yogesch 这听起来像是沼泽标准的 m:n 连接表,具有一致且稳定的格式。问题应该始终是“我是否有充分的理由*不*在这种特殊情况下以通常的关系方式执行此操作?”。 (5认同)
  • @danger89 实际上,它并没有被正式弃用,但我认为没有任何理由再使用它来支持 jsonb。无论如何......这有点错过了重点。问题在于是建立关系模型还是使用结构化数据类型。 (3认同)