13

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

它说:

请!请!请!不要序列化数据并将其放入数据库中。可以以这种方式使用序列化,但这缺少关系数据库的要点和数据库引擎中固有的数据类型。这样做会使数据库中的数据不可移植、难以阅读,并且会使查询复杂化。如果您希望您的应用程序可移植到其他语言,例如假设您发现您想在应用程序的某些部分使用 Java,而在其中使用 Java 是有意义的,那么序列化将成为一件令人头疼的事情。您应该始终能够查询和修改数据库中的数据,而无需使用第三方中介工具来操作要插入的数据。

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

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

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

例如,最近有人指示我自己使用序列化。

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

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

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

为了使用序列化,我得到的主要原因如下:

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

就我个人而言,我更同意 php.net 中的评论而不是最后的断言,但我想在这里发表比我更多的合格意见。

4

1 回答 1

11

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

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

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

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

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

TL;DR In most cases, using a proper schema will sooner or later benefit the whole development, speed wise and complexity wise (since I preferr reading many table descriptions instead of a huge, cryptic string). There might be some use-cases where serializing data is acceptable so giving a finite answer if this is good or bad practice is not that easy and highly dependent.

于 2012-09-26T12:30:12.560 回答