为了将数据存储到数据库中,在PHP中使用序列化是一种好习惯吗?

时间:2012-09-26 11:42:43

标签: php serialization standards conventions

我在php.net中发现了一个关于序列化数据的有趣评论,以便将其保存到数据库中。

它说:

  

请!请!请!请勿序列化数据并将其放入您的数据中   数据库。序列化可以这种方式使用,但是缺少这一点   关系数据库和数据库中固有的数据类型   发动机。这样做会使数据库中的数据难以移植   阅读,并可以使查询复杂化。如果你想要你的申请   可移植到其他语言,比如说你发现你想要的   将Java用于应用程序的某些部分,使用它是有意义的   Java中,序列化将成为臀部的痛苦。你应该   始终能够在不使用的情况下查询和修改数据库中的数据   第三方中间工具,用于处理要插入的数据。

     

在我的职业生涯中,我遇到过这么多次   难以维护代码,具有可移植性问题的代码和数据   那就是更难以迁移到其他RDMS系统,新的   它还有一个额外的缺点,就是让它变得混乱   根据您所在的某个字段搜索您的数据库   序列化。

     

这并不是说serialize()没用。这不是......一个好地方   使用它可能是包含数据结果的缓存文件   例如,密集的操作。还有很多其他人......只是   不要滥用序列化,因为下一个出现的人会有一个   维护或迁移的噩梦。

我想知道这是否是将数据序列化用于数据库目的的标准视图。这意味着有时使用它是否是一种好习惯,或者是否应该避免使用它。

例如,我被指示最近使用序列化。

在这种情况下,我们必须保存到MySQL表中的数据如下:

  • 汽车品牌。
  • 汽车模型。
  • 汽车版。
  • 汽车信息。

Car info是一个表示版本所有属性的数组,因此它是一个大量可变的属性(在100个属性下)。这个数组是要序列化的数组。

我使用序列化的主要原因如下:

  

作为大量字段,最好将数据序列化   为了提高性能而不是为每个属性创建一个字段   或多个表。

就个人而言,我更赞同php.net中的评论而不是最后一个断言,但我想在这里有更多关于此的合格意见。

1 个答案:

答案 0 :(得分:10)

  

作为大量字段,最好将数据序列化   为了提高性能而不是为每个创建一个字段   财产或多个表。

我认为这高度依赖于用例。如果有一个班级Customer想要拥有关于所有正在运行柴油的汽车的信息或汽车的任何其他特定数据(使用燃料似乎最简单),该怎么办?您需要从数据库中获取所有汽车,对其进行反序列化,检查属性并将列表与所有与客户相关的汽车保留在列表中。

示例:我们必须将一些与人员相关的数据从旧客户CMS移动到新客户CMS。而不是将每个属性很好地映射到数据库上,整个信息是旧数据库中的单个字符串。因此,我们不必使用适当的数据库结构,而是需要使用大量的regex-foo来将数据再次转换为适当的结构。当然,这是一项昂贵的(包括货币和工作负载)任务。在这种情况下,问题并不是那么大,因为数据量是可管理的。但想象一下具有数百万行且不仅仅是一个字符串的相同场景......

您发布的评论仅涉及IMO的数据结构。我同意,存储这些并不是很好也不是很有效。在某处输入拼写错误或添加语言的其他部分不知道的新属性会容易得多。这迟早会引发问题。

另一方面,存储一些更容易移植的配置可能是序列化数据的好例子。您可以争辩说外部设置文件对于这种情况更为理想,但这将高度依赖于案例/哲学/客户/ ......。

TL; DR 在大多数情况下,使用适当的模式迟早会有利于整个开发,速度明智和复杂性(因为我更喜欢阅读许多表格描述而不是巨大的,神秘的字符串)。可能存在一些使用情况,其中序列化数据是可接受的,因此如果这是好的或不好的做法给出有限的答案并不那么容易和高度依赖。