寻找一些帮助来阐明维度模型。我正在研究什么归结为Web事件分析 - 给定Web日志,我想解析并存储URL中存在的变量。诀窍是这些变量并不总是预定义的,有时变量可能包含多个值。
让我们来看一个假设。如果我有一个像
这样的查询字符串 session_id=SID&key1=value1&key2=value2&key3=value3a&key3=value3b&key3=value3c
我的目标是能够通过这些键的任意组合来计算聚合。例如,我可能会说“有多少页面命中具有value3a的key3值”,或“有多少页面命中的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
的每个新值仍然需要添加到该昏暗表中的新列。
最后一点想法,dim_key3
会有一个像id, value_list
这样的表,其中value_list
存储以逗号分隔的值列表。这与“每个值的列”方法类似,但只是保持更紧凑的表示。在这种情况下,我们可能会有一个像1, "value3a,value3b,value3c"
这样的维度行。
类似地,这只需要事实表中的一行,并且作为一个额外的优点,当新值出现时不需要新列。缺点是它会在查询中增加一些复杂性,不得不进行全文匹配/正则表达式。 (如果有兴趣的话,我可以进一步了解,但我觉得我已经进行了足够长的时间)。
我查看了几个参考资料,包括Kimball的“数据仓库工具包”,但没有发现任何直接回答我问题的内容。大多数click / web / eventstream分析维模型示例都有一组固定的不变和奇值变量。
我所描述的三种方法中的任何一种方法是否合理,和/或是否有人对我错过的另一种模型有任何建议?
提前致谢!
答案 0 :(得分:1)
如果设计中的事实表包含页面加载和键之间的每个关联的行,那么该怎么做:
RowID, SessionID, PageLoadID, KeyValuePairID, DateKey, etc.
KeyValuePair维度表将具有:
KeyValuePairID, Key, Value
因此,对于您的示例,您将创建维度行
1 key1 value1
2 key2 value2
3 key3 value3a
4 key3 value3b
5 key3 value3c
然后您可以执行相交查询以查找答案
Select Intersect(
NonEmpty([Session].Members, [KeyValuePair].&[Key1][Value1]),
NonEmpty([Session].Members, [KeyValuePair].&[Key3][Value3a])) on 0
From myCube