1

我正在开发一个 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)的唯一组键?

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;

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

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 回答