2

我有一个包含产品的产品表。每个产品可以有多个图像。图片的 urls/id 将存储在我的数据库中。现在,不是在我的产品表中创建诸如 、 等列,而是将image_url1包含image_url2我的产品表中的图像列表的序列化数据存储在一个名为image_url.

还是创建另一个product_image关系表并将产品 ID 和图像 ID/URL 存储在那里更好?

我确信这两种方法都行得通,但我想采用最佳实践。

注意:每个产品的图像数量会有所不同。有些产品甚至可能没有图像。

编辑:为我的问题添加更具体的细节。图片 URL 不会用于搜索。它将仅用于在显示产品时检索图像的 URL。

4

4 回答 4

2

很多人会告诉您,如果您将事物列表存储在一个字段中,它会扼杀关系数据库引擎(或其他任何东西)的意义。

但是,如果您从不需要按该字段进行搜索(在您的情况下,如果您从不需要获取图像 url 并找到拥有该图像的产品),或者该字段永远不受约束(例如,如果有无需确保不使用两次相同的图像),您没有理由不将数据转储到单个字段中。

于 2012-04-13T15:23:36.090 回答
2

最佳实践不是灵丹妙药,它们总是最适合特定情况,无论是广泛的还是狭窄的。

如果您要做的只是遍历图像列表,我看不出有什么害处。但是,如果您要编辑或搜索特定图像,我不会这样做。而不是您的其他选择(命名图像字段),为什么不将图像放在不同的表中,并使用它们所属产品的外键。

或者,如果您真的需要将它们全部填充到一个字段中,您可能会查看您的数据库的 XML 功能。我已经完成了一些工作,在 xml 文档中编码大量字段并将其作为字段存储在数据库中,然后使用 XPath 搜索它。您依赖于 db 供应商实现的 XPath 函数的级别,但在我的情况下,它的性能非常好,并且允许我们将同一类对象的不同类型存储在同一个表中。

于 2012-04-13T15:28:07.233 回答
1

最佳做法是使用单独的表。将数据序列化到单个字段中会起作用,但这不是一个好主意。

如果您需要使用不同的语言访问数据库怎么办。它能够反序列化 PHP 序列化对象吗?(不)

使用序列化数据将需要更多代码。

删除图像示例

单独的表:

delete from product_images where product_image_id = 4

序列化数据:

  • 从数据库中获取序列化数据。
  • 反序列化为数组或对象。
  • 遍历数据以找到您需要的数据。
  • 从列表中删除它。
  • 序列化修改后的列表并将其保存回数据库。
于 2012-04-13T15:33:21.240 回答
0

在 images 表中创建列“product_id”。

于 2012-04-13T15:24:48.533 回答