张逸说

出口成张,逸派胡言

0%

主题数据区的设计

关于主题数据区的设计,首先需要明确的是按照什么对数据进行归类。大的原则,当然还是按照业务来分类,但是分类的出发点不同,划分的类别也不相同。例如针对机场数据,可以从业务特征分类,那么可以分为运行保障、旅客服务、航班资源等;如果按照功能区分类,则可以分为空侧、陆侧、航站楼侧等。

不管采用什么原则对数据进行分类,我认为都需要遵循以下两个原则:

  • 保证数据的分类是正交的:正交的数据分类可以避免数据的重复。例如航班与旅客存在关联关系,但只允许这二者之间存在一个交点,旅客的信息不允许出现在航班中,航班的信息也不允许出现在旅客中。如果需要,通过主外键关联。
  • 保证数据类别的抽象层次处于同一个层次:这是SLAP(单一抽象层次原则)的体现,如果数据类别的层次不一致,就会失去数据的平衡。例如航班主题与货运主题就不在一个抽象层次上,货运主题与行李主题为同一抽象层,两者的共同抽象为物流,物流主题与航班主题才是同一个抽象层次。

当然,对于主题数据区的数据,从分类的依据看,在满足以上两个原则的基础上,我认为还是应贴近数据特征的角度进行类别划分,并尽量保障数据的类别是正交的,同时在保证数据存取性能的前提下,力求更细的数据粒度。而在数据集市区,才会根据不同的业务流程、业务目标去建立集市。建立集市的基础是主题数据,一个正交的主题数据(甚至可能遵循三范式)才能更好地满足集市的业务需求,对其进行重用。

所谓“数据特征”,就是该数据的本质属性,是体现了最基础特征信息的数据。这就要求对数据进行抽象,撇开数据源对业务的影响,也要撇开业务场景对分类的影响。可能符合某个数据特征的数据同时来自多个系统,也可能它同时为多个业务场景提供服务。在机场数据领域,最根本的具有本质属性的数据就是:

  • 航班
  • 旅客
  • 物流
  • 资源
  • 气象
  • ……

在确定了第一级主题(也可以认为是主题域,即subject area)后,在讨论下一级数据分类时,我们出现了分歧。最初提出的类别草案中,将“航班旅客信息”放到了旅客主题中,该信息包括:

  • 值机截载旅客统计信息
  • 登机截载旅客统计信息
  • 起飞截载旅客统计信息
  • 实时旅客数据:如实时值机人数、实时登机人数、实时安检人数
  • 累计旅客数据:如累计值机人数、累计登机人数、累计安检人数

我认为这种划分是不合理的,虽然这里的信息都与旅客相关,但这些信息并非旅客的明细数据,同时它又与具体某个航班是粘连在一起的。到底该怎么归属呢?类似这样的场景,旅客的一些数据在特性上无法清晰地界定到底属于哪一个主题,因为在关系上,可能这些数据属性与两个乃至多个主题都存在一定关系,分类时就容易混淆。

我提出了解决此类数据分类的两个原则:

  • 主次之分:判断该数据属性所关联的主题究竟以谁为主。以航班旅客信息为例,我们应该思考这些信息到底是以航班为主,还是旅客为主?
  • 强弱之分:判断该数据属性与哪一个主题关联更强,哪一个主题关联更弱。若还是无法分清,可以看看当变化发生时,对谁的影响更大? 仍然以航班旅客信息,如这里的截载旅客统计信息,究竟是与航班关联更紧密,还是与旅客关联更紧密?从变化上看,可能更清楚。例如当实时值机人数发生了变更,究竟是对当前航班影响更大,还是对某位旅客的信息影响更大?

不言而喻,无论是“主次之分”还是“强弱之分”,我们都可以清晰地分辨出航班旅客信息更多地是与航班相关,故而应分属于“航班”主题。