我应该如何存储在线商店的产品和产品图像数据?

时间:2009-07-18 20:36:09

标签: php mysql database-design

我正在使用MySQL开发PHP的店面应用程序。我目前将数据存储在4个表中:一个用于产品系列,一个用于产品系列中的特定产品,一个用于产品图像,另一个用于指定哪些图像链接到哪些特定产品。每个特定产品属于一个产品系列,每个产品图像可以属于几个特定产品,每个特定产品可以有多个图像。我的表看起来像这样:

ProductLines
    id, name, description, etc.
SpecificProducts
    productLineID
    id, color, size, etc.
ProductImageLinks
    specificProductID
    imageID
Images
    id, imageFileLocation, name, etc.

这种工作方式很好,但它似乎对检索起来效率不高。

例如,我有一个页面列出了每个产品系列以及该产品系列中随机选择的图像的缩略图。为此,我必须首先在数据库中查询所有产品系列的列表,然后对每个产品系列执行单独的查询以获取具有关联图像的所有特定产品,选择其中一个,然后再次查询以获取图像。

我考虑的另一种可能性是使用一个查询来获取我正在查看的所有产品系列,第二个查询获取所有这些产品系列的所有特定产品,第三个查询获取所有图像指定哪些图像链接到哪些特定产品的链接,以及获取所有这些图像的第四个查询。我想这会因为查询数量的减少而加快一些速度,但是这会让PHP在确定产品线和产品与图像之间的联系方面做很多工作,这可能会很慢。

所以我的问题是,有没有更好的方法来存储这些数据?或者根据我已有的数据库检索它的更好方法是什么?或者我认为最好的两种选择之一是我最好的选择?

编辑:我实际上并没有将图像文件存储在数据库中。图像文件存储在文件系统中。数据库中的“图像”表只存储图像文件的位置以及图像标题,替代文本等有用信息。

3 个答案:

答案 0 :(得分:2)

是的 - 只需编写一个查询,即可一次性检索所有信息。

我对此有点生疏,但您可以在mysql参考中查找查询。

  1. 创建一个在适当的键上连接这些表的查询
  2. 您需要从检索特定查询的图像的子查询中选择第一项,然后按rand()排序并选择第一项。
  3. 这绝对可以在一个查询中完成。即使它不能,您始终可以创建视图,这有时是组织查询的更好方式,以便它们更具可读性。换句话说,不是返回查询结果,只需创建与第一个查询对应的视图。然后创建一个视图,该视图对应于在第一个查询的结果上运行第二个查询,该查询在视图之外运行。等等。然后,通过从最终视图中检索,您可以一次性完成实际查询。

答案 1 :(得分:1)

就数据库设计而言,你有一个相当坚实(和标准)的设计。您可以将ProductImageLinks和Images表组合在一起,只要它是1:1关系即可保存一些查询。

对于您的产品系列图片检索,您有几个选项可以大幅减少所需的查询数量:

  1. 在数据库中创建一个名为ProductLineImages的新表。不是从相关产品中随机选取图像,而是在那里加载一组可以随机选择的图像。它不会像这样动态,但这是最有效的方法。
  2. 您可以在一个(但效率低于#1)查询中完成您所描述的所有内容。

答案 2 :(得分:0)

您是否已开始将图像存储在mysql数据库中?

在我的类似应用程序中,我只是将图像存储在/images/productimages/imagesize/productid.jpg中,其中imagesize为“小”,“大”等,用于不同的缩略图大小,而productid.jpg是来自SpecificProducts表