私は知っている、この質問のバリエーションは以前に尋ねられた。しかし、私の場合は少し異なるかもしれません:-)
そこで、イベントを追跡するサイトを構築しています。各イベントにはIDと値があります。また、ID、年齢、性別、都市、国、ランクを持つユーザーによって実行されます。(重要な場合、これらの属性はすべて整数です)
2つのクエリに対する回答をすばやく取得できる必要があります。
- 特定のプロファイルを持つユーザーからイベントの数を取得します(たとえば、ロシアのモスクワに住む18〜25歳の男性)
- 特定のプロファイルを持つユーザーからのイベントの値の合計(おそらく平均も)を取得します-
また、データは複数の顧客によって生成され、その顧客は複数のsource_idを持つことができます。
アクセスパターン:データは主にコレクタープロセスによって書き込まれますが、クエリされた場合(まれに、Web UIによって)、迅速に応答する必要があります。
確かに複数のテーブルまたは単一のサーバーが処理できる大量のデータを期待しています。
イベントを1日あたり別々のテーブルにグループ化することを考えています(つまり、「events_20111011」)。また、テーブル名の前に顧客IDとソースIDを付けて、データを分離し、簡単に破棄(古いデータを削除)して比較的簡単に移動(他のマシンに負荷を分散)できるようにします。このように、そのようなすべてのテーブルには、たとえば1,000万のトップなどの限られた数の行があります。
したがって、問題は、ユーザーの属性をどうするかということです。
オプション1、正規化:それらを別のテーブルに保存し、イベントテーブルから参照します。
- (プロ)データの繰り返しはありません。
- (con)参加しますが、これは高価です(またはそう聞いたことがあります)。
- (con)これには、ユーザーテーブルとイベントテーブルが同じサーバー上にある必要があります
オプション2、冗長:ユーザー属性をイベントテーブルに保存し、それらにインデックスを付けます。
- (プロ)より簡単な負荷分散(自己完結型のテーブルは移動可能)
- (プロ)より単純な(より速い?)クエリ
- (con)ユーザー属性と対応するインデックスを繰り返すために使用される大量のディスクスペースとメモリ