2015-09-30 28 views
3

使用PostgreSQL,我有一個表格,它應該與自己有多對多的關係。該表被稱爲tools,我正在做多對多的次表,名爲integrations,它有兩個字段,tool_a_idtool_b_idPostgreSQL中多對多的關係

有沒有更好的方法?這裏的問題是,每當我想找到所有集成,我需要檢查這兩個tool_atool_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困住。

+0

@ClodoaldoNeto你是什麼意思? – Pablo

+0

我的意思是這個問題很糟糕。一點代碼呢? –

+0

@ClodoaldoNeto我真的不知道你想要什麼代碼,我在問一個數據庫設計問題。如果您認爲這很有用,我添加了幾個查詢,但我的問題是概念性的。 – Pablo

回答

1

那麼,這是我們從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作爲我將從中選擇一個工具的列表,我想知道哪些是整合到它的工具。

+0

謝謝你的回答馬丁。每次我都不用手發送查詢。我正在使用一個ORM,所以我不確定它會像你那樣對一個表進行別名有什麼影響。我試圖只在必要時反對ORM,因爲做更多將會使它變得不合時宜。 – Pablo

+0

這裏的別名只是爲了縮短SQL,你可以忽略它們。主要思想是使用工具表兩次,一次用於選定的工具,另一次用於所參考的工具。 –