JSON 与元数据 table 的性能对比

Performance of JSON vs metadata table

我正在开发一个包含来自不同传感器的读数的系统,其中一些传感器可能包含比单个读数更多的键。由于它们都是传感器读数,我希望有一个 table 来容纳这些读数,并为主要读数提供一个字段,但仍需要存储任何额外信息。

对于这些额外的信息,我正在考虑两种解决方案中的一种,但是我想知道是否有人做过类似的事情并且了解两者之间的性能差异。

选项 1

将额外数据存储在传感器读数记录本身的 JSONB 列中。我读过在 Postgres 9.4 中添加的 JSONB 实现是高性能的,这很棒,但我不知道这对于我的用例来说有多快(不确定我将要处理的记录数量)但很难衡量。)

选项 2

创建一个辅助 "metadata" table 有效的键值存储。一列代表键,另一列代表值。这将允许我使用适当的索引,并且 Postgres 将能够生成更准确的查询计划。

有谁知道其中哪一个可能表现更好?我可能会插入比读取更多的记录,并且当我读取时,很可能会同时读取许多记录,而不仅仅是一条会影响此决定的记录。

我认为使用 选项 2 可能是更好的选择,因为它不是真正的非结构化数据,并且能够对其进行索引将是有益的,但如果有人可以 confirm/reject 这个就太好了。

这两个我都用过,就看你想怎么查询数据了。通常 PostgreSQL 在连接方面做得很好。

我不会选择选项 2,而是完全标准化,即定义一个 table SensorReading,其中包含键、值、对传感器的引用 table 和时间戳。时间戳和 sensor_id 上的索引。我就是这样做的,效果很好。

我已将选项 1 用于非常大的 table,例如博客文章中的标签。在这种情况下,您可以定义一个 JSONB 字段或一个数组。这不是真的它会表现不好,你可以在这些字段上定义一个 GIN 数组(btree 是非常无用的)。所以这两个选项都可以被索引。

所以我会开始完全规范化,然后在将来需要时去规范化。肯定不是您建议的选项 2。