0

OneToMany Realationship がアプリケーションのパフォーマンスを妨げるかどうか疑問に思っています。たとえば、都市とユーザー エンティティは OneToMany の関係にあります。つまり、都市には多くのユーザーを含めることができます。エンティティ クラスでリレーションシップを設定した後、都市を取得するたびに、次の方法でユーザーを取得できます。

$users = $city->getUsers();

今、私は内部アーキテクチャについて疑問に思っています。都市を取得するたびに、すべてのユーザーも照会しますか? もしそうなら、都市は 10000 人のユーザーを持つことができるとしましょう。都市のみを取得していることはパフォーマンスの問題ではありませんが、10000 人のユーザーすべてとうまくやっていますか? または、他のメカニズムを使用していて、実装しても問題ありませんか?

この状況に関するベスト プラクティスについても、専門家からの説明と提案を得たいと考えています。前もって感謝します。

4

1 に答える 1

1

私は専門家ではありませんが、アプリケーション開発で考慮できるいくつかの優れたプラクティスを共有できます。

fetch="EXTRA_LAZY"

デフォルトでは、doctrine 2.0 はコレクション全体をロードしてメモリに保存します。あなたのようなシナリオでは、users コレクションは、テーブルの次元によってパフォーマンスの問題になる可能性があります。では、関係を EXTRA_LAZY としてマークしてみませんか? このフェッチ モードのエンティティは、コレクションの完全な読み込みをトリガーせずにアクセスされた場合にのみ読み込まれます。

/**
 * @ManyToMany(targetEntity="User", mappedBy="cities", fetch="EXTRA_LAZY")
 */

このフェッチモードを許可すると、関数のようslide()count()堅牢に使用できます。例えば:

$users = $em->getRepository('models\User')->findAll();
echo  $users->count();

select count(*) from users..このコードは、代わりに $user コレクションをループするような sql ステートメントをトリガーします。

オブジェクトの水和

エンティティのコレクションをロードする必要があるとは限りません。ブログ システムを作成している場合は、投稿タイトルのリストのみを提供する必要があります。このインフラストラクチャは、読み取り専用の目的でオブジェクトをハイドレートすることによって改善できます。

便利なリンク

公式の doctrine docs ガイドに誘導するいくつかのリンク。

于 2012-08-03T14:46:42.183 に答える