postgresql - 如何搜索存储在文本数组中的字符串前缀?
问题描述
我正在尝试通过以下方式对具有关联权限的用户列表进行建模:
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再一次,我知道这不是“你应该怎么做”,我只是好奇这是否可能。
解决方案
这是一个可恶的设计,但您可以尝试滥用全文搜索功能来做到这一点。
create index on project using gin (array_to_tsvector(users));
select * from project where array_to_tsvector(users) @@ 'user1\::*';
第一个:
需要转义的 是匹配字符串中的文字冒号,例如,防止 'user1' 匹配 'user10'。第二个:
是全文搜索语法的一部分,必须在部分匹配运算符之前*
。如果 'user1' 的真实值可以包含其他特殊字符,您将不得不做一些工作来转义它们。
这太可怕了,请不要这样做。
推荐阅读
- http - Wireshark 显示 http 只有三波不是四波数据转换
- android - 随机播放 LiveData
- > 来自 App Open 上的 Room Database
- r - 将列表列转换为字符串列
- algorithm - 是否有任何算法可以解决每个字符具有不同权重的最长公共子序列问题?
- .net-core - 如何在 .NET Core 中通过 IConfigueOptions 正确使用 Delegate 函数
- php - Google Gmail API - 如何以编程方式登录?
- wikidata - 如何使用 Wikidata 的 Web API 检索列表?
- asp.net - ASPNet Group 按类的属性列出数据
- javascript - 如何在弹出窗口中显示图像
- katalon-studio - 在katalon的自定义关键字方法中使用静态对象