PHPのレガシープロジェクトにORMを追加する方法は?
-
03-07-2019 - |
質問
私たちはPHPプロジェクトに取り組んでいます。このプロジェクトは2年以上開発されており、チームは準備が整い、開発をORMに切り替える意欲を感じています。開発を本当にスピードアップし、ほとんどの場合、SQLコードとデータベーステーブルの観点から考えることなく、オブジェクトごとに操作できるようにするためです。
YAMLを備えているため、 Doctrine ORMを選択することにしました。データフィクスチャがロードされます-単体テストに非常に必要です。
私が抱える主な恐怖は、新しいORMフレームワークを使用すると、サイトのパフォーマンスが低下する可能性があることです。現在のデータベース抽象化レイヤー( PDO 互換)。 PDO_SQLITE構文と互換性のないSQLコードが多数あるため、データベース接続メカニズムをPDO互換に切り替えることはできません。
したがって、私が理解しているように、使用を開始すると、データベース接続の数が2倍になります。データベースサーバーがこれを処理できるかどうかはわかりません。
この状況で何をすることをお勧めしますか?
解決
PDO_SQLITEとの関連性について
実際にSQLiteドライバーの使用を計画していない限り、PDOは互換性を要求しません。
SQLiteを使用しない場合は、レガシーデータベースレイヤーのPDOとの互換性を確保し、Doctrineに完全に移行できるまで接続を再利用します。
とはいえ、ORMに移行する際のパフォーマンスの懸念は、接続のレベルだけではありません。それらは本質的に非効率的であるため、冗長なデータが必然的に選択されるため、クエリの速度が遅くなり、アプリケーションサーバーとデータベースサーバー間の帯域幅の使用量が多くなり、アプリケーションレベルでのメモリ使用量が多くなります。 現在の設定に応じて、上記の問題が発生する場合と発生しない場合があります。
おそらく最後のパラグラフは少々塩味をつけて取る必要がありますが、それらは私が経験したことのないDoctrineではなく、一般にORMの特徴にすぎないからです。
他のヒント
できることは、必要になるまでデータベース接続を開かないことです。私は個人的に次のようなコードを使用しています:
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;
}
繰り返しの量を減らし、必要なときにのみ接続を開く。
あなたの場合、最初からできる限り小さいチャンクを分割する必要があります。理想的には、垂直スライスである必要があります。つまり、このスライスはデータベースのほとんどすべてを新しいコードで処理し、古いコードではほとんど処理しません。これにより、データベース接続を最小限に2倍にすることができます。これにより、スキルを強化し、経験を積むことができます。
ただし、ORMは万能薬ではありません。 SQLを嫌い、いらいらしてエラーが発生しやすいと感じるかもしれませんが、ほとんどの場合、問題のセットを別のものと交換するだけです。私は個人的に、ORMは有用ではあるが、誇大宣伝されており、多くの人が気づいている、または認めようとするよりも誤った経済であると考えています。詳細については、 ORMまたはプレーンSQLの使用に記述しました。 >
あなたはそれをしてはいけないと言っているのではありません。それはあなたのすべての問題を解決するだろうと考えてはいけません。また、この書き換えは実際には機能をまったく変更しないため(説明した内容から)、そのためのコストが既存のものを修正することと比べて有利かどうかはわかりません。あなたの状況がどの方向に進むかを言うにはあまりにも多くの未知数。
さて、はい、いいえ–非PDO接続とPDO接続の両方がある限り、DB接続は2倍になります。
SQLiteはPostgreSQLとはまったく異なるデータベースであるため、現在使用しているように見えるため、PDO_SQLITE参照の意味がわかりません。
何か非常に悪いことをしていない限り、今日と同じようにPDO :: queryで現在のクエリを実行できるはずです: