假设 有过滤维度(筛选条件):设备维度(安卓、苹果),城市维度(北京、上海、广州等),运营商维度(电信、联通、移动),最终呈现的指标是 每日活跃度。 这种数据模型是怎么样的呢?是明细到每一条用户、设备、城市、运营商这样的数据,还是能够提前算好呢?
原始数据肯定是有明细,然后可以根据不同维度建立单一维度或者多个维度的汇总表;
另外,根据举例的这个数据量来看,建立一个 日期、设备、城市、运营商级别的合计活跃用户数和总用户数就好了,这个汇总表数据量不大,而且可以满足当前各维度筛选的需求。
这里在效率以及数据准确性上要做个取舍,用下面这个sql做汇总表,肯定比你原表效率要高,但是并非绝对准确,不过既然一天之内跨城市或多设备使用的用户很少,那么这种用户对这个数据的影响也就不会很大。
select 日期,设备,城市,运营商,count(distinct uid) 用户数 from 表 group by 日期,设备,城市,运营商
另外一种方式,以 日期、uid 两个字段作为唯一键,将城市、设备、运营商三者的所有值全部展开成列,值为1时表示是,空表示否,查询时根据不同的条件来指定不同的字段进行查询,这样表的行数也可以大大减少,但是由于城市数过多,很有可能超过列数上限。考虑到一天内一个用户很少跨城市,那么也可以把这个方案修改成日期、uid、城市三个字段作为唯一键,把设备和运营商的所有值展开成列