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

rfc*_*484 12 php standards serialization conventions

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

它说如下:

请!请!请!请勿序列化数据并将其放入数据库.Serialize可以这种方式使用,但是缺少关系数据库和数据库引擎中固有的数据类型.这样做会使数据库中的数据不可移植,难以阅读,并且会使查询复杂化.如果你希望你的应用程序可以移植到其他语言,比如说你发现你想在你的应用程序的某些部分使用Java,那么使用Java是有意义的,序列化将成为臀部的痛苦.您应始终能够查询和修改数据库中的数据,而无需使用第三方中间工具来操作要插入的数据.

我在职业生涯中遇到过这么多次,这使得难以维护代码,代码存在可移植性问题,而且数据更难以迁移到其他RDMS系统,新模式等.它还有另外的缺点根据您已序列化的某个字段搜索数据库使其变得混乱.

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

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

例如,我被指示最近自己使用序列化.

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

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

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

我为了使用序列化而给出的主要原因如下:

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

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

DrC*_*sos 10

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

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

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

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

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

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