从桥表获取组密钥

时间:2010-06-07 07:13:45

标签: mysql database-design sql-match-all

我正在开发一个ETL过程,并且需要一个桥表来实现事实表和维度表(MySQL数据库)之间的一对多关系。组合数量有限(几千个),因此我想重新使用桥接表中的组密钥来限制大小。

属于事实行的任何维度组将包含多个维度键(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)的唯一组密钥?

2 个答案:

答案 0 :(得分: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;

另一个解决方案是计算组中匹配的行:

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中。

答案 1 :(得分:0)

如果我理解正确,你想要的是一个如下所示的桥接表:

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

我可以看到两个选项。

您可以将整个桥表拉入程序,并以编程方式从维度集中确定组密钥。

或者您可以使用数学公式对维度键进行编码,以得出一个可以索引的整数。

a + (b * 32) + (c * 32 * 32) + ...之类的东西使用包含唯一尺寸数量的最低2的幂。