Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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?

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

Ну, да, и нет & # 8211; Ваши соединения с БД будут удваиваться только при условии, что у вас есть и не-PDO, и PDO-соединение.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top