2017-04-05 36 views
1

我有一個產品表和一個單獨的表,我想存儲其中包含兩個字段的相關產品:create table related_products(id1 int, id2 int)和放置在每個字段上的索引。這意味着我不得不同時搜索id1和id2以獲取產品ID,然後拔出其他id字段,看起來很亂。 (當然,一個產品可能有許多相關產品)。在postgres中存儲和訪問相關對象

是否有更好的表結構來存儲我可以在postgresql中使用的相關產品?

+0

你的意思是說該產品的記錄之間有許多關係 – Cherif

+0

@Charif是的,沒錯! – user3791372

+0

沒有辦法做得更好,這你必須做什麼 – Cherif

回答

1

從數據庫的角度來看,這並不是一團糟,而是應該是這樣,只要產品對可以相關即可。

如果你想確保關係只能輸入一次,你可以使用一個唯一索引:

CREATE UNIQUE INDEX ON related_products(LEAST(id1, id2), GREATEST(id1, id2)); 

要搜索相關產品42個產品,你可以查詢這樣的:

SELECT products.* 
FROM products 
JOIN (SELECT id2 AS id 
     FROM related_products 
     WHERE id1 = 42 
     UNION ALL 
     SELECT id1 
     FROM related_products 
     WHERE id2 = 42 
    ) rel 
    USING (id); 
+0

是否存在性能差異使用顯式連接和'select * from產品p其中id在((SELECT id1 FROM related_products WHERE id2 = 1 union all select id2來自related_products,其中id1 = 1));' – user3791372

+0

可能不是 - 我通常更喜歡加入,但這是一個品味問題。比較計劃和執行時間以作出選擇。嘗試使用a)少數結果行和b)「UNION」中的許多結果行。 –