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


83

我试图创建一个DB我的应用程序,并有一两件事我想找到做的是创造我之间的一个一对多关系的最佳途径UsersItems表。

我知道我可以创建第三个表,ReviewedItems并且将列作为Userid和Itemid,但是我想知道是否可以在中创建列Users,比如说reviewedItems,这是一个包含Items该键的外键的整数数组该User审查。

如果PostgreSQL可以做到这一点,请告诉我!如果没有,我就沿着第三张桌子走下去。


3
已经有补丁程序将此功能添加到Postgres,请参见blog.2ndquadrant.com/…(2012年)和postgresql.org/message-id/…(2017年)。他们尚未被接受,但希望有一天。
西蒙·基萨内

Answers:


68

不,这是不可能的。

PostgreSQL是一个关系型DBMS,在正确规范化的数据模型上最有效地运行。数组-根据定义,它们是有序集合-不是关系数据结构,因此SQL标准不支持在数组元素上定义外键,PostgreSQL也不支持。

但是,您可以使用链接到其他表中的主键的数组元素构建完美的数据库。但是,不能将那些数组元素声明为外键,因此DBMS将无法保持引用完整性。


3
可以定义一个约束触发器来进行检查。但是我不确定它是否在所有情况下都能可靠运行。
a_horse_with_no_name

@a_horse_with_no_name:您能举个例子reliably in all cases吗?您是说有时候触发会失败吗?谢谢。
栾·休恩

1
@LuanHuynh:我不记得(技术上的)详细信息,但是上次在邮件列表上讨论此问题时,有人提到相应的约束触发器可能无法捕获所有情况-但可能不再正确
a_horse_with_no_name

谢谢,我想我会为他们做一个关系表
Zach

1
@a_horse_with_no_name您可以发布带有此类约束示例的答案吗?
OrangeDog

65

可能很快可能会这样做: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内部知识的人,请尽力帮助。


8
确实非常热...CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )
维克多

1
该补丁正在等待作者跟进。在此功能可用之前,您将不得不使用触发器来检查完整性,这可能会很慢。
yoonghm '18

34
丢脸的,似乎还没有包括在内:(
Teocali '19

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.