主键和外键
外键:引用其他表的主键,为了保证数据的一致性
自然键(Natural Key)
已经真实存在的键,通常具有商业含义,比如身份证ID,护照编码等等。可以是单键(经常被用于搜索条件,例如查快递信息,需要输入快递单号,快递单号就是单键),也可以是复合键。
代理键(Surrogate Key)
完全没有商业含义,通常由当下的系统自动生成,都是单键没有复合键(做月份的维度,代理键的值可能为123456但是不代表 1对应1月份,2对应2月份)
在每个代理键为主键的表中,尤其维度表,必定有自然键作为可选键(在数据仓库里为了能够记录每个实体的所有变化通常会加一个时间标记列作为联合组键,但同时也得保留原来的两个自然键)。绝对不允许仅仅只存在一个代理键而没有自然键的现象。
自然键灵活性:
1.主键不可以修改,实体主键变化会带来外键相关的连锁反应。当选择用原来的自然键作为主键一旦需要修改,只能删除重做,而且这个自然键又是其他表的外键,就会有连锁反应。
2.新系统接入时,合并维度存在一定困难。
代理键灵活性:
1.代理键本身无意义,可以修改原自然键内容
2.新系统接入时,合并维度表相对简单
checksum_cd:输入不定长度的信息时,可以输出固定长度的算法。
代理键绝对不可以对用户可见,通常用于Join,而不用于where的搜索条件,此外代理键的命名规则要非常明确,比如XXXX_SK
原因:1.代理键毫无商业意义,暴露给用户只会误导用户
2.系统迁移等环境变更,由于代理键是系统生成的,会造成相同自然键的代理键不一致
3.使程序员根据名字能够轻易判断出是否具有代理键,避免错误使用
自然键程序编写:
1.对事实表而言,如需要按照自然键直接搜索,则可以不用关联到维度表。
2.如果维度表是复合主键,则程序书写更复杂
代理键程序编写:
1.由于代理键无法直接作为查询条件,因此必须关联到维度表进行关联查询
2.代理键模式更简单
自然键查询性能:
1.如果维度表的自然键是varchar等类型,并且是符合键,性能相对较差
代理键查询性能:
1.代理键均为整型,查询性能较好(代理键性能较好)。
自然键存储空间:
维度表而言,须更少空间;事实表而言,视各个维度键值数据类型而定,通常需要更多空间,总体来看占用空间
代理键存储空间:
维度表而言,需要更多空间;事实表而言,视各个维度键值数据类型而定,通常需要更少空间,总体看来占用空间更少
对于数据仓库来说,大部分数据都在事实表里,维度表占点空间也无所谓。
自然键数据加载:
就维度表而言,直接从源系统过数据,除正常转换外没有额外的开销
代理键数据加载:
就维度表而言,代理键插入须计算最新插入的代理键值
-- ETL处理中 生成代理键:select max+1 : select max(skey)from table +1
代理键使用的其他场景
1.完全没有主键的数据:流水作业的数据没有主键,加一个代理键为主键
2.分布式结构数据库,多联合主键的事实表,为了分区方便,创建单独的代理键以避免数据分区的偏移