我正在使用包含来自不同传感器的读数的系统,其中一些传感器可能包含比单个读数更多的键。由于它们都是传感器读数,我正在寻找一个用于存储这些读数的表格,其中包含用于主要读数的字段,但仍需要存储任何额外信息。
对于这些额外的信息,我正在考虑两种解决方案中的一种,但是我想知道是否有人做过类似的事情,并且知道两者之间的性能差异。
选项1
将额外数据存储在传感器读数记录本身的JSONB列中。我已经读到Postgres 9.4中添加的JSONB实现性能很好,但是我不知道这对我的用例有多快(不确定我记录的记录数量)只是为了处理而难以衡量。)
选项2
创建辅助"元数据"表有效的键值存储。一列代表键,另一列代表值。这将允许我使用正确的索引,Postgres将能够生成更准确的查询计划。
有谁知道哪一项可能表现更好?我可能会进行更多的记录插入而不是读取,当我进行读取时,它可能同时出现在许多记录中,而不仅仅是可以影响此决策的单个记录。
我认为选择选项2 可能是更好的选择,因为它不是非结构化数据,并且能够将其编入索引将是有益的,但如果有人可以确认/拒绝这将是伟大的。
答案 0 :(得分:0)
我使用过两者,这取决于你想要查询数据的方式。一般来说PostgreSQL在连接方面做得很好。
我没有去选项2,而是完全规范化,即定义一个表SensorReading,包括键,值,传感器表的引用和时间戳。时间戳和sensor_id的索引。这就是我如何做到的,效果很好。
我已经将选项1用于非常大的表格,例如博客文章中的标签。在这种情况下,您可以定义JSONB字段或数组。它不会表现不好,你可以在这些字段上定义一个GIN数组(btree会很无用)。所以这两个选项都可以编入索引。
所以我会开始完全规范化,然后在将来需要时进行非规范化。当然不是你提出的选项2。