什么是标识符?
在数据库和数据模型中有一个最基本的概念就是标识符(Identifier),而标识符这个专业术语,由于方法论的不同又出现很多叫法,为了避免误解,先定义一下我所理解的相关标识符。
数据模型设计的阶段可以划分为概念模型设计、逻辑模型设计和物理模型设计。
在概念模型设计的过程中定义要设计的系统的范围和整体的框架,依据概念模型的框架,对各个部分详细地分析和设计是在逻辑模型设计阶段完成的,而最终根据设计的逻辑模型,考虑具体数据库管理系统的特点和性能完成物理模型的设计。
在概念模型和逻辑模型设计阶段会使用一套专业术语(更偏向于业务),在物理模型设计的阶段又会使用一套专业术语(更偏向于物理数据库)。
所谓的标识符,主要是使用在概念和逻辑模型设计的阶段,由一个或一组属性构成,作用是能够唯一识别每一个实体(Entity)中的每一个实例(Instance)。
很多人可能会说标识符就是数据库的主键(Primary Key)嘛~这种说法其实并不准确。
因为,从保证唯一性的角度来看是没有问题的,只是每一个实体当中可能会存在多个能够保证唯一性的属性或属性组,从它们当中选出一个在建表的时候设计主键约束条件的那个才是主键。
在概念模型和逻辑模型设计的过程中,会涉及到的标识符的概念有:
- 人造标识符
- 本质标识符
- 实质标识符
- 候补标识符
- 外来标识符
先解释一下这几个概念和这几个概念之间的关系。
人造标识符是指业务管理或者系统实现时,根据一定的规则认为指定和设计的能够保证唯一识别相关信息项的属性。比如,客户编号、订单编号、商品编号等。
本质标识符是指能够保证某个实体唯一性的本质性的属性,所谓的本质性可以理解为不需要人为地指定标识符也能够准确的识别每一个实体实例的属性。本标识符往往需要由多个属性一起构成。比如,客户实体当中排除掉人为指定的客户编号,能够使用<客户名称+证件类型+证件号码>这三个属性来准确地判断两个人是不是同一个人。另外,在寻找本质标识符的时候,常常使用5W1H原则。
实质标识符就很容易理解了,就对应了物理模型当中的主键的概念,如果说能够保证唯一性的标识符有多个的话,或者本质标识符也有人造标识符也有的情况下,最终被选定在物理模型设计过程中添加主键约束的那个标识符就是实质标识符。而没有被选定添加主键约束的标识符就是候补标识符。
在标识符当中,由其他实体继承而来的属性称为外来标识符,相当于物理模型设计中的外键,需要在外来标识符上添加外键约束。
为什么需要本质标识符?
很多人都会问本质标识符的作用是什么?有实质标识符了就行,为什么还需要本质标识符?
就像刚解释本质标识符概念的时候也说过,“不需要人为地指定标识符(人造标识符)也能够准确的识别每一个实体实例”。
在很多系统的表结构中,使用一个编号(人造标识符)做主键(实质标识符)的情况非常多,如果说没有这些编号的话,如何判断两行数据所说的是不是一个东西?比如,银行客户来开户的时候,如何判断这个客户是不是已经开过户了?是不是已经是我们的客户了呢?用客户表里的客户编号根本无法判断,所以,会根据客户的名称、证件类型和证件号码来判断是不是同一个人。
这是本质标识符存在的根本原因,而在数据模型设计、数据迁移、整合和管理的过程当中,也会常常使用本质标识符。
模型设计的过程中使用本质标识符
数据模型设计的过程当中,需要根据需求确定要管理的信息项,而在对信息项进行划分的时候,需要根据业务找出实体和能够保证实体唯一性的本质标识符。
根据本质标识符也可以判断实体的级别,比如,在订购管理相关的业务当中,下一次订单可以订购多个商品的话,肯定会存在订单和订单详情两个实体,而这两个实体的本质标识符是不一样的。根据下订单的客户(客户编号)和下订单的时间(订购时间)可以判断两个订单是不是同一个订单,所以它们两个是订单的本质标识符,而再加上订购了什么商品(商品编号)的话,就是订单详情实体的本质标识符。订单和订单详情是不同级别的,订单详情里继承了订单的实质标识符,所以能够找到它所从属的那个订单,同时,在订单详情中也定义了具体订购了哪个商品。
如果说业务上还需要管理具体某个订单变更历史的话,那就需要再加上时间的维度,这样的话订单详情变更历史相关的信息又会再下一个级别。(当然可以将它和订单详情整合在一个实体,这里主要强调的是本质标识符不同)
在数据整合的时候需要依赖本质标识符
数据整合时本质标识符的用法就是利用了本质标识符的基本概念,不同系统中使用的主键编码体系不仅不同,表结构设计的方式也可能会有很大差异。所以,不同系统间做数据整合的时候,都需要先通过本质标识符来先判断不同系统中的哪些表是相同级别的,然后,再判断两条数据是不是重复之间才能判断能否整合到一起去。
总结
本质标识符的概念在数据模型设计的过程中会一直伴随设计者,会不断地通过对本质标识符的寻找和判断来设计模型,所以,在学习如何设计数据模型的时候,对这个概念的理解就显得尤为重要。但是,对这个概念更深一层的理解和强化,就需要从大量的实践和讨论来实现。