我正在尝试为我的应用程序创建一个DB,我想找到一个最好的方法,那就是在Users
和Items
表之间创建一对多关系。
我知道我可以制作第三个表,ReviewedItems,并让列是用户ID和Item
ID,但我想知道是否可以在用户中创建一个列,比如说reviewedItems
,这是一个整数数组,包含
用户
已审查的项目
的外键。
如果PostgreSQL能做到这一点,请告诉我!如果没有,我就走我的第三桌路线。
可能很快就可以做到这一点:https://commitfest.postgresql.org/17/1252/-马克·罗菲尔在这个补丁上做了一些出色的工作!
补丁将(一旦完成)允许
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目前不支持。还有一个(Hibernate?自2021年2月以来,commitfest上没有任何活动)努力实现这一点——参见这个问题的答案——因此该功能可能有一天会得到支持。
但是,目前您可以使用数组元素链接到其他表中的主键构建一个完美的数据库。但是,这些数组元素不能声明为外键,因此 DBMS 不会维护引用完整性。使用一组适当的触发器(在引用表和引用表上,因为任何一个的更改都必须触发检查和另一个可能的更新),原则上可以在数组元素上实现引用完整性,但性能不太可能是一流的(因为不会使用索引, 例如)。