我有一个具有以下定义的表格:
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 目前不支持对数组类型列的元素添加外键约束。通常也不推荐将其作为构建 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;