1

私はETLプロセスを開発しており、ファクトテーブルとディメンションテーブル(MySQLデータベース)間の1対多の関係のためのブリッジテーブルが必要です。組み合わせの数は限られているので(数千)、ブリッジテーブルのグループキーを再利用してサイズを制限したいと思います。

ファクト行に属するディメンションのグループは、以下のように、一意のグループキーに割り当てられたいくつかのディメンションキー(1から約15)で構成されます。

group_key | dimension_key
-----------------------
1         | 1
1         | 3
1         | 4
2         | 1
2         | 2
2         | 3
3         | 1
3         | 4

ディメンション1、3、4(つまり、1)の一意のグループキーを取得するにはどうすればよいですか?

4

2 に答える 2

1

特定のリストのすべてのディメンションがグループに関連付けられるように、グループを返すクエリを要求していると思います。つまり、そのグループを各ディメンションにマッピングする行が存在する必要があり、どのグループがこれを満たすかを知りたいと考えています。

SELECT f1.group_key
FROM facts f1
JOIN facts f2 ON (f1.group_key = f2.group_key)
JOIN facts f2 ON (f1.group_key = f2.group_key)
WHERE f1.dimension_key = 1
  AND f2.dimension_key = 3
  AND f3.dimension_key = 4;

もう1つの解決策は、グループ内の一致する行をカウントすることです。

SELECT f.group_key
FROM facts f
WHERE f.dimension_key IN (1,3,4)
GROUP BY f.group_key
HAVING COUNT(*) = 3;

GROUP BYしかし、それは通常、特にMySQLではパフォーマンスキラーであることがわかりました。

于 2010-06-07T08:18:30.067 に答える
0

私があなたを正しく理解しているなら、あなたが欲しいのは次のようなブリッジテーブルです:

group_key | dimension_set
-----------------------
1         | (1, 3, 4)
2         | (1, 2, 3)
3         | (1, 4)

私が見ることができる2つのオプションがあります。

ブリッジテーブル全体をプログラムにプルし、ディメンションセットからグループキーをプログラムで決定することができます。

または、数式を使用してディメンションキーをエンコードし、インデックスを作成できるよりも整数を算出することもできます。

a + (b * 32) + (c * 32 * 32) + ... 一意の次元の数を含む2の最小の累乗を使用するようなもの。

于 2010-06-07T08:12:15.143 に答える