Мой вопрос заключается в том, как абстрагировать соединение с базой данных от уровня модели приложения? Основная задача заключается в том, чтобы иметь возможность легко переходить с разных типов баз данных. Возможно, вы начнете с простого файла, базы данных, разделенной запятыми. Затем вы хотите перейти к базе данных SQL. Затем вы решите, что реализация LDAP будет лучше. Как человек может легко планировать что-то подобное?
Для простого примера, скажем, у вас есть пользователь с именем, фамилией и адресом электронной почты. Очень простой PHP-класс, представляющий его, может выглядеть следующим образом (пожалуйста, не обращайте внимания на проблемы с общедоступными переменными экземпляра):
<?php
class User {
public $first;
public $last;
public $email;
}
?>
Я часто видел, где люди имеют класс DAO, в который встроен SQL как таковой:
<?php
class UserDAO {
public $id;
public $fist;
public $last;
public $email;
public function create( &$db ) {
$sql = "INSERT INTO user VALUES( '$first', '$last', '$email' )";
$db->query( $sql );
}
}
?>
Моя проблема с такими стратегиями заключается в том, что когда вы хотите изменить свою базу данных, вы должны изменить каждый класс DAO: функции создания, обновления, загрузки, удаления, чтобы иметь дело с вашим новым типом базы данных. Даже если у вас есть программа для их автоматической генерации (которой я особенно не фанат), вам придется отредактировать эту программу, чтобы она теперь работала.
Что вы предлагаете, как с этим справиться?
Моя текущая идея - создать суперкласс для объектов DAO с собственными функциями создания, удаления, обновления и загрузки. Однако эти функции будут брать массивы атрибутов DAO и генерировать сам запрос. Таким образом, единственный SQL находится в классе SuperDAO, а не разбросан по нескольким классам. Тогда, если вы захотите изменить слой вашей базы данных, вам нужно будет только изменить способ, которым класс SuperDAO генерирует запросы. Преимущества? Недостатки? Предвидимые проблемы? Хорошо, плохо и безобразно?