質問

多くの場合、私は、構成要素または子供のメンバーから派生した属性を持つ総存在または親エンティティを扱います。例えば:

  • byte_countpacket_countTcpConnection オブジェクトは、その2つの構成要素の同じ属性から計算されます TcpStream オブジェクトは、構成要素から計算されます TcpPacket オブジェクト。

  • an Invoices オブジェクトにはを持っているかもしれません total これは基本的にその構成要素の合計です InvoiceLineItems'価格、少し貨物、割引、税のロジックが投入されています。

何百万ものパケットまたは数百万の請求書の項目(私は望みます!)を扱う場合、これらの派生属性のオンデマンド計算 - レポートやWebインターフェイスなどのプレゼンテーションロジックのビューまたはより一般的には、容認できないほど遅いことがよくあります。

パフォーマンスの懸念が、事前計算されたフィールドに派生した属性を「促進」するかどうか、あなたの手を強制する前に、どのように決めますか?

役に立ちましたか?

解決

私は個人的には、パフォーマンスのトレードオフが私の手を強制するまで非正規化することはありません(非正規化の欠点が劇的すぎるためです)が、あなたも考慮するかもしれません:

  1. 快適: :たとえば、2つの異なるクライアントアプリが同じ派生属性を計算する場合、どちらもクエリを計算するためにクエリをコーディングする必要があります。非正規化は、両方のクライアントアプリに派生属性をより簡単に提供します。
  2. 時間の経過に伴う安定性: :たとえば、導出された属性を計算するための式が変更可能な場合、非正規化により、派生値を時点でキャプチャして保存できるため、将来の計算が間違っていないことがありません。
  3. よりシンプルなクエリ: :DB構造に複雑さを追加すると、クライアントの端で選択されたクエリがより簡単になることを意味します。
  4. パフォーマンス: :非正規化データの選択クエリをより迅速にすることができます。

参照: データベースプログラマー:非正規化の引数. 。彼の記事も必ず読んでください 非正規化された値を正しく保つ - 彼の推奨は、トリガーを使用することです。それは、一種のトレードオフの非正規化が必要とすることをもたらします。

他のヒント

基本的に、あなたはしません。あなたはパフォーマンスの懸念を残しましたあなたの手を強制します。

それは最良の答えです。なぜなら、99%の時間、あなたは いいえ このように事前に最適化することは、その場でそれを計算することをお勧めします。

ただし、クライアントアプリケーション開発者が誤った先入観でサーバー側に来ることは非常に一般的です」...派生属性のオンデマンド計算... 頻繁 容認できないほど遅い「そして、これは真実ではありません。ここでの正しい言葉遣いはそうでしょう」めったに 容認できないほど遅い".

このように、あなたがこれ(DB開発アーキテクトなど)の専門家でない限り、あなたは時期尚早の最適化に従事してはいけません。それがなるまで待ちます 明らか それは修正する必要があります、 それから 事前凝集を見てください。

実際にデータをどのように実装するかを決定する必要があります。

私は2つの単純な状態を想定しています:現在の状態かどうか。

  • 現在:インデックス付きビュー、トリガー、保存されたProcsの総合テーブルなどを維持する
  • 最新ではありません:レポートサービスのスナップショット、ログ配送/複製、データウェアハウスなど

そうは言っても、私は製品にあるのと同じ量のデータに対して開発するので、応答時間にある程度の自信があります。コードのパフォーマンスに驚くことはめったにありません...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top