1

次元モデルを解明するための少しの助けを探しています。Web イベント分析に要約されるものを見ています。Web ログが与えられた場合、URL に存在する変数を解析して保存したいと考えています。秘訣は、これらの変数が常に事前定義されているとは限らず、場合によっては変数に複数の値が含まれる場合があることです。

ある仮説を見てみましょう。次のようなクエリ文字列がある場合

session_id=SID&key1=value1&key2=value2&key3=value3a&key3=value3b&key3=value3c

私の目標は、これらのキーの任意の組み合わせによって集計を把握できるようにすることです。たとえば、「key3 の値が value3a であるページ ヒットの数」または「key1 の値が value1 で、key3 の値が value3b であるページ ヒットの数」と言うことができます。複雑さを増すために、最終的に key4 や key5 などが表示される可能性があり、値が表示される前に次元モデルを変更できるようにするための十分な事前警告がない可能性があります。

1 つの方法として、それぞれフィールドとフィールドを持つdim_key1dim_key2、およびの3 つのディメンション テーブルを作成することが考えられます。dim_key3idvalue

次に、私のファクトテーブルは次のようになります

id, session_id, dim_key1, dim_key2, dim_key3, count

これの欠点はkey3、クエリ文字列から 3 つの値を適切に取得するために、ファクト テーブルに 3 つの行を作成する必要があることです。さらに、表示されるすべてのディメンションについて、事前に通知する必要があり、新しいディメンション テーブルを作成する必要があります。

dim_key3 により適した別の可能なアプローチは、次のようなディメンション テーブルを作成することです。

id, value3a, value3b, value3c, ...

そのテーブルの行は、これらの値の組み合わせを表す 1 と 0 で構成されています。たとえば、上記のクエリ文字列には のような行が1, 1, 1, 1, 0, 0, ...あり、ページ ヒット ファクト テーブルの dim_key3 ディメンション ID は 1 です。

プラス面としては、各ページ ヒットはファクト テーブルに 1 つのエントリしか持たず、ディメンション テーブルはスパース表現を保持できます。そこでは、実際に見た組み合わせに対してのみ新しい行を作成します (つまり、すべての key3 の組み合わせの累乗セット)。マイナス面としては、の新しい値ごとkey3に、そのディメンション テーブルに新しい列を追加する必要があります。

最後のアイデアは、見た値のコンマ区切りリストを格納する のようdim_key3なテーブルを持つことです。これは、「すべての値の列」アプローチと同様のアプローチですが、よりコンパクトな表現を維持するだけです。この場合、 のようなディメンション行があるとします。 id, value_listvalue_list1, "value3a,value3b,value3c"

同様に、これにはファクト テーブルの行が 1 つしか必要なく、追加の利点として、新しい値が表示されても新しい列が必要ありません。欠点は、全文一致/正規表現を実行する必要があるため、クエリが複雑になることです。(興味があればもっと詳しく話せますが、もう十分長く続けているような気がします)。

Kimball の「The Data Warehouse Toolkit」など、いくつかの参考文献を調べましたが、私の質問に直接答えるものは見つかりませんでした。クリック/ウェブ/イベントストリーム分析のディメンション モデルの例のほとんどには、不変で特異値を持つ変数の固定セットがあります。

私の 3 つの概説されたアプローチのいずれかが合理的ですか、および/または私が見逃した別のモデルについて誰か提案がありますか?

前もって感謝します!

4

1 に答える 1

1

ページの読み込みとキーの間の各関連付けの行がファクト テーブルに含まれている設計についてはどうでしょうか。

RowID, SessionID, PageLoadID, KeyValuePairID, DateKey, etc.

KeyValuePair ディメンション テーブルは次のようになります。

KeyValuePairID, Key, Value

あなたの例では、ディメンション行を作成します

1 key1 value1
2 key2 value2
3 key3 value3a
4 key3 value3b
5 key3 value3c

次に、交差クエリを実行して答えを見つけることができます

Select Intersect(
    NonEmpty([Session].Members, [KeyValuePair].&[Key1][Value1]),
    NonEmpty([Session].Members, [KeyValuePair].&[Key3][Value3a])) on 0
From myCube
于 2012-11-16T20:40:26.390 に答える