Amazon S3 に保存されている 1 ~ 5 個の画像を持つ製品とバリエーションを含む e コマース システムを構築しています。S3 URL を保存する別のイメージ テーブルを用意することはベスト プラクティスと考えられますか?それとも、製品とバリアント テーブルのそれぞれに 5 つのイメージ列を追加するだけで問題ありませんか? 個別の画像テーブルを持つということは、インポート時に 1 つではなく 6 つの SELECT と INSERTS (製品とその各画像がまだ存在しないことを確認してからインポートするため) を実行する必要があることを意味します。次のように、images テーブルを products テーブルに 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";
ブランド、カテゴリ、およびパートナーを正規化することの価値は、冗長性を減らすために明らかです。画像テーブルの値についてはあまり明確ではありません。Explain Analyze on Postgres によると、このクエリは 22000 行を返すのに 3310 ミリ秒かかります。ただし、私は写真のインデックスをまだ作成していないため、公正な分析ではありません。