我正在开发一个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)的唯一组密钥?
答案 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的幂。