PostgreSQL:存储和索引唯一数组字段的最佳方式

PostgreSQL: Optimal way to store and index Unique Array field

我有 user table,ID 为 GUID,我想为用户创建 group table。

约束:group table 行对于一组用户应该是唯一的?

意味着如果我想创建一个新的 group 之前我需要检查这样的 group 是否已经存在,这意味着我需要检查我的 user GUID 数组是否已经存在存在于 group table.

这是一个模式近似值,其中我使用 UUID 数组和唯一约束:

CREATE TABLE user (
   id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   ...
)

CREATE TABLE group (
   ...
   users_array UUID[] UNIQUE,
   ...
)

当我创建一个新的 group 时,我检查是否有 users 的当前排序集的 group,如果没有这样的 group 我创建如果有新记录,那么我只检索现有的 group.

您认为 UUID[] UNIQUE 是搜索的最佳解决方案吗?还有哪些替代方案?

我不确定这是数据的最佳表示。但是你想要一个数组的唯一条件。问题是不同顺序的数组不一样

不幸的是,Postgres 没有“数组排序”功能。当然,这在 SQL 中使用 array_agg()unnest() 很容易做到。但是索引定义中不允许使用这些

但是用户自定义函数是。所以,开始于:

create function array_sort(anyarray) returns anyarray as $$
    select array_agg(distinct n order by n)
    from unnest() as t(n);
$$ language sql immutable;

然后你可以在唯一约束中使用它:

create unique constraint unq_groups_users on groups(array_sort(users));

你冷正常化,使另一个 table 像 user_group (你已经讨论过了)

但要使其独一无二,您可以使用函数或过程来创建新的 user_group,这不是创建新的 user_group 的最佳解决方案,但可以更好地处理这些问题创建后的信息。

这取决于您创建和操作这些数据的频率。