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 的最佳解决方案,但可以更好地处理这些问题创建后的信息。
这取决于您创建和操作这些数据的频率。
我有 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 的最佳解决方案,但可以更好地处理这些问题创建后的信息。
这取决于您创建和操作这些数据的频率。