PHP:序列化与否

时间:2012-04-13 15:20:45

标签: php json serialization normalization

我有一个包含产品的产品表。每个产品可以有多个图像。图像的urls / id将存储在我的数据库中。现在,不是在我的product表中创建image_url1image_url2等列,而是将包含我的products表中的图像列表的序列化数据存储在一个名为{的列中。 {1}}。

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

我确定这两种方法都有效,但我想采用最佳做法。

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

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

4 个答案:

答案 0 :(得分:2)

很多人会告诉你,如果你在一个字段中存储一个事物列表,它就会破坏关系数据库引擎(或其他任何东西)。

但是,如果您从未需要按该字段进行搜索(在您的情况下,如果您从不需要获取图像网址并找到拥有该图像的产品),或该字段从不受限制(对于例如,如果不需要确保相同的图像不被使用两次),那么您没有理由不将数据转储到单个字段中。

答案 1 :(得分:2)

最佳做法不是银子弹,它们总是最适合特定情况,无论是广泛还是狭窄。

如果您要做的就是遍历图像列表,我看不到它的危害。但是,如果您要编辑或搜索特定图像,我就不会这样做。为什么不将图像放在带有外键的不同表中,而不是你的其他选择(命名的图像字段)。

或者,如果您确实需要将所有这些内容填充到一个字段中,则可以查看db的XML功能。我已经完成了一些在xml文档中编码大量字段并将其作为字段存储在db中,然后使用XPath进行搜索的东西。您依赖于db供应商实现的XPath函数级别,但在我的情况下,它非常高效,并允许我们在同一个表中存储不同类型的同一类对象。

答案 2 :(得分:1)

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

如果您需要使用其他语言访问数据库,该怎么办?它能够反序列化PHP序列化对象吗? (无)

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

删除图片示例

单独的表格:

delete from product_images where product_image_id = 4

序列化数据:

  • 从数据库中获取序列化数据。
  • 反序列化为数组或对象。
  • 遍历数据以找到您需要的数据。
  • 将其从列表中删除。
  • 序列化修改后的列表并将其保存回数据库。

答案 3 :(得分:0)

在images表中创建一个列'product_id'。