2016-12-09 70 views
6

我正在尝试为我的应用程序创建一个数据库,并且我希望找到最佳做法的一个方法是在我的Users和之间创建一对多关系Items表。PostgreSQL数组元素,每个元素都是外键

我知道我可以做一个第三个表,ReviewedItems,并有列是User ID和Item ID,但我想知道是否有可能使一个列在Users,让我们说reviewedItems,这是一个整数数组,包含User已查看的Items的外键。

如果PostgreSQL可以做到这一点,请让我知道!如果没有,我会沿着我的第三条路线走下去。

+0

这是一个糟糕的设计,阅读关于关系建模。这也是一个常见问题,请谷歌您的标题。 – philipxy

+1

已经有补丁将此功能添加到Postgres,请参阅https://blog.2ndquadrant.com/postgresql-9-3-development-array-element-foreign-keys/(2012)和https://www.postgresql .org/message-id/CAJvoCuuEgQ%2Bpjv02rjvQN4o9s4_H3HJMdZdQwss2b0c0-xagEw%40mail.gmail.com(2017)。他们还没有被接受,但希望有一天。 –

回答

7

不,这是不可能的。

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

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

+1

你可以定义一个约束触发器来检查。但我不确定它是否可以在所有情况下可靠地工作。 –

+0

@a_horse_with_no_name:你能举出一个关于'可靠地在所有情况下'的例子吗?你的意思是有时触发可能会失败?谢谢。 –

+1

@LuanHuynh:我不记得(技术)细节,但最后一次在邮件列表上讨论过,有人提到相应的约束触发器可能无法捕获所有情况 - 但这可能不再是真的 –