简介: 面向对象(OO)和三范式(3NF)都是成熟的设计方法,本文基于面向对象设计思想和三范式数据库设计方法,提出一种实体对象分层建模的思路,其目的是设计简单明了、标准化的数据库结构,同时能够更好的支持模型驱动模型(MDA)的代码自动生成和代码复用,减少代码编写工作量。
本模型探讨的一个数据库建模的方法,其意义主要是为《面向服务体系架构(SOA)和数据仓库(DW)的思考》(以下简称 《 SOA 和 DW 》)所述的共享库提供方法论支持,建立一个简单明了、易于理解的标准化的数据结构,共享库的主要目的是为了共享数据,需要建立一个简单明了,标准化的数据结构。同时为基于模型驱动 (Model Driven Architecture,MDA) 的设计方法提供一个简化的数据结构,更加容易根据数据结构自动生成代码。
本文采用 InfoSphere Data Architect 作为工具支持,主要针对需要持久化的业务对象(Business Object,BO))进行实体对象(Entity Object 或者称持久化对象 Persistant Object,PO)的逻辑数据模型 (Logical Data Model) 设计。本文中业务对象设计不再详细论述,假设是已经做了业务对象分析,然后基于业务对象模型生成实体对象模型,并根据实体对象分层模型进一步完善业务对象模型。
面向对象(OO)
面向对象方法 (Object-Oriented Method,OO 方法 ) 是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。面向对象包含面向对象的分析(Object Oriented Analysis,OOA),面向对象的设计(Object Oriented Design,OOD)、面向对象的编程实现(Object Oriented Programming,OOP)等,面向对象的分析(OOA)方法是本模型的基本方法。面向对象的方法,当前有成熟的基于 UML(Unified Modeling Language)建模方法论,本文不再详述。
范式理论(NF)
第一范式(1NF)无重复的列,实体中的属性不能有多个值或者不能有重复的属性。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分,不能存在仅依赖主关键字一部分的属性。 第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。在本模型中,如果出现重复的属性,就需要增加一个实体对象,并根据新增对象和原对象的主键关系确定其对象关系。从性能角度考虑,在数据表中增加了冗余外键对应关系,即并非完全满足 3NF 的要求。
维度建模(DM)
维度建模(Dimensional Modeling,DM)是数据仓库建设中的一种数据建模方法。按照事实表,维表来构建数据仓库,数据集市。在本模型中,对象汇总关系部分采用了维度建模的思想,但是没有深入的探讨维度建模方法论,关于维度建模可以参考相关的资料。
模型驱动架构(MDA)
模型驱动架构 (Model Driven Architecture,MDA) 是由 OMG 定义的一个软件开发框架。它是一种基于 UML 以及其他工业标准的框架,支持软件设计和模型的可视化、存储和交换。和 UML 相比,MDA 能够创建出机器可读和高度抽象的模型,这些模型独立于实现技术,以标准化的方式储存。本模型的第二个目标就是为建立更高效率的自动生成代码提供一个数据基础。。
IBM InfoSphere Data Architect
IBM InfoSphere Data Architect(以下简称 IDA) 是一种协作式的数据设计解决方案,能用于发现、建模、关联和标准化各异的分布式数据资产。如图 1 所示,是实体对象分层模型最终完成之后的界面,IDA 能够很好的支持分层的建模,可以到 IBM 网站下载 IDA 试用版。
图 1. InfoSphere Data Architect 界面
示例模型说明
为了更好的描述对象模型 , 将以销售管理系统为例进行介绍 , 包含系统管理和销售管理两个部分 , 销售管理主要实现货物的采购和销售管理,包含组织机构、人员、仓库、商品批号、供应商、客户;销售订单、采购订单、出入库单等业务单据。其整体模型如图 2 所示:
以下以面向对象设计为基础,按照三范式建模方式,采用 IDA 7 工具,从最简单的实体对象对象模型入手,逐步细化模型,其基本框架模型下找出所有对象之间的关系,并模式化。
业务对象(BO)包含复杂的逻辑关系,通过对业务对象及实体对象之间的关系的分析,将对象的关系简化为对象基本关系、对象变更关系、对象汇总关系、类别对象关系等,针对对象数据不确定的对象,建立属性不确定对象关系。除了对象之间的关系外,本模型增加了一个附加对象层,包含树装结构、时间结构等,用于处理一个特殊的业务需求。
在本模型中,实体对象基本关系是核心,确定了基本关系,也就把数据库的整体框架搭建起来了,其他模型可以看作仅仅是一个范式,在设计数据库的时候选择一个范式即可。本文虽然是以实体对象进行建模,但是其和业务对象是对应的,所以其关系模型也适应于业务对象。
根据实体对象之间的关系,将实体对象分成标准元实体对象、元实体对象和关联实体对象三类。这三类实体对象构成了实体对象关系的基本框架。如图 3 所示:
除了以上基本关系之外,还有一些特殊的实体对象关系,包含附属关联实体对象、主从关联实体对象等
除了基本的关联关系之外,对象和对象之间还有外键关系,外键关系不象关联关系那样是主键关系,外键关系是外键关联。如图 4 所示:
在本模型中,比较一个关键的一点是要尽量多的建立元实体对象,特别是标准元实体对象,尽量减少关联实体对象。比如订单,是元实体对象不是关联实体对象,即客户和订单的关系不是主键关系而是外键关系。外键有多种,如一对一、一对多关系等,详见 IDA 中的设置。一个简单的原则可以来判断,如果关联实体对象除了关联的实体对象的主键之外还需要一个独立的主键,就应该考虑看作是一个元实体对象(附属关联实体对象除外)。
对象基本关系模型构成了对象关系模型的主要框架,除此之外,还有一些其他的关系模型,包括对象变更模型、对象汇总模型、类别对象关系模型、附加对象关系模型、不定属性对象关系模型。对于设计者来说,需要关注的仅仅是基本关系模型,其他模型的设计可以看作是固化了的设计范式,只需要设定范式即可。
实体对象实例在业务活动过程中不断发生变化,根据业务的需要,需要记录实体对象实例的变化信息(不同于流水元实体对象,是多个对象实例,比如订单,随着业务的变化,订单不断增加)。包括对象属性变更、对象整体变更、对象快照等。另外从业务上考虑,为了实现操作痕迹化,需要对操作过程进行记录。如图 5 所示
实体对象发生连续变化之后,需要对变化信息的汇总成为汇总对象,包含汇总和计数,和实体对象的关系为对象汇总关系,包括按照年、月、日、周、季等汇总,分别形成年、月、日、周、季的汇总表。根据汇总对象和原始对象之间的关系,可以分成简单汇总关系和分组汇总关系,后者根据原始对象的外键关系进行分组汇总。分组汇总关系又可以分成历史分组汇总和当前分组汇总。汇总对象属性可能来源于多个原始实体对象,为了统一模式可以先分别汇总,然后再进行合并。如图 6 所示:
由于汇总对象是对应的实体对象的按照年、月、日的汇总,因此其主键为原实体对象加年 ID、月 ID 或日 ID。是和日期对象的一种特殊的关联实体对象。
汇总对象更多的承担着报表查询的功能,为了提高查询性能,可以在汇总对象增加额外的外键对应关系甚至把属性进行冗余存储。(汇总对象建模需要参考星形建模,详见关于数据仓库建模)
为了减少存储空间和便于统计,将主实体对象(包含元实体对象和关联实体对象)的属性进行分类管理,以编码替代文字描述,成为类别对象,类别对象和主实体对象的关系式外键关联关系。如图 7 所示:
由于是对象合并的,所以合并之后的对象需要增加一个主键,作为标识。需要注意的是对象基本关系模型中涉及的标准元实体对象、元实体对象和关联实体对象,除了前两者有一个独立的主键之外,关联实体对象,除了附属关联实体对象外一般都是对应着一组关联对象的主键,关联对象一般没有自己的主键(附属关联对象比较特殊)
附加对象一般不是一个独立的对象,需要附加于其他对象,但是其具有本身的一些特点,包含树、图、修改日志等附加对象。如图 9 所示:
树附加对象,根据实体对象是否可以有多个树,可以将树附加对象分成独立树对象和内嵌树附加对象
由于有些对象的属性是不确定的,可以动态增加或者所有对象的属性很多,但是具体到一个对象,其属性有只是很少的几个,属于不定属性对象,为了进行持久化,将对象的属性按照行进行存放。如图 10 所示:
不定属性实体对象属性多变,没有固定的属性,需要灵活处理每个对象的属性,典型的如考核指标,不同的部门、不同的公司指标的差异非常大,因此需要按照每个指标的类别,在行上进行存储。一般来说,指标本身是一种树,指标本身有关联。
不定属性对象其特点和一般的实体对象一样,其特殊之处在于其属性是变化的,对象实例化的时候,对象是存储是在行上存储的。
如果属性数量是明确的,但是不同类别实体对象具有的属性不同,可以通过继承或者关联关系建立附属关联关系。比如商品信息,分别建立消费品商品信息、电器商品信息等,用与分别记录其不同的信息。
如果属性相对来说是稳定的,但是存在变化的可能,则需要考虑实体对象属性动态增加的模式。比如工资条,存在着工资条内容的增减,因此需要特殊考虑。
本模型以面向对象的分析为基本方法,首先找出业务对象(BO),然后基于范式理论把业务对象转化成实体对象(PO),并进行分类分层管理,根据主键的特点,设置实体对象的基本层级,最终建立实体对象分层模型。
在《 SOA 和 DW 》中提到了关于共享库的概念,共享库是为所有厂商提供一个标准数据来源的共享库,是企业级的数据库,由多个厂家共同建设和使用,包含元数据、主数据、用户数据、业务数据等,因此需要共享库数据结构清晰明确,并建立统一的建模标准,因此可以采用本模型进行数据库建设,建立企业级的清晰、规范的数据库模型。《表 1 按照分层模型对数据库表进行分类》。
| 模型 | 对象关系 | 备注 |
|---|---|---|
| 对象基本关系模型 | 标准元实体对象 | 标准元实体对象一般对应着主数据 |
| 元实体对象 | 业务系统的核心实体对象,包含基础元实体对象和流水元实体对象两种 | |
| 关联实体对象 | 基于元实体对象的关联关系 | |
| 附属关联实体对象 | 特殊的关联实体对象 | |
| 主从关联实体对象 | 特殊的关联实体对象 | |
| 对象变更关系 | 实体对象属性变更 | 仅记录某个属性变化信息 |
| 实体对象整体变更 | 记录对象整体变化信息 | |
| 实体对象快照 | 记录所有对象的当时信息 | |
| 实体对象操作痕迹化管理 | 记录操作者对实体对象的变更信息 | |
| 对象汇总模型 | 简单汇总关系 | 包含日、月、年、周、季等,原始对象的简单汇总 |
| 历史分组汇总 | 原始对象的分组汇总,记录当时历史状况,记录是不可以修改的 | |
| 当前分组汇总 | 按照当前分类情况,重新的汇总 | |
| 类别对象关系模型 | 全局类别对象 | 整个系统全部统一 |
| 附属类别对象 | 隶属于元实体对象的类别,不同的元实体对象类别不同 | |
| 合并的类别对象 | 对于简单的分类编码,可以汇总为一个实体对象,统一管理所有的分类实体对象 | |
| 附加对象关系模型 | 唯一独立树对象 | 可以有多个树,树的节点实体对象不可以重复 |
| 复合独立树对象 | 可以有多个树,树的节点实体对象可以重复 | |
| 内嵌树附加对象 | 实体对象和树附加对象一一对应 | |
| 网对象 | 特殊的一种树附加对象,树节点的父节点可以有多个 | |
| 其他附加对象属性 | ID、操作痕迹化记录等 | |
| 不定属性对象关系模型 | 包含以上所有对象关系 | 和前面对象的差异在于其属性由列存储变为行存储 |
采用本模型,设计者需要关注的仅仅是对象基本关系,即元实体对象和关联实体对象,如表 2 所描述,从而简化了数据结构,统一了数据库设计风格。
| 元实体对象(包含是否标准实体对象信息) | 关联实体对象(关联的元实体对象以及关联类别) | 外键关系(包含实体对象、类别对象) | 其他(汇总、变更、附属、不定属性等) |
|---|---|---|---|
| XX 元实体对象 | XXX 关联实体对象 | XXX 实体对象 | |
| XXXXX 实体对象 | |||
| YY 元实体对象 | YY 关联实体对象 | YYY 实体对象 | |
| YYYY 实体对象 |
对象基本关系模型确定之后,其他关系可以通过设定已有的模型自动生成,只需要在设计的时候设定其他模型类别即可,比如根据实体对象的变更记录设置,自动生成变更表;根据设定的对象汇总关系可以自动生成汇总表;根据类别对象关系,自动对应类别对象;根据设定的附加对象自动生成树等结构;根据不定属性对象关系自动生成不定属性表等。相关信息可以参考元对象设施(Meta-Object Facility,MOF)的概念,即可以实现 MOF 的 M1 层模式化设计,本文不再详细探讨。
实体对象按照分层模型建立之后,在 IDA 中设置词汇表(Glossary),IDA 可以自动生成各种主流数据库的数据结构,同时分层模型建立了实体对象之间的关系,根据实体对象分层模型,进一步完善业务对象(BO)模型,可以设置更多的自动生成代码模板,提高代码生成效率。比如:
基本的数据操作层面的代码可以全部自动生成,如简单的增删改查、以自动完成删除订单,然后自动删除订单项等关联关系。关于更多的 MDA 的实现,将在本文的续篇进一步探讨。
本文以面向对象设计方法和三范式为基础,提出了分层的实体对象模型,建立了一个标准化的数据库关系模型。遵循这个标准,可以建立更加清晰易懂的数据结构,为建立企业级的共享库打下基础,同时本模型能为更有效的自动生成代码提供基础。
本模型的适用范围和不足:
原文链接:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-1007xiaojg/index.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15082138/viewspace-671075/ ,如需转载,请注明出处,否则将追究法律责任。