【发布时间】:2011-02-19 02:11:15
【问题描述】:
是否可以在数据库中插入对象? (在 PHP 面试中被问到。)
【问题讨论】:
-
这是面试官问的完整问题吗?我会以“不是一个真正的问题 - 太模糊”来结束这个问题:)
-
是的,这就是他对我的要求:(我让他提供详细信息,(我说我必须在 stackoverflow 中问这个问题,Potter(Pekka) 会询问更多详细信息)
是否可以在数据库中插入对象? (在 PHP 面试中被问到。)
【问题讨论】:
是的,可以使用serialize()。
但答案在很大程度上取决于上下文。
【讨论】:
如果您在谈论 PHP 对象,则无法将对象插入数据库。要将其存储到数据库中,您首先需要对其进行序列化并在使用时对其进行反序列化。
【讨论】:
这个问题非常模糊和不确定。我的意思是,一方面,您可以序列化一个对象并将其插入数据库。但是,“插入对象”取决于上下文。例如,他是否指的是您可以调用如下 SQL 语句:
$a = new object();
// This makes no sense.
$sql = "Insert into table_name values($a);";
如果这是他的要求,那么答案是否定的,除非您覆盖返回要插入数据库的值的 __toString() 方法,否则您不能这样做。即使这样,类也没有很好地定义,因为您说 __toString() 将是一个数据库值,但是如果不引用类对象本身,就没有明确定义或暗示。
无论如何,如果一个对象代表数据库表等,那么您希望根据职责分离每个项目。例如,您可以有一个定义数据库表的对象 A,然后有一个“管理器”对象 B,它从数据库中插入、更新、删除和选择项目。例如:
// NOT REAL PHP CODE....
class Table_Name
{
// Define primary keys, foreign keys, and attributes of the table.
private $column1;
public function setColumn1($value);
public function getCOlumn1();
}
class Table_Name_Manager
{
public function insert(Table_Name $obj);
public function delete(Table_Name $obj);
public function select(Table_Name $obj);
}
以上对我来说最有意义,因为它清楚地定义了您所期望的行为。您可以简单地使用管理器从数据库中取出项目并修改对象,然后您可以再次调用管理器并插入、更新或删除。
【讨论】:
简短回答:不,不可能
长答案:您不能直接插入 Object,您必须在存储之前对其进行序列化,例如使用内置的 serialize() 函数或一些自定义 XML 序列化程序。然后你可以把它放在一些TEXT 或BLOB 列中。
正确答案:要将对象放入数据库,请使用一些 ORM(对象关系映射)工具。大多数 MVC 框架都内置了 ORM,最常用的是 Active Record 模式。
【讨论】:
你也可以是个聪明人:
您:“您可以从内存中取出 PHP 对象并将其移植到 Java 或 .NET,然后使用 Versant 对象数据库来存储该对象。”
【讨论】:
是的,您只需要将其序列化为适当的格式。 诸如此类的开放式问题的全部意义在于找到一种方法来解决所提出的问题。
【讨论】:
【讨论】:
应该注意,将序列化对象存储到关系数据库中几乎与所有数据库规范化规则相矛盾,并且可以被认为是非常糟糕的做法。
要将对象存储在数据库中,您应该使用对象关系映射器,例如 Doctrine 或 Propel。
序列化的对象可以存储在你的文件系统中。没关系。
【讨论】: