Database design 多值web流的维模型

Database design 多值web流的维模型,database-design,data-warehouse,dimensional-modeling,Database Design,Data Warehouse,Dimensional Modeling,寻找一点帮助来阐明一个维度模型。我在看什么可以归结为web事件分析——给定web日志,我想解析并存储URL中存在的变量。诀窍在于这些变量并不总是预定义的,有时,一个变量可能包含多个值 让我们来看一个假设的例子。如果我有一个查询字符串,比如 session\u id=SID&key1=value1&key2=value2&key3=value3a&key3=value3b&key3=value3c 我的目标是能够通过任意组合这些键来计算聚合。例如,我可能会说“有多少页面点击的key3值为value

寻找一点帮助来阐明一个维度模型。我在看什么可以归结为web事件分析——给定web日志,我想解析并存储URL中存在的变量。诀窍在于这些变量并不总是预定义的,有时,一个变量可能包含多个值

让我们来看一个假设的例子。如果我有一个查询字符串,比如

session\u id=SID&key1=value1&key2=value2&key3=value3a&key3=value3b&key3=value3c

我的目标是能够通过任意组合这些键来计算聚合。例如,我可能会说“有多少页面点击的key3值为value3a”,或者“有多少页面点击的key1值为value1,key3值为value3b”。为了增加复杂性,可能最终会出现一个键4和键5等,并且可能没有足够的预先警告,以便能够在值出现之前进行标注模型更改

一种方法可能是创建三维表,
dim_-key1
dim_-key2
dim_-key3
,每个表都有一个
id
字段和一个
字段

那么我的事实表可能看起来像

id,会话id,尺寸键1,尺寸键2,尺寸键3,计数

这样做的缺点是,我需要在事实表中创建3行,以便从查询字符串中正确捕获
key3
的3个值。此外,对于出现的每个维度,我都需要提前通知,并且需要创建新的维度表

另一种可能的方法,更适合dim_key3,可能是创建一个维度表,如

id,value3a,value3b,value3c,…

其中,该表中的行由表示这些值组合的1和0组成。例如,上面的查询字符串将有一行类似于
1,1,1,1,0,0,…
,页面命中事实表的dim_key3维度id为1

另一方面,每个页面命中在事实表中只有一个条目,维度表可以保持稀疏表示,我们只为实际看到的组合在其中创建新行(即,我们不需要所有键3组合的幂集)。缺点是,
key3
的每一个新值仍然需要在dim表中添加一个新列

最后一个想法是,对于
dim_key3
将有一个类似
id,value_list
的表,其中
value_list
存储所看到的逗号分隔的值列表。它与“每个值对应一列”的方法类似,但只是保持了更紧凑的表示形式。在本例中,我们可能有一个维度行,如
1,“value3a、value3b、value3c”

类似地,这将只需要事实表中的一行,并且作为一个额外的优势,在显示新值时不需要新列。缺点是它会使查询变得复杂,必须进行全文匹配/正则表达式。(如果有兴趣的话,我可以做得更多,但我觉得我已经做得够久了)

我看过几篇参考文献,包括Kimball的“数据仓库工具包”,但没有找到任何能直接回答我问题的东西。大多数click/web/eventstream分析维度模型示例都有一组固定不变的奇异值变量

我概述的三种方法中有哪一种是合理的,和/或是否有人对我错过的另一种模式有任何建议


提前谢谢

如果事实表为页面加载和键之间的每个关联都包含一行,那么设计会怎么样:

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

如果事实表为页面加载和键之间的每个关联都包含一行,那么设计又如何呢

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

比尔,谢谢你的回复。我只是想确保我理解你的建议,以及其中的一些含义。将任意/多值键值对放到它们自己的维度中看起来是处理它们的非预定性质的好主意。然而,在事实表方面,这意味着对于每个页面加载,每个键值对仍然有一行。你会建议把它作为一个单独的事实表拿出来吗?(以下续…)我设想对单值变量使用
fact\u page\u load\u static
(或类似的东西),对任意键值对使用
fact\u page\u load\u variable
?这样,我们就不必多次复制所有单值数据了?这与你的建议相符吗?再次感谢!比尔,谢谢你的回复。我只是想确保我理解你的建议,以及其中的一些含义。将任意/多值键值对放到它们自己的维度中看起来是处理它们的非预定性质的好主意。然而,在事实表方面,这意味着对于每个页面加载,每个键值对仍然有一行。你会建议把它作为一个单独的事实表拿出来吗?(以下续…)我设想对单值变量使用
fact\u page\u load\u static
(或类似的东西),对任意键值对使用
fact\u page\u load\u variable
?这样,我们就不必多次复制所有单值数据了?这与你的建议相符吗?再次感谢!