2011-01-17 3 views
2

データベースレイヤーを設計する方法についていくつかの入力が必要です。私のアプリケーションでデータベース、リクエスト、パフォーマンス、キャッシュ

私はT内の情報は、複数のデータベーステーブルからの情報を持っているT.のリストを持っています。

はもちろん、これを行うために複数の方法があります。 私が考える二つの方法である:私は上記を参照の問題は、我々は500項目のリストをしたい場合は、それが潜在的に可能性があることです

List<SomeX> list = new List<SomeX>(); 
foreach(...) { 
    list.Add(new SomeX() { 
     prop1 = dataRow["someId1"], 
     prop2 = GetSomeValueFromCacheOrDb(dataRow["someId2"]) 
    }); 
} 

おしゃべりデータベース層とキャッシュ可能500データベース要求を作成します。すべてのネットワークの待ち時間とそのこと。 もう1つの問題は、データベースからリストを取得した後で、キャッシュ/ dbから取得しようとする前にユーザーが削除されている可能性があるということです。つまり、nullの問題が発生します。これは手動で処理する必要があります。 良いことは、キャッシュ可能性が高いことです。

キャッシュ可能でないおしゃべりではなく:

List<SomeX> list = new List<SomeX>(); 
foreach(...) { 
    list.Add(new SomeX() { 
     prop1 = dataRow["someId1"], 
     prop2 = dataRow["someValue"] 
    }); 
} 

潜在的にすべてのユーザーが独自のリストを持っているので、私は上記を参照の問題は、そのハードをキャッシュするようにということです。もう1つの問題は、データベースに対して多くの読み込みが発生する可能性のある多数の結合であることです。 良いことは、クエリが実行された後、我々は

非のでおしゃべり、それでもキャッシュ可能

第三の選択肢は、を介して第1のループにすることができた(内部はなど参加)すべての情報が存在することを確実に知ることです必要なsomeId2をすべて収集し、さらにもう1つのデータベース要求を行って、すべてのSomeId2値を取得します。

+1

O/RMホイールを再発明しようとしている理由はありますか?この問題は、Entity Framework、NHibernateおよび他の多くのプロジェクトによって解決されています。 – Bergius

+1

O/Rマッパーの長所と短所があります。また、ストアドプロシージャだけを使用してサイトを実行する場合は、問題/疑問が存在します。 – Patrik

+0

データがテーブル内でどのように構造化されているかについていくつか詳しく説明できますか?私はsomeId1がユーザーIDを表し、someValueはそのユーザーのプロパティ(?)を表し、それらのプロパティは異なるテーブルに格納されていると推測しています。あなたの答えに応じて、いくつかのテーブルを再設計するほうがいいかもしれません。 – NotMe

答えて

1

「私が上記で参照の問題は、我々は500項目のリストをしたい場合、それは潜在的にすべてのネットワーク遅延とそのことを。500のデータベース要求を作ることができるということです。」

真。また、不要な競合を作成し、クエリを繰り返し実行するときにロックを維持するサーバーリソースを消費する可能性があります。

"もう1つの問題は、データベースからリストを取得した後で、キャッシュ/ dbから取得しようとする前にユーザーが削除されている可能性があるということです。つまり、ヌル問題が発生します。

私はその見積もりを取る場合は、この引用:

は「良いことは、それは非常にキャッシュ可能だということです。」あなたは古いデータをキャッシュされたので

は、真実ではありません。これまでのところ唯一の利点を打ち破る。

しかし、あなたの質問に直接答えるには、あなたが求めていると思われる最も効率的な設計は、それが良いものとしてデータベースを使用し、ACIDのコンプライアンスやさまざまな制約、特にpkやfkのものを適用し、アプリケーション側の往復や無駄なサイクルを減らすために集約された回答を返すためにも役立ちます。

これは、コード思想警察による無限悪趣味であるか、またはストアドプロシージャに行くために支配されているアプリのコード、にSQLを置くのいずれかを意味します。いずれかが動作します。アプリケーションにコードを追加することで、よりメンテナンスが容易になりますが、これ以上優雅なOOPパーティに招待されることはありません。

+0

"コードをアプリに入れておくと、より保守的になります。" – NotMe

+0

"あなたは失効したデータをキャッシュしているので真実ではありません。 データベースとキャッシュの削除/更新を処理すると、データが古くならないと思います。だから私はまだキャッシュ可能だと主張する。 – Patrik

0

ヒント:

SQLは、セットベースの言語であるので、ループを反復処理のために何かを設計していません。ストアドプロシージャを使用していても、現在はカーソルを参照して、セットベースのクエリで問題を解決できます。だから、常に1つのクエリで情報を取得しようとします。今は時にはこれが不可能ですが、大半はそうなります。 1つのステートメントで必要な情報を取得するために多数のテーブルを持つスキーマを使用している場合は、ビューを設計してクエリを簡単にすることもできます。

プロキシを使用します。 50個のプロパティを持つオブジェクトがあるとします。最初に、オブジェクトのリストをユーザーに表示します。この場合、私は最も重要なプロパティのプロキシを作成し、それをユーザーに表示します。名前、IDなどの2〜3つの重要なものが表示されます。これにより、最初に送信された情報の量が削減されます。ユーザーが実際にオブジェクトを編集したり変更したりする場合は、2番目のクエリを作成して「フル」オブジェクトを取得します。必要なものだけを入手してください。これは、レイヤー間でXMLをシリアライズする際に、Web上で特に重要です。

ページング戦略を策定してください。ほとんどのシステムは、大量のデータを取得するまで正常に動作し、その後、データ行/レコードの1000秒を再利用しているため、クエリは停止します。ページは早くて頻繁に。 Webアプリケーションを実行している場合、おそらくページングされたデータだけがレイヤー間で送信されているため、データベースに直接ページングするのが最も効果的です。

データキャッシュはデータによって異なります。揮発性の高いデータ(すべての時間を変更する)では、キャッシングはそれほど価値がありません。準揮発性または非揮発性データの場合、キャッシングには価値がありますが、組み込みのフレームワークを使用している場合は、キャッシュを直接的または間接的に管理する必要があります。

キャッシュを使用するには、郵便番号表があるといいでしょう。 Certianly、それらは頻繁にそれを変更しないし、あなたのアプリケーションで郵便番号のドロップダウンがあった場合、パフォーマンスを高めるためにキャッシュすることができます。これは単なる例ですが、IMOのキャッシュはデータの種類によって異なります。

+0

"キャッシュを使用するには、郵便番号表があるといいでしょう。" 私の例のsomeId2はzipCodeIdですが、zipCodeは別のテーブルにあります。私が参加すると、毎回私はその質問をしますが、すべての郵便番号をキャッシュしてIDを取得するだけであれば、参加なしでより速くなります。 – Patrik

関連する問題