向 uuid 列表列添加外键约束

问题描述 投票:0回答:1

我有一个具有以下定义的表格:

CREATE TABLE apartment (
  id      uuid         NOT NULL DEFAULT fellowship.uuid_generate_v4(), 
  name    VARCHAR(100) NOT NULL, 
  address VARCHAR(100) NOT NULL, 
  owners  uuid[]
);

其中

owners
列是表
owner
中引用的UUID列表,其定义如下:

CREATE TABLE owner (
  id      uuid         NOT NULL DEFAULT fellowship.uuid_generate_v4(), 
  name    VARCHAR(100) NOT NULL, 
  email   VARCHAR(100) NOT NULL
);

如何在表

owners
的列
apartment
上定义表
owner
的外键约束?

postgresql foreign-keys
1个回答
0
投票

PostgreSQL 目前不支持对数组类型列的元素添加外键约束。通常也不推荐将其作为构建 SQL 数据结构的良好实践。

这种多对多关系的最佳实践是使用关联表。对于您的情况,您可以引入一个

apartment_owner
表来表示公寓和业主之间的关系:

CREATE TABLE apartment_owner (
    apartment REFERENCES apartment(id),
    owner REFERENCES owner(id)
)

每次您想要添加或删除所有者时,您只需从该表中添加或删除一行即可。您还可以通过简单的 JOIN 查询获得一套公寓及其所有所有者。

如果您确实想以数组形式返回所有者,您可以简单地使用数组聚合查询来实现:

select
    a.id, 
    a.name, 
    a.address,
    array_agg(ao.owner) as owners
from apartments as a
join apartment_owner as ao ON ao.apartment = a.id
group by a.id, a.name, a.address;
© www.soinside.com 2019 - 2024. All rights reserved.