2017-04-05 32 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”中的许多结果行。 –