经常遇到这种父子关系表, 父表也是事实,上面有很多维度,和子表一对多关系。
1. 如果不仔细设计,可能是这种结果:
借款事实表:
借款单id (dd)
借款日期(fk)
借款人 (fk)
借款产品(fk)
借款金额
状态1(dd)
状态2 (dd)
状态3(dd)
还款事实表:
还款id (dd)
借款单id (dd)
还款日期 (fk)
还款方式 (fk)
还款金额
优点: 加工加单,通俗易懂,没有丢失信息
缺点: 当想分析还款事实表时,大概率得链接借款事实表,性能不好。
关于借款事实表杂项维度:如果是行存的数据库, 状态1 状态2 状态3 这么存储是浪费空间的, 如果是列存的数据库,这么存储占用空间很小。
2. 标准维度建模
借款事实表:
借款单id (dd)
借款日期(fk)
借款人 (fk)
借款产品(fk)
借款金额
状态1(dd)
状态2 (dd)
状态3(dd)
还款事实表:
还款id (dd)
借款单id (dd)
借款日期(fk)
借款人 (fk)
借款产品(fk)
还款日期 (fk)
还款方式 (fk)
还款金额
状态1(dd)
状态2 (dd)
状态3(dd)
优点: 这俩表都可以单独的高效分析
缺点:借款单的属性被多次复制,污染了其他表。 而且 状态1 状态2 状态3 不固定可能会增加。维护成本高。
3. 标准维度基础上再引入杂项维度设计
借款事实表:
借款单id (dd)
借款日期(fk)
借款人 (fk)
借款产品(fk)
借款金额
状态1(dd)
状态2 (dd)
状态3(dd)
杂项维度主键(fk)
还款事实表:
还款id (dd)
借款单id (dd)
借款日期(fk)
借款人 (fk)
借款产品(fk)
还款日期 (fk)
还款方式 (fk)
杂项维度主键(fk)
还款金额
杂项维度表
杂项维度主键 (pk)
状态1
状态2
状态3
优点: 把借款单中借款单id外的退化维度封装进一个杂项维度表, 还款表只继承杂项的id,屏蔽了杂项维度的增删。 借款事实表故意冗余了状态123,虽然已有杂项维度。不占空间,方便查看。
缺点:如果借款单的杂项维度发生变更时, 怎么同步到还款单。 数据冗余固有的缺点。
问题:杂项维度的主键是否可以MD5状态123,大数据,不计较这点存储。