Postgresql hstore用于存储和搜索数字数据

Postgresql hstore用于存储和搜索数字数据,postgresql,nosql,hstore,Postgresql,Nosql,Hstore,在我的实际项目中,我沉浸在一个“大数据”问题中。我们需要存储一个大型数据库,其中读性能比写性能更重要(数据更改最小,并且受控制) 有数百万个寄存器,每个寄存器都有很多键/值信息 我正在测试noSQL数据库,在我的调查中发现了hstore。我知道非常好的postgresql,但我承认我不知道这个模块 我正在阅读有关hstore性能的文章,对此印象深刻,但我有一个疑问:它只可能将文本存储为值,因此,不可能通过数值进行搜索吗?当然,有必要为读取操作保持良好的性能。例如,“X”值大于“10”的搜索寄存器

在我的实际项目中,我沉浸在一个“大数据”问题中。我们需要存储一个大型数据库,其中读性能比写性能更重要(数据更改最小,并且受控制)

有数百万个寄存器,每个寄存器都有很多键/值信息

我正在测试noSQL数据库,在我的调查中发现了hstore。我知道非常好的postgresql,但我承认我不知道这个模块

我正在阅读有关hstore性能的文章,对此印象深刻,但我有一个疑问:它只可能将文本存储为值,因此,不可能通过数值进行搜索吗?当然,有必要为读取操作保持良好的性能。例如,“X”值大于“10”的搜索寄存器

如果不可能,还有其他选择吗


谢谢

是的,如果您将数值转换为:

select k -> 'k'
from (values
    ('k => 11'::hstore),
    ('k => 010')
) h(k)
where (k -> 'k')::integer >= 10;

是,如果您转换值,则可以搜索数字:

select k -> 'k'
from (values
    ('k => 11'::hstore),
    ('k => 010')
) h(k)
where (k -> 'k')::integer >= 10;

通过在查询中使用强制转换,您可以使用
hstore
对任何数据类型进行语义正确的搜索,但这需要付出一些代价:

  • 您不能对hstore使用通用的GiST索引。您必须在特定类型的特定hstore键上创建特定索引

  • 每次处理这些行时,都会产生强制转换所有行的开销。这对于像文本到整数转换这样的东西来说是很便宜的,但是如果您要将
    text
    转换为
    numeric
    或数组,比如。。。那会很痛的


如果您的数据几乎完全是自由格式的键/值,那么尝试将其塞入RDBMS可能并不理想。使用增强的JSON支持,PostgreSQL 9.4可能会做得更好,但现在说还为时尚早。

虽然您可以通过在查询中使用强制类型转换来使用
hstore
对任何数据类型进行语义正确的搜索,但这需要付出一些代价:

  • 您不能对hstore使用通用的GiST索引。您必须在特定类型的特定hstore键上创建特定索引

  • 每次处理这些行时,都会产生强制转换所有行的开销。这对于像文本到整数转换这样的东西来说是很便宜的,但是如果您要将
    text
    转换为
    numeric
    或数组,比如。。。那会很痛的


如果您的数据几乎完全是自由格式的键/值,那么尝试将其塞入RDBMS可能并不理想。使用增强的JSON支持,PostgreSQL 9.4可能会做得更好,但现在说有点早。

当你说每个寄存器都有很多键/值时,我认为你不应该使用hstore。您在规范化关系数据库中对数据做了哪些尝试?hstore的替代品是Redis,反之亦然。@ClodoaldoNeto每个寄存器都有500到1500个属性,不可能知道会是什么属性。此外,每个寄存器中都有不同的属性。在关系数据库中使用KVP模型,但我们正在寻找一个性能良好的解决方案。在接下来的几个月里,这个数据库将有数百万个登记册。我们也在研究Redis作为替代品。当你说每个寄存器都有很多键/值时,我认为你不应该使用hstore。您在规范化关系数据库中对数据做了哪些尝试?hstore的替代品是Redis,反之亦然。@ClodoaldoNeto每个寄存器都有500到1500个属性,不可能知道会是什么属性。此外,每个寄存器中都有不同的属性。在关系数据库中使用KVP模型,但我们正在寻找一个性能良好的解决方案。在接下来的几个月里,这个数据库将有数百万个登记册。我们也在研究Redis作为替代方案。我在postgresql 9.2中读到了关于本机JSON集成的内容,但在这个benckmark中,当您按属性搜索时,性能非常差。你知道json是否比hstore+cast好吗?@angelcervera在9.2中肯定不行。我指的是9.4中的增强json支持。其中一些已在9.3中实现,但没有IIRC您需要的路径索引支持。您还可以使用btree(((hstore_data->'idxname')::integer))对示例中的hstore值ala:
创建索引hstore_idxname_intval的整数强制转换进行索引我在postgresql 9.2中读到了关于本机JSON集成的内容,但是在这个benckmark中,当您通过属性搜索时,性能非常差。你知道json是否比hstore+cast好吗?@angelcervera在9.2中肯定不行。我指的是9.4中的增强json支持。其中一些已在9.3中实现,但没有IIRC您需要的路径索引支持。您还可以使用btree(((hstore_data->'idxname')::integer))对示例中的hstore值ala:
创建索引hstore_idxname_intval的整数强制转换进行索引
如果有任何记录
k->'k'
不包含数字(如
'k=>“abc”
),postgres将返回错误。可以使用
解决,其中(k->'k'~E'^-?\\\d+?$)和(k->'k')::integer>=10
如果有任何记录
k->'k'
不包含数字(如
'k=>“abc”
),postgres将返回错误。可以使用
进行求解,其中(k->'k'~E'^-?\\\d+?$)和(k->'k')::integer>=10