2013-02-12 76 views
0

我正在建立一个包含产品和变体的电子商务系统,每个系统都有1到5个存储在Amazon S3上的图像。在我存储S3 URL的地方使用单独的图像表是否被认为是最佳做法,或者只需向每个产品和变体表中添加5个图像列即可接受?有一个单独的图像表意味着,在进口时我需要做6个选择,然后插入(以确保产品和它的每个图像不存在,然后导入它们),而不是1.并且,在检索时,我需要加入的图像表到产品表5次把它与产品退回图像,像这样:是电子商务网站的图像表最佳实践吗?

SELECT prd."id" AS id, prd."title" AS title, prd."description" AS description, 
    prd."createdAt" AS productcreatedate, 
    prdPic1."url" AS productpic1, 
    prdPic2."url" AS productpic2, 
    prdPic3."url" AS productpic3, 
    prdPic4."url" AS productpic4, 
    prdPic5."url" AS productpic5, 
    brd."name" AS brandname, brd."id" AS brandid, 
    cat."name" AS categoryname, cat."id" AS categoryid, 
    prt."name" AS partnername, prt."id" AS partnerid 
FROM "Products" prd 
LEFT OUTER JOIN "Pictures" prdPic1 ON prdPic1."entityId" = prd."id" AND prdPic1."entity" = '1' 
AND prdPic1."sortOrder" = 1 
LEFT OUTER JOIN "Pictures" prdPic2 ON prdPic2."entityId" = prd."id" AND prdPic2."entity" = '1' 
AND prdPic2."sortOrder" = 2 
LEFT OUTER JOIN "Pictures" prdPic3 ON prdPic3."entityId" = prd."id" AND prdPic3."entity" = '1' 
AND prdPic3."sortOrder" = 3 
LEFT OUTER JOIN "Pictures" prdPic4 ON prdPic4."entityId" = prd."id" AND prdPic4."entity" = '1' 
AND prdPic4."sortOrder" = 4 
LEFT OUTER JOIN "Pictures" prdPic5 ON prdPic5."entityId" = prd."id" AND prdPic5."entity" = '1' 
AND prdPic5."sortOrder" = 5 
INNER JOIN "Brands" brd ON brd."id" = prd."BrandId" 
INNER JOIN "Categories" cat ON cat."id" = prd."CategoryId" 
INNER JOIN "Partners" prt ON prt."id" = brd."PartnerId"; 

正常化品牌,分类的价值,和合作伙伴我很清楚,以减少冗余。我不太清楚图像表的价值。解释分析Postgres说这个查询需要3310毫秒返回22000行。不过,我还没有在图片上创建索引,所以这不是一个公平的分析。

回答

0

在这种情况下,我想我会添加文本[]类型(文本数组)的单个列。通过这种方式,您可以在需要它们的地方找到图像,而且当您为产品添加更多图像时,您不一定会陷入泥end。