首页 > 解决方案 > 如何搜索存储在文本数组中的字符串前缀?

问题描述

我正在尝试通过以下方式对具有关联权限的用户列表进行建模:

project = {
  id: 'some-id',
  users: ['user1:owner', 'user2:viewer', 'user3:collaborator']
}

我知道这可以通过权限表和JOIN语句来解决。

我想知道这是否可以使用索引和仅一个表以高性能方式实现。我要求索引和 SQL 语句来搜索某人是否是项目的一部分,无论他们的角色如何。

CREATE TABLE IF NOT EXISTS project (
  id TEXT DEFAULT gen_random_uuid() PRIMARY KEY,
  users TEXT[] NOT NULL DEFAULT '{}'
) WITH OIDS;

谢谢

PS再一次,我知道这不是“你应该怎么做”,我只是好奇这是否可能。

标签: postgresql

解决方案


这是一个可恶的设计,但您可以尝试滥用全文搜索功能来做到这一点。

create index on project using gin (array_to_tsvector(users));
select * from project where array_to_tsvector(users) @@ 'user1\::*';

第一个:需要转义的 是匹配字符串中的文字冒号,例如,防止 'user1' 匹配 'user10'。第二个:是全文搜索语法的一部分,必须在部分匹配运算符之前*。如果 'user1' 的真实值可以包含其他特殊字符,您将不得不做一些工作来转义它们。

这太可怕了,请不要这样做。


推荐阅读