2009-04-11 6 views
0

私は現在、多数の関連を持つアプリケーション(Webベースのアプリケーション)を作成しました。単純に、アカウントを置く:多くの関連がある場合にNHibernateのようなORMの使用 - パフォーマンスの問題

  • 多くのアイテム
があります

  • は、多くのユーザー
  • は同様のプロジェクトは、多くのプロジェクト

を設定

  • を持っている持っています

    私たちerは:

    • 負荷より団体と多くのタスク

  • などなどを、持っています。特に珍しいことは何もありません。 NHibernateを使用して、すべての関連付けを定義するマッパーを使って永続クラスの素敵なセットを提供することにしました。

    しかし、このアプローチは正しいですか?アプリケーションへの要求ごとに、Accountがロードされます(必要なため)。これにより、DBから大量のデータが要求されます。レイジーローディングはオプションですが、私の初期のアプローチがうまくいかないかどうかはわかりません。その段階で私が欲しいのは、アカウントとそれに関連する設定だけです。マッピングにはこれを反映する必要がありますか?問題は、アカウントのすべてのプロジェクトのようなものを他の時点でも欲しいから、すべての関連付けを反映するためにマッパーが必要です。

    私の懸念は、レイジーローディングが私の一部では初期のアーキテクチャが悪いことを補っているかもしれないということです。私はこれがちょうどNHibernateの内部の仕組みの私のまだ - まだ貧しい知識の結果かもしれないことをよく認識しています。その結果、私は良い練習の提案に感謝しています。

    答えて

    0

    ドメインドリブンデザインは、こうした状況を理解するうえで非常に役に立ちました。 Association in DDD

    本当に双方向の関連付けが必要なのか、場合によっては一方向の関連付けで十分でしょうか?その決定はアーキテクチャの一部です。だからあなたは正しい。 Lazy Loadingは、デフォルトで双方向関連を選択するときの大きな助けとなります。しかし、それは設計上の欠陥とみなすことができます。

    0

    NHibernateでは、関連データが常に必要になることがわかっている場合を除き、ほとんどの関連付けやオブジェクトの遅延読み込みをデフォルトで有効にすることが一般的には良い方法です。次に、最適化段階に来たときに効率的な項目だけを選択して、積極的な読み込みに切り替えることができます。

    0

    私の意見では、あなたのアーキテクチャは健康に見えます。団体は良いです。

    1. 少ない団体:

      は、代替案を検討貧しいDB設計

    2. につながるORMを使用しないでください:あなたは、自分がとにかく
    コーディング-kinda「遅延初期化」をやって見つけるだろう

    すべてがうまく見えますが、怠惰な初期化は良いです:) - しかし、実際の使用上の落とし穴がかなりあります:

    1. 遅延初期化を使用する前にセッションを閉じないでください(強制的にあなたの協会に無駄な読み込み文を "ハッキング"する必要があります)
    2. NHibernateでは、すべてのDALアクティビティを実行する必要がありますLEVEL2キャッシュ
    3. を有効にするために、あなたはprollyこれはオームズがどのように動作するかである

    (私はしたいが、それでだけユーザー、アカウント名を知らない何をする場合)、いくつかのオーバーヘッドがあります。彼らはプロ(開発が容易で、定型コードをたくさん避ける)とコン(よりオーバーヘッド、柔軟性が低い)を持っています。