3

エンティティ属性値データベースに基づいてデータ ウェアハウスを作成することは可能ですか?

もしそうなら、どのように?

基本的に、次の形式のデータがあります。

id  name   value
----------------
1   name1   10
1   name2   20
1   name3   30
2   name1   40
2   name2   50
2   name3   60
...

次の代わりに:

id name1 name2 name3
--------------------
1   10    20    30
2   40    50    60

私が抱えている問題は、ファクト テーブルに入れることができる特定の名前/測定値のセットがないことです。

name1name2および事前に知られていませんname3(それらがいくつ存在する可能性さえありません)。

これを解決する方法についてのアイデアはありますか? インターネットで検索しましたが、関連する情報が見つかりませんでした。どんな助けでも大歓迎です...

: データ ウェアハウスを構築した経験はありません。私は現在読んでいます: The Data Warehouse ETL Toolkit: Practical Techniques for Extracting, Cleaning, Conforming, and Delivering Data (by Ralph Kimball)


ベンに(コメントから)答えるには:「あなたのテーブルは実際に正規化されています...なぜ非正規化したいのですか?

長い回答:
当社のお客様は、ワークスペースの OLAP キューブからディメンションとメジャーをドラッグ アンド ドロップし、選択したデータを表示できるツールを使用しています。

私がモデルを使用する場合、Paul Grimshaw は、顧客が名前をワークスペースにドラッグし、名前が同じになるようにフィルターを追加する必要があることを提案しましたname1(彼が望む場合)。

一方、顧客がワークスペースにドラッグできる名前のリストを持っている場合、関連付けられたデータにアクセスするためのアクション (使いやすさ) は 1 つだけで済みますname1(例にすぎません)。もう 1 つの理由があります。見つけやすさです。顧客は、名前のフィルターを追加する代わりに、使用可能な名前のリストを見て、そこから選択することができます (正確な名前を知る必要があります)。

簡単な答え: 顧客にとっての使いやすさ (名前の発見可能性を含む)。

4

2 に答える 2

1

リレーショナル モデルからレポートを作成する場合、Entity-Attribute-Value 構造の処理はトリッキーです。ディメンション モデルは気にしないでください。

これに対処するには、「属性」列の「動的属性」テーブルを作成します。この場合は、「名前」列です。

基本的に、バッチ ETL プロセス中に、古いテーブルを削除し、新しいテーブルを作成します。新しいもののDDLは、(あなたの場合)「名前」列から個別の値を選択することによって生成され、データベース上で動的SQLとして実行されます。次に、ETL は動的に UPDATE または INSERT ステートメントを作成し、このテーブルに EAV テーブルの各列をロードします。次のようになります。

IF id doesn't exist in table, then:

INSERT INTO DYNAMIC_PIVOT_TABLE (id, $name) 
   SELECT id, value as "$name" where name = "$name";

ELSE 

UPDATE DYNAMIC_PIVOT_TABLE  ... etc

$name の値ごとに、挿入または更新を 1 回実行して、EAV データの「サブセット」を適切な列にロードします。

これで、1 つのディメンション (ID) と残りのアイテムのメジャーを含む "ファクト" テーブルが作成されました。

ただし、「名前」の一部がメジャーではなくディメンション属性である場合は、さらに悪化します。次に、何がメジャーで何が属性かを判断するために、クレイジーなロジックを実行する必要があります。

また、多くの OLAP ツールは「静的」メタデータを必要とします。メタデータを動的に変更すると、問題が発生する可能性があります。

于 2012-09-11T15:53:53.220 に答える
0

私があなたを正しく理解していれば、「ID」をファクトテーブルのキーとして、また「名前ID」として使用できます。

これにより、2 つのキー (id と nameid) と 1 つの値フィールドを持つファクト テーブルを持つ 2 つのディメンション (id と name) が得られます。

于 2012-09-10T20:17:28.450 に答える