我正在尝试为我的应用程序创建一个数据库,我想找到最好的方法之一就是在我的
Users
和 Items
表之间创建一对多关系。
我知道我可以创建第三个表,
ReviewedItems
,并让列成为 User
id 和 Item
id,但我想知道是否可以在 Users
中创建一列,假设 reviewedItems
,它是一个包含外键的整数数组Items
User
已审核。
如果 PostgreSQL 可以做到这一点,请告诉我!如果没有,我就走我的第三张桌子路线。
请注意,此答案描述了尚未实现的功能(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 内部结构的人请尽可能提供帮助。
不,这是不可能的。
PostgreSQL 是一个关系型 DBMS,在正确规范化的数据模型上运行效率最高。数组不是关系数据结构——根据定义它们是集合——虽然 SQL 标准支持在数组元素上定义外键,但 PostgreSQL 目前不支持。有一项(休眠?自 2021 年 2 月以来 commitfest 上没有任何活动)努力来实现这一点 - 请参阅同一问题的此答案 - 因此有一天可能会支持该功能。
但是,目前您可以构建一个完美的数据库,其中的数组元素链接到其他表中的主键。然而,这些数组元素不能声明为外键,因此 DBMS 将无法维护引用完整性。使用一组适当的触发器(在引用表和引用表上,因为其中任何一个的更改都必须触发对另一个的检查和可能的更新)原则上能够在数组元素上实现引用完整性,但性能会受到影响不太可能是一流的(例如,因为不会使用索引)。