我试图创建一个DB我的应用程序,并有一两件事我想找到做的是创造我之间的一个一对多关系的最佳途径Users
和Items
表。
我知道我可以创建第三个表,ReviewedItems
并且将列作为User
id和Item
id,但是我想知道是否可以在中创建列Users
,比如说reviewedItems
,这是一个包含Items
该键的外键的整数数组该User
审查。
如果PostgreSQL可以做到这一点,请告诉我!如果没有,我就沿着第三张桌子走下去。
我试图创建一个DB我的应用程序,并有一两件事我想找到做的是创造我之间的一个一对多关系的最佳途径Users
和Items
表。
我知道我可以创建第三个表,ReviewedItems
并且将列作为User
id和Item
id,但是我想知道是否可以在中创建列Users
,比如说reviewedItems
,这是一个包含Items
该键的外键的整数数组该User
审查。
如果PostgreSQL可以做到这一点,请告诉我!如果没有,我就沿着第三张桌子走下去。
Answers:
不,这是不可能的。
PostgreSQL是一个关系型DBMS,在正确规范化的数据模型上最有效地运行。数组-根据定义,它们是有序集合-不是关系数据结构,因此SQL标准不支持在数组元素上定义外键,PostgreSQL也不支持。
但是,您可以使用链接到其他表中的主键的数组元素构建完美的数据库。但是,不能将那些数组元素声明为外键,因此DBMS将无法保持引用完整性。
reliably in all cases
吗?您是说有时候触发会失败吗?谢谢。
可能很快可能会这样做: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内部知识的人,请尽力帮助。
CREATE TABLE FKTABLEFORARRAY ( ftest1 int[], FOREIGN KEY (EACH ELEMENT OF ftest1) REFERENCES PKTABLEFORARRAY, ftest2 int )