在数据库中保存大量对象是很常见的。非常简单的例子是在大型社交网络中在用户之间或用户(具有多个属性)之间保存消息的问题。话虽如此,请考虑例如在您的应用程序中您需要保留大量具有多个属性的对象。有一些方法可以做到这一点:
- 使用 PHP:serialize 保留对象的序列化版本。
- 将对象的每个属性保存在表的不同列中。
- 创建对象的 XML 版本并使用 PHP 保持与其关联的字符串:SimpleXMLElement::asXML
这些程序在性能(内存/处理)方面是否存在显着差异(优势/优势)?
非常欢迎任何帮助!
选项 2,每个属性一列,是一种远优于存储序列化或其他结构化字符串表示形式(如 XML1)的策略,原因很简单,对象表示数据,数据库设计用于以关系方式存储和检索它,同时与您的应用程序逻辑分离。
您可以查询值、组合它们、将它们与表示其他对象类型的其他表连接起来。数据库本身经过高度优化,可以执行您可能希望在应用程序中执行的查询、排序、连接等。如果您以序列化形式存储它,您将失去所有这些,并且对象的数据仍然完全绑定(bind)到您的代码,在代码中它必须被反序列化或解码才能重新构造为对象并使用,更糟糕的是,它仍然卡住在自己的数据中结构,无法轻易与应用程序中的其他对象类型相关联。
这是网络应用程序设计的基础之一。当数据需要具有持久状态时,将对象属性存储到数据库列中,其中行可以被实例化为对象,这在 Web 应用程序中几乎是一种通用模式,几乎任何您可以在任何编程语言中找到的应用程序框架都会以通常的方式实现这一点类似的方式。 Object-relational-mappers (ORM)存在以自动执行从表中的数据库存储到代码中的对象的双向转换。
如果您有兴趣探索 PHP 的 ORM,this question details some well-regarded options .此外,我建议检查一些 PHP 应用程序框架如何处理它们的模型存储和检索 - Symfony、Laravel、CakePHP 等。有些依赖于像 Doctrine 这样的 ORM,有些则使用他们自己的方法。
1 CouchDB 或 MongoDB 等专门构建的 JSON 文档存储引擎在此处的范围有所不同,它们讨论的只是直接将 PHP 序列化为 XML 列或 XML 列。何时使用专用的 NoSQL 解决方案是一个更广泛的话题,每个方面都有很多意见。