数仓模型是非常重要的,模型中键又是重中之重。
今天简单讨论一下键。
候选键包含主键 和可选建,主键可以作为其它表的外键。
主键的生成方式分为两类:自然键和代理键。
主键都比较好懂,就是唯一键,重点说一下自然键和代理键。
自然键和代理键的有啥区别呢?
自然键是已经真实存在的键,通常具有商业意义,比如emploeeid,employee_name等,可以是单键也可以是复合键。
代理键通常没有商业意义,通常由系统自动生成,只能是单键。
在每个代理键为主键的表中,特别维度表,必定有自然键作为可选键,绝对不允许仅仅存在一个代理键而没有自然键的现象,因为代理键没有自然键就没有意义。
在设计模型中,一般需要考虑代理建作为主键,为啥呢?
1、在模型中如果如果自然键作为主键的话,有时会涉及到一些很多外键,如有需求需要修改主键,那么会引起一连串的反应。但是如果用代理键作为主键的话,因为代理键本身没意义,只需要修改代理键对应的自然健就ok了。
2、自然健为主键在新老系统合并中,比较困难,如果是代理键就比较简单了。
代理键绝对不可以对用户可见,通常是用来join,而不是where的搜索条件。通常情况下代理键的命名规则要规范,带有后缀,比如xxxx_sk等
主要原因呢,1、代理键毫无意义,暴露给用户会导致客户体验差。2、如果保存数据字典中,对于程序员根据名字就能很快的判断出是否是代理键,避免错误的使用。3、也是比较重要的一点,如果涉及到系统迁移,因为代理键都是自动生成的,会造成相同自然键的代理键不一致,造成混乱。
创建代理键的方法:
1、系统自动生成,比如序列号
2、ETL程序中max+1
3、创建一张维护表,通过表来维护
4、高低位法,xxx-yyyy,根据不同规则代表不用含义来表示
5、UUID,GUID mac地址+时间戳等。
代理键使用的其它场景
1、完全没有主键的数据表。
2、分布式结构数据库,多联合主键的事实表,为了分区方便,创建单独的代理键来避免数据的偏移等。
有时业务查询自然键频繁,需要两表关联时,可以把另外一张表的自然健,放到查询的这张表中,也就是逆规范化,先进行三范式规范化,再根据需求进行逆规范化。
先写这么多吧,其实还有代理键节省空间,查询效率比较高等。