在 SQL 中存储和读取用户和产品图像

Storing and reading user and product images in SQL

在我们的应用程序中,我们有用户和产品。一个用户可以有一张头像,产品可以有 0 张或最多 10 张图片

目前table是:

- users{id, name, birthday}
- products{id, title, description, price}

如何存储图片?为了能够增加产品最大图片数量,并高效地检索包含所有图片的产品。

好吧,有两种方法可以做到这一点,具体取决于您的应用程序的规模和您想要达到的程度。关于将图像存储为 BLOBS 有各种各样的争论,但将 REFERENCES 存储到图像(例如“https://example.com/myimage.jpg”)是一个更好的选择(IMO),因为您可以使用 CDN 和代理缓存等东西。至于数据库设计,最简单的两个选项是:

one-to-many 您为每个 'type' 图像存储一个 table,将图像与您与之关联的实体的 ID 相关联。例如

- user_images{id,user_id,url}
- product_images{id,product_id,url}

示例用法为:

INSERT INTO user_images (user_id, url) VALUES (1, 'http://url/to/my/image.jpg')
INSERT INTO product_images (product_id, url) VALUES (1, 'http://url/to/my/image.jpg')
INSERT INTO product_images (product_id, url) VALUES (1, 'http://url/to/my/image2.jpg')

这将允许您将多个产品图像全部分配给同一产品。它还允许您为每个用户存储多张图像,这可能对历史有用(如果您想存储每个用户以前的图像)。

如果您不需要每个用户使用多张图片,只需在您的用户 table 中存储一个包含图片 url 的文本字段。

多态one-to-many 沿着这条路线走下去将允许您将图像引用存储在一个 table 中,并且对于每个引用,您只需存储图像的 'type' - 例如

-images{id,type,object_id,url}

它的用法可能如下所示:

INSERT INTO images (type, object_id, url) VALUES ('user', 1, 'http://url/to/my/image.jpg')
INSERT INTO images (type, object_id, url) VALUES ('product', 1, 'http://url/to/my/image.jpg')

因此,第一个示例是为 ID 为 1 的用户存储图像,第二个示例是为 ID 为 1 的产品存储图像引用。这是一个多态 one-to-many 因为每个实体可以有多个图像引用。这样做的好处是它使图像处理更容易,因为所有图像参考都在一个地方。

此解决方案可能适合您。如果您需要修改,请在评论中告诉我。

产品table

id | name
------------
10 | Lenovo
11 | grocered
12 | Light

图片table

id | product_id | link
------------------------
101 | 10 | link 1
102 | 10 | link 2
103 | 11 | link 3
104 | 12 | link 4
104 | 12 | link 5

SQL 查询以逗号分隔获取图像

SELECT p.id,
    p.name,
    GROUP_CONCAT(i.link ORDER BY i.link ) AS images
FROM products p
LEFT JOIN images i ON p.id = i.product_id
GROUP BY p.id
LIMIT 6;