寻求一点帮助来阐明维度模型。我正在研究归结为 Web 事件分析的内容 - 给定 Web 日志,我想解析和存储 URL 中存在的变量。诀窍是这些变量并不总是预定义的,有时,一个变量可能包含多个值。
让我们看一个假设。如果我有一个查询字符串
session_id=SID&key1=value1&key2=value2&key3=value3a&key3=value3b&key3=value3c
我的目标是能够通过这些键的任意组合来计算聚合。例如,我可能会说“有多少页面点击的 key3 值为 value3a”,或者“有多少页面点击的 key1 值为 value1,而 key3 的值为 value3b”。为了增加复杂性,最终可能会出现 key4 和 key5 等,并且可能没有足够的预警来能够在值出现之前进行维度模型更改。
一种方法可能是创建 3 个维度表,dim_key1
、dim_key2
和dim_key3
,每个表都有一个id
字段和一个value
字段。
然后我的事实表可能看起来像
id, session_id, dim_key1, dim_key2, dim_key3, count
这样做的缺点是我需要在我的事实表中创建 3 行,以便key3
从查询字符串中正确捕获 3 个值。此外,对于出现的每个维度,我都需要提前通知,并且需要创建我的新维度表。
另一种可能的方法,更适合 dim_key3,可能是创建一个维度表,如
id, value3a, value3b, value3c, ...
其中该表中的行由表示这些值组合的 1 和 0 组成。例如,上面的查询字符串会有一行看起来像1, 1, 1, 1, 0, 0, ...
,并且页面命中事实表的 dim_key3 维度 id 为 1。
从好的方面来说,每个页面点击在事实表中只有一个条目,并且维度表可以保持稀疏表示,我们只在其中为我们实际看到的组合创建新行(即我们不需要所有 key3 组合的幂集)。不利的一面是,每个新值key3
仍然需要在该暗表中添加一个新列。
最后一个想法,fordim_key3
将有一个类似 的表id, value_list
,其中value_list
存储以逗号分隔的值列表。它与“每个值的列”方法类似,但只是保持了更紧凑的表示。在这种情况下,我们可能有一个维度行,如1, "value3a,value3b,value3c"
.
同样,这只需要事实表中的一行,并且作为一个额外的优势,当新值出现时不需要新列。缺点是它迫使查询变得复杂,不得不进行全文匹配/正则表达式。(如果有兴趣,我可以深入探讨,但我觉得我已经进行了足够长的时间)。
我查看了几个参考资料,包括 Kimball 的“数据仓库工具包”,但没有找到任何可以直接回答我问题的内容。大多数点击/网络/事件流分析维度模型示例都有一组固定不变的奇异值变量。
我概述的三种方法中的任何一种是否合理,和/或是否有人对我错过的另一种模型有任何建议?
提前致谢!