2016-04-27 41 views
0

我正在研究包含来自不同传感器的读数的系统,其中一些传感器可能包含比单个读数更多的键。由于它们都是传感器读数,我正在寻找一张表来存放这些读数,并且有一个用于主要读数的字段,但是仍然需要存储任何额外的信息。JSON与元数据表的性能

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

选项1

储存在传感器读数记录本身内的JSONB列中的额外数据。我读过PostgreSQL 9.4中添加的JSONB实现是非常好的,但是我不知道这对我的用例有多快(不确定我将要处理的记录数量是多少又那么很难衡量。)

选项2

创建副“元数据”有效表键值存储。一列表示键,另一列表示值。这将允许我使用适当的索引,并且Postgres将能够生成更准确的查询计划。

有谁知道这可能会表现更好吗?我可能会做更多的插入记录而不是读取,而且当我进行读取时,很可能会同时记录很多记录,而不仅仅是可能影响此决定的单个记录。

我以为选项2可能是更好的选择,因为它不是真正的非结构化数据,并有能力索引它是有益的,但如果有人可以确认/拒绝这个会很好。

+0

在你的情况下,我总是喜欢一个键值结构,但不能确认它是基于事实的,所以把它作为你直觉的证实。 – LBA

+0

这是我的想法,虽然自从找到名称(EAV),我正在阅读大量的帖子,说这是一件可怕的事情,我应该添加多列,即使他们不使用? – PaReeOhNos

回答

0

我已经使用了两者,它取决于您想要如何查询数据。通常PostgreSQL在连接方面表现相当好。

而不是去选项2我会去完全规范化,即定义一个表SensorReading,具有键,值,对传感器表的引用和时间戳。时间戳和sensor_id上的索引。这就是我的做法,它运作良好。

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

所以我会开始完全规范化,然后在未来需要时进行非规范化。当然不是选项2,因为你建议。

+0

单个表包含与包含相同键值对的相关表不同的键和值对吗? – PaReeOhNos

+0

您提到要在主表中保留第一个键值对,并将其他键值对放在单独的表中。我试图做的一点是不这样做,而是将所有键值对保留在同一个表中。 – tdma

+0

啊正确的陷阱。 – PaReeOhNos