Можно ли вставить объект в базу данных? - PullRequest
11 голосов
/ 13 мая 2010

Можно ли вставить объект в базу данных? (Спросил в интервью PHP.)

Ответы [ 8 ]

17 голосов
/ 13 мая 2010

Да, это возможно, используя serialize().

Но ответ очень зависит от контекста.

11 голосов
/ 15 мая 2010

никто не предлагал OR-картографы? интересно…

если вы создаете таблицы базы данных так, чтобы они представляли объекты, вы можете использовать объектно-реляционный маппер для хранения значений членов вашего объекта в базе данных.

для php существует propel и многие другие

6 голосов
/ 13 мая 2010

Если вы говорите об объекте PHP, невозможно вставить объект в базу данных. Чтобы сохранить его в базе данных, сначала необходимо его сериализовать и отменить сериализацию во время использования.

5 голосов
/ 13 мая 2010

Этот вопрос очень расплывчатый и неопределенный. Я имею в виду, с одной стороны, вы можете сериализовать объект и вставить его в базу данных. Однако «вставка объекта» зависит от контекста. Например, он ссылается на тот факт, что вы можете вызвать 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);
}

Вышесказанное имеет для меня наибольшее значение, поскольку оно четко определяет поведение, которое вы ожидаете. Вы можете просто использовать менеджер, чтобы извлечь элементы из базы данных и изменить объект, затем вы можете снова вызвать менеджера и вставить, обновить или удалить.

3 голосов
/ 15 мая 2010

Следует отметить, что хранение сериализованных объектов в реляционных базах данных противоречит практически всем правилам нормализации баз данных и может считаться очень плохой практикой.

Для хранения объектов в базе данных вы должны использовать реляционные объекты, такие как Doctrine или Propel.

Сериализованные объекты могут храниться в вашей файловой системе. Это нормально.

3 голосов
/ 13 мая 2010

да, вы можете, вам просто нужно сериализовать его в соответствующий формат. Весь смысл открытого вопроса, подобного этому, состоит в том, чтобы найти способ сделать то, что задают.

1 голос
/ 13 мая 2010

Вы тоже можете быть мудрее:

Вы: «Вы могли бы взять объект PHP из памяти и перенести его на Java или .NET, а затем использовать базу данных объектов Versant для хранения объекта».

1 голос
/ 13 мая 2010

Краткий ответ: нет, это невозможно

Длинный ответ: Вы не можете вставить объект напрямую, его необходимо сериализовать перед сохранением, например, с помощью встроенной функции serialize() или какого-либо пользовательского сериализатора XML. Затем вы можете поместить его в столбец TEXT или BLOB.

Правильный ответ: чтобы поместить объекты в базу данных, используйте инструмент ORM (Object-Relational Mapping). Большинство сред MVC имеют встроенную ORM, чаще всего с использованием шаблона Active Record.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...