5

私は知っている、この質問のバリエーションは以前に尋ねられた。しかし、私の場合は少し異なるかもしれません:-)

そこで、イベントを追跡するサイトを構築しています。各イベントにはIDと値があります。また、ID、年齢、性別、都市、国、ランクを持つユーザーによって実行されます。(重要な場合、これらの属性はすべて整数です)

2つのクエリに対する回答をすばやく取得できる必要があります。

  • 特定のプロファイルを持つユーザーからイベントの数を取得します(たとえば、ロシアのモスクワに住む18〜25歳の男性)
  • 特定のプロファイルを持つユーザーからのイベントの値の合計(おそらく平均も)を取得します-

また、データは複数の顧客によって生成され、その顧客は複数のsource_idを持つことができます。

アクセスパターン:データは主にコレクタープロセスによって書き込まれますが、クエリされた場合(まれに、Web UIによって)、迅速に応答する必要があります。

確かに複数のテーブルまたは単一のサーバーが処理できる大量のデータを期待しています。

イベントを1日あたり別々のテーブルにグループ化することを考えています(つまり、「events_20111011」)。また、テーブル名の前に顧客IDとソースIDを付けて、データを分離し、簡単に破棄(古いデータを削除)して比較的簡単に移動(他のマシンに負荷を分散)できるようにします。このように、そのようなすべてのテーブルには、たとえば1,000万のトップなどの限られた数の行があります。

したがって、問題は、ユーザーの属性をどうするかということです。

オプション1、正規化:それらを別のテーブルに保存し、イベントテーブルから参照します。

  • (プロ)データの繰り返しはありません。
  • (con)参加しますが、これは高価です(またはそう聞いたことがあります)。
  • (con)これには、ユーザーテーブルとイベントテーブルが同じサーバー上にある必要があります

オプション2、冗長:ユーザー属性をイベントテーブルに保存し、それらにインデックスを付けます。

  • (プロ)より簡単な負荷分散(自己完結型のテーブルは移動可能)
  • (プロ)より単純な(より速い?)クエリ
  • (con)ユーザー属性と対応するインデックスを繰り返すために使用される大量のディスクスペースとメモリ
4

3 に答える 3

8

デザインは正規化する必要があります。パフォーマンス上の理由から、物理スキーマが非正規化される可能性があります。

両方を行うことは可能ですか?SQLServerにAnalysisServerが付属しているのには理由があります。Microsoftの領域にいない場合でも、データ入力と日常の処理にトランザクションシステムを使用し、トランザクションシステムに大きな負荷をかける可能性のある種類のクエリにレポートシステムを使用できるようにするのが一般的な設計です。

これを行うことは、日常業務用の正規化されたシステムとロールアップクエリ用の非正規化システムの両方の長所を利用できることを意味します。

ほとんどの場合、レポートシステムでは夜間の更新で問題ありませんが、稼働時間やその他の要因によって、何が最適に機能するかによって異なります。ほとんどの8〜5の企業は、夕方にレポートシステムを更新するのに十分な時間があります。

于 2011-10-11T00:57:40.937 に答える
3

OLAP/データウェアハウスアプローチを使用します。つまり、標準の正規化された方法でデータを保存するだけでなく、頻繁にクエリされるデータの集約バージョンも個別のファクトテーブルに保存します。ユーザーのクエリはリアルタイムデータには反映されませんが、通常、パフォーマンスのトレードオフには価値があります。

また、SQL Serverエンタープライズを使用している場合は、独自の水平分割スキームを使用しません(データを数日に分割します)。これを自動的に行うためのツールがSQLServerに組み込まれています。

于 2011-10-11T00:55:48.953 に答える
1

正規化してください

パーティションとインデックスを使用して負荷のバランスをとる

于 2011-10-11T00:56:57.330 に答える