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

cs7cruho  于 2023-01-02  发布在  PostgreSQL
关注(0)|答案(2)|浏览(237)

我正在尝试为我的应用创建一个数据库,我想找到的最佳方法之一是在UsersItems表之间创建一个一对多关系。
我知道我可以创建第三个表ReviewedItems,并将列设为User id和Item id,但我想知道是否可以在Users中创建列,比如reviewedItems,它是一个整数数组,包含User已经检查过的Items的外键。
如果PostgreSQL可以做到这一点,请让我知道!如果不能,我将继续我的第三个表路线。

jq6vz3qz

jq6vz3qz1#

也许很快就可以做到这一点: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内部请帮助,如果你可以。

xoshrz7s

xoshrz7s2#

不,这不可能。
PostgreSQL是一个关系型数据库管理系统,在正确规范化的数据模型上运行效率最高。数组不是关系型数据结构--根据定义,它们是集合--尽管SQL标准支持在数组元素上定义外键,PostgreSQL当前不支持它。有一个(休眠-自2021年2月以来,committfest上没有任何活动)努力实现这一点-请参见this answer以了解同一问题-因此,该功能可能有一天会得到支持。
不过,目前您可以使用数组元素链接到其他表中的主键来构建一个非常好的数据库。但是,这些数组元素不能声明为外键,因此DBMS将不维护引用完整性。使用一组适当的触发器(在被引用表和引用表上,因为其中一个的改变将必须触发对另一个的检查和可能的更新)原则上能够实现数组元素上的引用完整性,但是性能不太可能是一流的(例如,因为不使用索引)。

相关问题