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

时间:2018-04-02 11:49:21

标签: postgresql database-design relational-database

在我们的应用程序中,我们有用户和产品。用户可以拥有一张个人资料照片,而产品可以拥有0张或最多10张照片

目前表格是:

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

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

1 个答案:

答案 0 :(得分:1)

嗯,有两种方法可以做到这一点取决于您的应用程序的规模,并取决于您想要采取多远。关于将图像存储为BLOBS有各种各样的争论,但它是更好的选择(IMO)来存储图像的参考(例如' https://example.com/myimage.jpg'),然后你可以利用CDN和代理缓存之类的东西。至于数据库设计,最简单的两个选项是:

<强> 一个对多 您为每个&#39;类型存储一个表格。图像,将图像与您与之相关的实体的ID相关联。 E.g

- 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')

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

如果您不需要每个用户使用多张图片,只需在用户表格中存储带有图片网址的文字字段。

多态一对多 沿着这条路线下行将允许您将图像参考存储在一个表中,并且对于每个参考,您只需存储&#39;类型&#39;它的形象是 - 例如。

-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的产品的图像引用。这是多态的一对多每个实体可以有多个图像引用。这样做的好处是它可以使图像处理更加容易,因为所有图像参考都在一个地方。