Arrays 自定义类型的Postgres数组-如何按自定义类型属性查询

Arrays 自定义类型的Postgres数组-如何按自定义类型属性查询,arrays,postgresql,custom-type,Arrays,Postgresql,Custom Type,我想使用Postgres数组存储每个发件人的事件。 每个事件都作为Postgres自定义类型(对象)持久化 如何按自定义类型属性查询记录?有没有可能 如果是,我可以在数组列上放置任何索引类型以加快查询速度吗 创建自定义类型: CREATE TYPE sender\u事件为( 事件时间戳时间戳(3), 消息文本 ); 使用自定义类型的数组创建表: 创建表发送器\u历史记录( 发送方varchar(30), 事件发送方\事件[] ); 在表中插入几条记录: 插入发送方\u历史值 ('sender

我想使用Postgres数组存储每个发件人的事件。 每个事件都作为Postgres自定义类型(对象)持久化

如何按自定义类型属性查询记录?有没有可能

如果是,我可以在数组列上放置任何索引类型以加快查询速度吗

创建自定义类型:

CREATE TYPE sender\u事件为(
事件时间戳时间戳(3),
消息文本
);
使用自定义类型的数组创建表:

创建表发送器\u历史记录(
发送方varchar(30),
事件发送方\事件[]
);
在表中插入几条记录:

插入发送方\u历史值
('sender1',数组[(now(),'messagetext 1')::sender_event]),
('sender2',数组[(现在(),'messagetext 2')::sender\u event])
如何查找“事件”数组包含“消息”属性等于“消息文本2”的对象的所有记录

例如,类似这样的东西(这不起作用):

从发件人历史记录中选择*
其中events.message='消息文本2'

预期结果应该是该表中的第二条记录。

如果要应用条件,则需要取消对这些数组的测试:

SELECT sh.*
FROM sender_history sh
WHERE exists (select *
              from unnest(sh.events) as x
              where x.message = 'Message text 2');

但这最好存储在一个适当规范化的一对多关系中

数组不是集合;搜索特定数组元素可能是数据库设计错误的标志。考虑为每个项目使用一个单独的表,这将是一个数组元素。这将更容易搜索,并且对于大量元素可能具有更好的扩展性


在数组中搜索某个元素时,需要先使用
unnest()
将其展开,然后再执行以下操作:


不过,我还是建议不要在这种情况下使用自定义类型。相反,正如没有名字的@a_horse_所说,你应该规范化你的表结构。

如果有一个正确的规范化数据模型,这个查询会容易得多。你的意思是像将每个事件作为一个新行保存在表中一样(传统方式)?我已经这样做了,但我想尝试阵列,因为表会更小(吸尘速度更快,所需磁盘空间更少等等)。是的,这就是我的意思。这只是一个例子。我为每个发送者设置了几个其他列,然后我必须在所有记录中重复相同的值,这是对空间的浪费,类似这样:
SELECT * 
FROM 
    sender_history, 
    unnest(events) as event
WHERE event.message = 'Message text 2'