使用PostgreSQL,我有一个表,它本身应该有多对多的关系。这个表名为tools
,我用一个名为integrations
的二级表进行多对多操作,它有两个字段tool_a_id
和tool_b_id
。
有更好的办法吗?问题是,每当我想找到所有集成时,我都需要检查tool_a
和tool_b
,如:
SELECT * FROM integrations
WHERE tool_a_id = x AND tool_b_id = x
或者当我想选择与其他工具集成的所有工具时,我必须:
SELECT "tools".* FROM tools, integrations
WHERE ((tools.id = integrations.tool_a_id AND integrations.tool_b_id = x)
OR (tools.id = integrations.tool_b_id AND integrations.tool_a_id = x))
例如,这不允许在Rails中将集成定义为一个关系,因为Rails只希望匹配一个外键。有更好的办法吗?感觉不雅。我不介意被PostgreSQL困住。
最佳答案
好吧,这就是我们从RDBMS书籍中学到的方法。;)
但是在SQL示例中,没有正确定义对象。我认为您可能需要的是类似这样的东西(使用相同的数据库模式):
SELECT t1.* FROM tools t1 JOIN integrations i ON (t1.id = i.tool_a_id)
JOIN tools t2 ON (t2.id = i.tool_b_id)
WHERE t2.id = x
这更优雅,因为它将t1标记为要从中选择的工具列表,t2标记为要从中选择一个工具的列表,我想知道哪些工具集成到其中。