我有一个产品表和一个单独的表,我想存储其中包含两个字段的相关产品: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