Arrays 连接表与外键数组?

Arrays 连接表与外键数组?,arrays,postgresql,many-to-many,junction-table,Arrays,Postgresql,Many To Many,Junction Table,我正在建模多对多关系,其中关系大部分时间仅从一侧访问。它更像是一个层次结构,是自上而下访问的,而不是相反的方式 调查有并属于许多问题有并属于许多答案 这两种关系必须是多对多的,因为同一个问题可以在不同的调查中重复使用,并且在许多问题中可以重复使用相同的答案。这是一项要求 标准M2M实施将使用两个连接表,调查\问题和问题\答案。相反,我正在考虑使用PostgreSQL的整数数组来存储调查中的问题ID,以及问题中的答案ID 我们可以利用ANY操作符查询与外键数组匹配的所有行 我们如何使用SQL查询所

我正在建模多对多关系,其中关系大部分时间仅从一侧访问。它更像是一个层次结构,是自上而下访问的,而不是相反的方式

调查有并属于许多问题有并属于许多答案

这两种关系必须是多对多的,因为同一个问题可以在不同的调查中重复使用,并且在许多问题中可以重复使用相同的答案。这是一项要求

标准M2M实施将使用两个连接表,
调查\问题
问题\答案
。相反,我正在考虑使用PostgreSQL的整数数组来存储调查中的
问题ID
,以及问题中的
答案ID

我们可以利用ANY操作符查询与外键数组匹配的所有行

我们如何使用SQL查询所有调查及其问题和问题答案

如何匹配外键数组返回的行的顺序?也就是说,使用question_id=[1,2,3]可以保证返回顺序为1,2,3的问题行

与连接表相比,它在性能方面的表现如何(假设索引正确,不管它们是什么)

你能推荐这个吗?有没有关于像这样建模M2M的资源

更新

有人建议将数组外键的引用完整性添加到PostgreSQL 9.3中,但没有包括:


因此,关于使用外键数组维护顺序的问题,请使用连接表方法。数组方法是非标准的,你必须询问它的工作效率,而另一种方法是完全标准的。

你说的是多对多,但这听起来像是一对多;“多对多”意味着每个调查涉及几个问题,每个问题涉及几个调查,但这听起来有点奇怪,当然,你用“有很多”的措辞通常是一对多的同义词(多对多通常被称为“拥有并属于很多人”)@MacGuy:很抱歉让你感到困惑。问题可以在调查中重复使用,答案可以在多对多关系中重复使用。我将用HABTM替换has-many-relationship。不过,连接表可能比阵列慢得多。请参见“是”,有时可以从数组方法中获得性能增益。当然,这是否适用于所有情况存在一个大问题,其中一个主要问题是添加/删除新链接需要修改潜在的长行(示例中为优惠券),而不是插入/删除单行,并锁定优惠券表。同意!如果不想在每次插入时修改优惠券表,可以使用优惠券产品数组表(优惠券id,产品id[])。但这可能会变得愚蠢。@JoeVanDyk加入的速度很慢,最好是查询查询。在我的测试中,数组和查询查询之间没有性能差异,都是0.075毫秒。不过,数组的计划时间更快,分别为0.211毫秒和0.769毫秒。维护数组听起来像是大容量表的锁定噩梦。