2009-05-11 18 views
0

私は、効率の観点から、データベースを照会するときには、必要以上の列しか返さないことを理解しています。基本オブジェクト関係マッピングの質問noob

しかし、私は、クエリの結果を格納するためにオブジェクトを使用したいことを考えると、これはジレンマに私の葉:

私は、私は特定の状況で必要な列の値を取得する場合、私は部分的にしか取り込むことができますオブジェクト。これは、私の気持ちは、私のオブジェクトを、プロパティやメソッドのいくつかしか利用できない非理想的な状態にしておくということです。後で、オブジェクトを再利用したい状況が発生したが、新しい状況で異なるが重複する列が返される必要があることがわかった場合、私は選択に直面しています。

既存のSQLを再利用して、同じクエリとオブジェクトマッピングロジックを両方で再利用できるように、新しい状況で必要な追加フィールドを選択した列のリストに追加する必要がありますか?または、2番目のクエリによって返されたオブジェクトのプロパティのみを読み込む別のメソッドを作成して、わずかに異なるSQLを実行する必要がありますか?

魔法の答えがないこと、そしてその答えが本当に状況に「依存する」と強く疑うが、私は一般的なアドバイスを探していると思う。私のアプローチは、クエリされたテーブルからすべての列を返すか、必要に応じて追加の列をクエリに追加することですが、パフォーマンスが問題になるまで同じSQL(およびマッピングコード)を再利用することでした。一般に、私は、出力に列を追加するコストがパフォーマンスに顕著な影響を及ぼさず、開発時間の節約と単純化された結果は良いトレードオフです。

しかし、このような状況がパフォーマンスに影響を与える場合はどう対処しますか?あなたは、などなど、などEmployees.GetLittleMorePersonlInfoButMinusSalary Employees.GetPersonalInfo

のようなメソッドを作成してください

それとも、何とか自分のAPIの利用者は、彼が人口たい列/プロパティを指定する必要がありますAPIを作成して終了します/返され、複雑さが増し、APIの使いやすさが向上しました。

Employee情報を取得したいとします。どのくらいの数のオブジェクトが一般的に関与しますか?

1)を返し、各従業員の行の1つの従業員オブジェクトを含む 2)アン従業コレクションオブジェクトは、EmployeeQueriesとして 3)オブジェクトを、返された従業員オブジェクトは、0の従業員のコレクションを返す「GetHiredThisWeek」などの方法が含まれていそれ以上のレコード。

私はこれがすべて非常に主観的であることを認識していますが、私はあなたがあなたに最も適したものについての提案を探しています。

答えて

0

...出力に追加の列を追加するコストパフォーマンスに顕著な効果を持っていない...

右。私は "新しい状況"が何が起こるかをよく理解していませんが、どちらの方法でも、複数のクエリを実行するのではなく、すべての列を取得する方がはるかに良いアイデア(IMO)になります。必要以上に多くのカラムを取得するとパフォーマンスが低下することはほとんどありません(ただし、クエリのRAM使用量は増えますが、それは大きな問題ではなく、ハードウェアは安い)。また、かなりの開発時間を節約できます。

質問の2番目の部分については、それは本当にあなた次第です。一例として、Railsは「使いやすさの最初の、パフォーマンスの最後の」アプローチの多くを取りますが、それはあなたが望むものではないかもしれません。それはあなたのニーズにかかっています。あなたがパフォーマンスのための少しの使い勝手を犠牲にしたいなら、是非、それに行きなさい。私は...するだろう。

1

あなたのアプリケーションを正しいものにしてから、この場合はパフォーマンスが心配です。

クエリを最適化することで、クエリを使用しないようにすることができます。アプリケーション全体で使用できる最も一般化されたクエリを作成し、適切に動作していると確信している場合は、必要に応じて問題のある領域を探します。

巨大なパフォーマンスを必要とすることはまずありません。怠惰なプログラマーが最高のプログラマーだと言う人もいます。前もって複雑なことをしないで、単一のEmployeeオブジェクトを作成してください。

最適化が必要な場合は、メソッド/クラスを作成するか、ORMライブラリで作成します。これはルールの例外でなければなりません。そうする理由がある場合にのみそれをしてください。

0

「一度に行」CRUDタイプのアプリケーションでオブジェクトを使用している場合は、すべての列をオブジェクトにコピーすると余分なオーバーヘッドが少なくなり、オブジェクトは本当に再利用可能になりますテーブルへの行アクセスを必要とするプログラム

しかし、SQLが複雑な結合を行っている場合や大きな行セットを返す場合は、正確に要求したいものだけを要求します。ほとんどのDBMSシステムでは、クエリを最適化するための罠があります(インデックスのみのアクセスなど)。指定した場合にのみ使用できます。この2つのパフォーマンスペナルティはここでは得られます。正確にどの列を使用するかを選択します。

スキャン/検索プロセスは特定のユースケースに特有の傾向があるため、ほとんどの場合、再利用の問題はありません。