1.问题
两个维度,该建一个维度表还是两个维度表?
2. 举例
上午, 出生在龙虎山的碧莲在碧游村花30块钱点了一份宫保鸡丁
中午,出生在龙虎山的碧莲回公司花80块钱点了一份佛跳墙。
时间维度:
人维度: 碧莲, 龙虎山是碧莲的出生的,是人维度的一个属性。 基本稳定,不会变化。
点餐地点: 都是地点,一个是出生地,一个是点餐地点,就因为是否变化, 一个是维度属性,一个是单独的维度。
商品:
事实: 钱
把点餐地点作为人的维度属性是否可以?
上午, (出生在龙虎山的在碧游村点餐的碧莲)花30块钱点了一份宫保鸡丁
中午,(出生在龙虎山的在公司点餐的碧莲)花80块钱点了一份佛跳墙。
也不是不行,就是人维度这么一会就变了一次,没准晚上还得变。
维度表变化会非常快,接近事实表。关联性能不好,非常不建议。
3.反例
假如, 人的出生地也会变化,只是不那么频繁,一辈子变个1-2次这种。出生地需要单独建立维度吗?
可以, 优点非常明显。缺点也很明显。
优点:人维度就没有任何可变的属性了(忘记可以改名字了)
缺点:按这个标准执行, 事实表会关联特别多的维度。建议适当容忍维度变化,做缓慢变化维度。
什么是易变, 多少维度叫多, 看自己的心理预期了。
4. 结论
两个维度,如果是易变的多对多的关系,最好还是建成俩维度, 靠事实表来描述这俩之间的关系。 事实表本来就是维度之间的多对多关系,而且有时间。
如果是比较稳定的关系,可以合成一个维度,做缓慢变化维度。
在维度数量和维度变化频度之间平衡一下,不追求极致。
追求维度完全不变, 会导致维度表个数非常多。
追求维度表少,会导致维度表变化特频繁。
5. 扩展
虽然事实表表达了维度表之间的多对多关系, 但是因为事实表本身稀疏性的特点,并不能描述完整的多对多关系。
比如 下单事实表关联 用户和居住地址维度。
用户不一定在每个居住地都下单了, 而且也不是每天都下单, 通过下单事实不能完整的表示用户和居住地址的关系。
要表达这个关系, 需要单独做一个无事实的事实表,用户什么时间开始,到什么时间结束 在哪居住。
这个例子不好, 感觉快成了一个缓慢变化维度表了, 意会吧, 假设这个用户每三天搬一次家。