2009-05-01 16 views
3

私はASP.netとSQLデータベースを使用しています。私はシステムのようなブログを持っていますが、そこでは投稿に対するいくつかのコメントがあり、それらのコメントの数を投稿の横に表示したいのです。その番号を取得するには、投稿の記録にコメントを追加するか、コメントを追加または削除するときにsubtrackを追加するか、ユーザーがページにアクセスするたびにSQLを使用してクエリの数を計算することができます。後者は、SQLデータベースにヒットするのが悪い考えですが、レコードに対して数値を保持するとエラーが発生しやすいように感じます。この場合、コーディングのベストプラクティスはどう思いますか?コメント数/投稿数を計算する

答えて

3

常に正規化されたデータベースから開始してください(2番目のオプション)。パフォーマンス上の理由から絶対的な必要がある場合にのみ、非正規化してください。非正規化された方法(これは推測どおりエラーが起こりやすい)で設計するのは時期尚早の最適化です。適切なインデックスを使用すると、その数をオンザフライで計算しても問題ありません。

+1

私はこの回答がJesse Brownの答えと似ています:非正規化は "あなたが既に持っているデータの重複"となります。 – Travis

2

私はSQL文がうまくいくはずだと思います。もう一つはあなたがすでに持っているデータの複製です。カウントクエリはすばやく行う必要があります。

2

時期尚早に最適化しないでください。単純なソリューションとページフォールトは、必要なときにのみ最適化で使用します。

1

情報を必要とするたびにデータベースを照会します。パフォーマンスが不足している(後で最適化する)ことがわかったら、後で再訪します。ほとんどのブログタイプのアプリケーションでは、十分なトラフィックが得られるはずです。

0

あなたのデータモデルの見た目にもよりますが、メインスレッドレコードに合計ポストカウントを追加しないでください。エラーが発生する可能性がありますので、スレッドID IMHO

0

ページをキャッシュし、そのキャッシュをコメントとして追加/削除することは、データベースに対するクエリーの数が心配な場合は、SQLカウントのクエリで長いオプションとなるでしょう。

1

おそらくメインスレッドのクエリの一部としてカウントバックし、実際のDBのヒット数をWebサーバーから制限します。しかし、私はいつも実際のカウントを照会し、それをフィールドに入れないようにします。データは現実には同期してしまいます。

0

私は通常、このような種類のインデックス付きビューを使用します。これにより、迅速な検索のためにデータを非正規化することができますが、同期が外れる方法はありません。フォークは混乱することもなく、ビューがデータのマスターであると考えます。私はSS2K5の標準スキューをほとんど使用していますので、実際にビュー上でインデックスを使用するためには(noexpand)ヒントを指定する必要があります(エンタープライズは自動的にそれを行います)。だから、標準的なskuのために、私は常にラップトップビューを作成して、ヒントが常に存在することを知っているので、誰もがヒットします。

ので、うまくいけば、構文エラー、Webページ上でこれをコーディングしない;)

create view postCount__ 
as 
select 
    threadId 
    ,postCount=count_big(*) 
from thread 
group by threadId 
go 
create unique clustered index postCount__xpk_threadid on postCount__(threadId) 
go 
create view postCount 
as 
select 
    threadId 
    ,postCount=cast(postCount as int) 
from postCount__ with (noexpand) 
go 

だから私は誰もがそれを直接照会していない知っているように、実際のインデックス付きビュー上の命名法を使用しています。代わりに、noexpandヒントを強制する関連するラッパー・ビューを探します。インデックス付きビューを使用するとcount_bigが強制的に実行されるので、32ビット整数を使用して私たちのasp.netコードを遅延させないように、ラッパービューでintにキャストダウンすることがよくあります。キャストを省略する方が良いでしょうが、私にとって大きな影響はありませんでした。

EDIT - 私は、フォーラムソフトウェアは常にポストカウントをスレッドテーブルに非正規化すると伝えます。あなたがアクティブなフォーラムを持っているなら、それはすべてのページビューでのポストカウントを継続的に数えるためにDBを殺します。私はmssqlがインデックス付きのビューを持っているので、あなた自身ではなく、宣言的に非正規化を定義することができます。

1

パフォーマンスを向上させるには、項目にコメントがあるかどうかを示すフラグをメインテーブルに保持して、コメントをカウントして取得するために追加のクエリを実行するかどうかを「ヒント」としてのみ使用します後の時間。

回転する写真を50枚返すフォトギャラリーを想像してみてください。写真ごとに独自のコメントを付けることができます。

最初のページの読み込みでは、写真のリストと写真にコメントがあるかどうかを示すフラグが返されます。

写真が表示されているときに、コメントフラグがTrueに設定されていると、アプリはその写真のコメントをカウントして取得するようにajaxリクエストを行います。

50枚の写真のうち3枚しかコメントしていない場合、追加で47件のリクエストが保存されました。

これはデータを非正規化しますが、限られたレベルです。 ヒントを作成すると、非常にビジーなサイトのパフォーマンスが向上します。

関連する問題