我有一個產品表和一個單獨的表,我想存儲其中包含兩個字段的相關產品:create table related_products(id1 int, id2 int)
和放置在每個字段上的索引。這意味着我不得不同時搜索id1和id2以獲取產品ID,然後拔出其他id字段,看起來很亂。 (當然,一個產品可能有許多相關產品)。在postgres中存儲和訪問相關對象
是否有更好的表結構來存儲我可以在postgresql中使用的相關產品?
我有一個產品表和一個單獨的表,我想存儲其中包含兩個字段的相關產品:create table related_products(id1 int, id2 int)
和放置在每個字段上的索引。這意味着我不得不同時搜索id1和id2以獲取產品ID,然後拔出其他id字段,看起來很亂。 (當然,一個產品可能有許多相關產品)。在postgres中存儲和訪問相關對象
是否有更好的表結構來存儲我可以在postgresql中使用的相關產品?
從數據庫的角度來看,這並不是一團糟,而是應該是這樣,只要產品對可以相關即可。
如果你想確保關係只能輸入一次,你可以使用一個唯一索引:
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);
是否存在性能差異使用顯式連接和'select * from產品p其中id在((SELECT id1 FROM related_products WHERE id2 = 1 union all select id2來自related_products,其中id1 = 1));' – user3791372
可能不是 - 我通常更喜歡加入,但這是一個品味問題。比較計劃和執行時間以作出選擇。嘗試使用a)少數結果行和b)「UNION」中的許多結果行。 –
你的意思是說該產品的記錄之間有許多關係 – Cherif
@Charif是的,沒錯! – user3791372
沒有辦法做得更好,這你必須做什麼 – Cherif