PostgreSQL 元素数组,每个元素都是外键

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

我正在尝试为我的应用程序创建一个数据库,我想找到最好的方法之一就是在我的

Users
Items
表之间创建一对多关系。

我知道我可以创建第三个表,

ReviewedItems
,并让列成为
User
id 和
Item
id,但我想知道是否可以在
Users
中创建一列,假设
reviewedItems
,它是一个包含外键的整数数组
Items
User
已审核。

如果 PostgreSQL 可以做到这一点,请告诉我!如果没有,我就走我的第三张桌子路线。

postgresql foreign-keys foreign-collection
2个回答
180
投票

请注意,此答案描述了尚未实现的功能(2024 年 12 月)。

可能很快就能做到这一点:https://commitfest.postgresql.org/17/1252/ - Mark Rofail 在这个补丁上做了一些出色的工作!

补丁将(一旦完成)允许

CREATE TABLE PKTABLEFORARRAY (
    ptest1 float8 PRIMARY KEY,
    ptest2 text
);
CREATE TABLE FKTABLEFORARRAY (
    ftest1 int[],
    FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY,
    ftest2 int
);

但是,作者目前需要帮助来重新调整补丁的基础(超出了我自己的能力),因此任何阅读本文并了解 Postgres 内部结构的人请尽可能提供帮助。


164
投票

不,这是不可能的。

PostgreSQL 是一个关系型 DBMS,在正确规范化的数据模型上运行效率最高。数组不是关系数据结构——根据定义它们是集合——虽然 SQL 标准支持在数组元素上定义外键,但 PostgreSQL 目前不支持。有一项(休眠?自 2021 年 2 月以来 commitfest 上没有任何活动)努力来实现这一点 - 请参阅同一问题的此答案 - 因此有一天可能会支持该功能。

但是,目前您可以构建一个完美的数据库,其中的数组元素链接到其他表中的主键。然而,这些数组元素不能声明为外键,因此 DBMS 将无法维护引用完整性。使用一组适当的触发器(在引用表和引用表上,因为其中任何一个的更改都必须触发对另一个的检查和可能的更新)原则上能够在数组元素上实现引用完整性,但性能会受到影响不太可能是一流的(例如,因为不会使用索引)。

© www.soinside.com 2019 - 2024. All rights reserved.