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

Zac*_*ach 54 postgresql foreign-keys foreign-collection

我正在尝试为我的应用程序创建一个数据库,有一件事我想找到最好的方法是创建我UsersItems表之间的一对多关系.

我知道我可以做一个第三个表,ReviewedItems和具有列是一个UserID和一个ItemID,但我想知道是否有可能使一列Users,让我们说reviewedItems,这是一个包含外键的整数数组Items是该User审查.

如果PostgreSQL可以这样做,请告诉我!如果没有,我会走下我的第三张桌子路线.

Jar*_*rym 49

可能很快就可以这样做: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
);
Run Code Online (Sandbox Code Playgroud)

但是,作者目前需要帮助来修改补丁(超出我自己的能力)所以任何读过这个知道Postgres内部人员的人都可以提供帮助.

  • 2020 年,仍然不受支持:https://www.postgresql.org/docs/13/unsupported-features-sql-standard.html (40认同)
  • 可惜,它似乎没有被包括在内:( (15认同)
  • 根据 [补丁电子邮件线程](https://www.postgresql.org/message-id/flat/CAJvoCut7zELHnBSC8HrM6p-R6q-NiBN1STKhqnK5fPE-9=Gq3g@mail.gmail.com),截至 2021 年 7 月,此“仍然需要一些大手术。” 所以我们还可以待一段时间。 (10认同)
  • @JohnO这肯定很棒,但是赞成票确实应该用于_有用的_答案,而这个答案目前没有用,因为它描述的行为仍未实现。截至目前,这个问题只有一个真正正确的答案:“你做不到”。(我也赞成这一点,但这可能并不是正确的做法。) (10认同)
  • 非常热......'CREATE TABLE FKTABLEFORARRAY(ftest1 int [],FOREIGN KEY(ftest1的每个元素)REFERENCES PKTABLEFORARRAY,ftest2 int)` (7认同)
  • @Moshe Katz 答案对我有用 (6认同)
  • 这真的很有用。 (2认同)

Pat*_*ick 47

不,这是不可能的.

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

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

  • 显然,[sql:2016](https://en.wikipedia.org/wiki/SQL:2016)_确实_支持这种行为。不幸的是,该标准不是免费提供的,但您可以在 [Microsoft 文档](https://learn.microsoft.com/en-us/openspecs/sql_standards/ms-tsqliso02/ef50d8ea-b423-4ed4- ab1e-ae7b2882eb8b) 和 [PostgreSQL 不支持的标准功能列表](https://www.postgresql.org/docs/13/unsupported-features-sql-standard.html)。 (11认同)
  • @a_horse_with_no_name 您可以发布带有此类约束示例的答案吗? (3认同)
  • 你_can_定义一个约束触发器来检查它.但我不确定它是否在所有情况下都能可靠地运行. (2认同)
  • 解决方法/重新设计:有一个单独的多对多表 (2认同)