背景简介
在绝大部分场景中,用户维度都是一个必不可少的维度,而且随着业务发展和积累,相比其他维度,用户维度应该会是一数据量个比较大的维度。
由于历史原因,在我们这,用户维度的数据源来自于几个业务库,每个业务库记录了每个用户不同的信息。比如现在有两个业务A和B分别记录了各自业务系统里获取的用户信息,其中业务A产出的用户信息表userinfoA如下。这里的userid跟注册无关,而跟手机有关,这意味着一个手机上,如果出现我们app多个产品线,比如主版本,预装定制版,厂商定制版等等,虽然会是对应不同的app,但是userid是一样的,在后台会有一个产品id的字段加以区分。这里userinfo表记录的是跟产品无关的信息,比如系统平台(安卓,ios),系统版本等等。
userinfoA | |
userid | 用户id |
infoA1 | 信息1,与产品无关的信息,如手机型号,平台版本等 |
ctime | 记录创建时间 |
mtime | 记录修改时间 |
业务B产出的用户信息表userinfoB如下,其中pid即之前说的产品id,用以区分不同产品。
userinfoB | |
userid | 用户id |
pid | 产品id |
infoB | 信息B,与产品有关的信息,如用户在某产品的激活时间等 |
ctime | 记录创建时间 |
mtime | 记录修改时间 |
两个表都是在业务上都进行了分表操作,数据量大约都在8亿条左右。当构建用户维表时,一种思路是为每个产品pid,创建一份维表,另一种是维护一个维表,加入产品id作为其中一列。考虑到实际场景,一方面产品id和用户id作为日志要求的必须字段,存在于绝大部分有效日志中,另一方面,主线产品其实占了绝大部分记录数,其余产品线多且杂,统计需求上也基本以主线产品为主。所以采用了第二种方式,这样在有必要的情况下,也能抽取特定的pid生成特定产品的用户维表。所以初步维表设计如下
dim_userinfo |
userid |
pid |
infoA |
infoB | <