postgreSQL是否索引多值字段?

postgreSQL是否索引多值字段?,postgresql,Postgresql,例如,我将Joe的兴趣存储为化学和古典音乐作为两个单独的值,您可以查询表,如where interest in'chemistry'、'biochem',它将使用索引有效地查找Joe这样的人 PostgreSQL是否有这样一种数据类型,它可以索引多个值以允许高级查询?queriues的性能优势是什么?还有哪些重要的注意事项?如果使用数组数据类型,可以对其进行索引,也可以使用索引,请检查此主题: 更好的数据模型可能是一个更好的主意,但这取决于您。如果您使用数组数据类型,它可以被索引,并且可以使用索

例如,我将Joe的兴趣存储为化学和古典音乐作为两个单独的值,您可以查询表,如where interest in'chemistry'、'biochem',它将使用索引有效地查找Joe这样的人


PostgreSQL是否有这样一种数据类型,它可以索引多个值以允许高级查询?queriues的性能优势是什么?还有哪些重要的注意事项?

如果使用数组数据类型,可以对其进行索引,也可以使用索引,请检查此主题:


更好的数据模型可能是一个更好的主意,但这取决于您。

如果您使用数组数据类型,它可以被索引,并且可以使用索引,请检查此主题:

更好的数据模型可能是一个更好的主意,但这取决于您。

您可以使用数据类型。您将只存储键,而不存储值。一个hstore列可以被索引,并且测试是否存在密钥非常快

比如:

create table person 
(
   person_id integer not null primary key,
   name text not null,
   interests hstore
);

insert into person (person_id, name, interests)
values 
(1, 'Joe', 'chemistry => NULL, biochem => null'::hstore);
然后,要找到具有特定兴趣的人,您可以使用:

select *
from person
where interests ? 'chemistry'
   or interests ? 'biochem';
这有点像黑客攻击,因为hstore数据类型旨在存储键/值对,在这种情况下,您只需要键。

您可以使用该数据类型进行此操作。您将只存储键,而不存储值。一个hstore列可以被索引,并且测试是否存在密钥非常快

比如:

create table person 
(
   person_id integer not null primary key,
   name text not null,
   interests hstore
);

insert into person (person_id, name, interests)
values 
(1, 'Joe', 'chemistry => NULL, biochem => null'::hstore);
然后,要找到具有特定兴趣的人,您可以使用:

select *
from person
where interests ? 'chemistry'
   or interests ? 'biochem';

这有点麻烦,因为hstore数据类型旨在存储键/值对,在这种情况下,您只需要键。

为什么不规范您的设计?存储逗号分隔的值几乎从来都不是一个好主意。我知道在传统的数据库中它不好,因为它不索引多个值。但我觉得DBs必须提供这个功能。但多亏了你,我更新了这个关于警告的问题:-这个问题有误导性/措词不当。你在问它是否可以索引包含逗号分隔值的文本字段中的值。我认为警告是,这不是一个好的设计。如果您想使用RDBMS,那么我建议其他人创建一个适当的关系模式来存储数据。几十年来,人们一直致力于通过一个单独的兴趣表来创建非常高效的查询方法。PostgreSQL在这方面相当出色。否则,我建议您评估不同的存储引擎。@DondiMichaelStroma,纠正了这个糟糕的措辞为什么不规范您的设计?存储逗号分隔的值几乎从来都不是一个好主意。我知道在传统的数据库中它不好,因为它不索引多个值。但我觉得DBs必须提供这个功能。但多亏了你,我更新了这个关于警告的问题:-这个问题有误导性/措词不当。你在问它是否可以索引包含逗号分隔值的文本字段中的值。我认为警告是,这不是一个好的设计。如果您想使用RDBMS,那么我建议其他人创建一个适当的关系模式来存储数据。几十年来,人们一直致力于通过一个单独的兴趣表来创建非常高效的查询方法。PostgreSQL在这方面相当出色。“否则,我建议您评估不同的存储引擎。”DondiMichaelStroma纠正了这个糟糕的措辞