Как добавить ORM в устаревший проект PHP? - PullRequest
2 голосов
/ 06 марта 2009

Мы работаем над проектом PHP, который разрабатывался более 2 лет, и теперь команда готова и чувствует желание переключить разработку на ORM. Потому что это действительно ускоряет разработку и позволяет вам работать с объектами, а не думать с точки зрения кода SQL и таблиц базы данных большую часть времени.

Мы решили выбрать Doctrine ORM, потому что он имеет загрузку данных YAML - он нам очень нужен для наших юнит-тестов.

Основной страх, который у меня есть, заключается в том, что использование новой платформы ORM может замедлить работу сайта. Мы не можем установить общее соединение между текущим уровнем абстракции базы данных (который использует синтаксис pg_connect, а не PDO -совместимый). Механизм подключения к базе данных не может быть переключен на PDO-совместимый, потому что есть много кода SQL, несовместимого с синтаксисом PDO_SQLITE.

Итак, насколько я понимаю, если мы начнем использовать его, он удвоит количество соединений с базой данных. Я не уверен, что сервер базы данных сможет справиться с этим.

Что бы вы порекомендовали нам сделать в этих обстоятельствах?

Ответы [ 3 ]

1 голос
/ 06 марта 2009

Очевидное, что вы можете сделать, это не открывать соединение с базой данных, пока оно вам не понадобится. Я лично использую код, подобный этому:

public function connect() {
  if (!defined('CONNECT')) {
    mysql_connect(...);
  }
}

public function db_query($query) {
  connect();
  $ret = mysql_query($query);
  if (!$ret) {
    die(mysql_error());
    error_log(mysql_error() . ' - ' . $query);
  }
  return $ret;
}

, чтобы уменьшить количество повторяющихся операций и открывать соединение только тогда, когда оно необходимо.

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

Осторожно, ORM ни в коем случае не является панацеей. Вы можете ненавидеть SQL и находить его сложным и подверженным ошибкам, но вы, по большей части, просто меняете один набор проблем на другой. Лично я считаю, что, хотя ORM может быть полезным, оно было чрезмерно преувеличено и является скорее ложной экономикой, чем многие либо осознают, либо готовы признать. Я написал больше об этом в Используя ORM или простой SQL?

Я не говорю, что вы не должны этого делать. Только не думайте, что это решит все ваши проблемы. Кроме того, так как это переписывание фактически не изменит функциональность (из того, что вы описали), я не уверен, что затраты на это выгодно отличаются от исправления того, что уже есть. Слишком много неизвестных, чтобы сказать, куда пойдет ваша ситуация.

1 голос
/ 06 марта 2009

Какое отношение имеет PDO_SQLITE?

Если вы на самом деле не планируете использовать драйвер SQLite, то совместимость не требуется PDO.

Если вы не собираетесь использовать SQLite, тогда я сделаю совместимым устаревший PDO уровня базы данных и повторно использую соединения, пока вы не сможете полностью перейти на Doctrine.

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

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

0 голосов
/ 06 марта 2009

Что ж, да и нет - ваши соединения с БД будут удваиваться, только если у вас есть и не-PDO, и PDO-соединение.

Я не уверен, что вы имеете в виду под ссылкой PDO_SQLITE, поскольку SQLite - это совершенно другая база данных, чем PostgreSQL, которую вы, похоже, используете сейчас.

Вы должны иметь возможность выполнять текущие запросы с помощью PDO :: query так же, как вы делаете это сегодня, если вы не делаете что-то очень неправильное:)

...