软件设计与架构笔记(6)
数据模型与数据建模(Data Model and Data Modeling)
信息系统(Information Systems)是人类社会重要的基础应用之一,也是计算机自诞生起最重要的应用领域。在计算机信息系统中,数据(Data)作为信息的主要载体,也是沟通人与硬件系统的桥梁,其复杂性不言而喻。可以说,本文涉及的数据模型与数据建模技术的发展,始终是以弥补人机之间的鸿沟为目标的。
数据模型
在设计信息系统时,为了应对信息的复杂性,人们利用数据模型描述数据元素、元素间关系及其与真实世界实体的映射,从而达成抽象且一致的信息表示。初期的数据模型包括文件系统模型(File System Model)、层级模型(Hierarchical Model)和网络模型(Network Model)等。
文件系统模型利用计算机文件系统模拟制表(Tabulation),包含一般表格中的字段、记录等概念、且具备顺序和随机访问文件的能力,数据可按文本或二进制类型进行存储。这是一种非常简洁的数据模型,诸如csv、dsv等标准格式至今仍被广泛使用。
层级模型与文件系统模型拥有类似的字段和记录等概念,所不同的是记录之间可以按树形结构进行关联,从而表示记录之间的关系。相比较于文件系统模型,层级模型能够显式表达记录间的连接关系,并允许按照标准的树遍历算法进行数据遍历;缺点在于子记录只能拥有唯一的父记录,反过来则没有限制。发布于1966年的IBM Information Management System(IMS)就是基于层级模型构建。
网络模型旨在克服层级模型对关系限制的缺陷,允许每条记录拥有多个父记录和子记录。从数据模式(Data Schema)的描述上来看,网络模型的对象关系呈现出一个通用的网状结构,从而具有较层级模型更好的表达能力。1969年,数据系统语言委员会(CODASYL)下属的数据仓库任务小组(DBTG)发布了网络模型规范,该规范包括了一种用于定义数据模式的数据定义语言(DDL),以及能够被嵌入宿主语言的数据操纵语言(DML),首次提出了独立于宿主语言的数据语言的概念,并且通过国际标准化组织制定了多项标准。但是自诞生后,网络模型并未被工业界和学术界广泛接纳,并在此后十年的竞争中败给更具形式化能力的关系模型(Relational Model)和后续模型。
Edgar F. Codd在1970年提出了关系模型[EFC70],其包含两个主要内容:
对应于N个数据集合,使用N元关系组表达集合间的关系,使模型具备更精确的数学表达能力。
一种具有强描述能力的全局数据子语言,该语言基于结构化一阶谓词逻辑算子,能够用于表达基于关系模型的数据操作。
关系模型为设计人员提供了统一抽象的界面,很好地隐藏了数据操作与底层系统交互的实现细节。但是也存在一些不足:
根据关系模型的数学定义,集合之间的关系通过维护单独的N元关系组实现,其实质是集合间的笛卡尔积。但是通过这种形式化表示无法进一步揭示笛卡尔积的基数信息,而实践证明这种数量关系在描述数据模型时非常重要。
与问题1类似,关系模型的形式化表达缺乏一定的语义信息,无法进一步揭露关系的实质。尽管这种针对关系的语义信息不是始终必要的,但实践证明语义对数据模型的可表达能力具有重要意义。
为了解决上述问题,Peter Chen进一步发展出了实体-关系模型(ER模型),后者成为当前数据模型的重要描述工具和行业标准[PPC76]。ER模型包含四个主要概念:实体(Entity),即现实世界的实例,通常是名词形式;关系(Relationship),实体间的关联方式,通常是动词形式;类型(Type),对实体的类别定义,通常是名词形式;角色(Role),对实体在某个关系下的特殊定义,通常也是名词形式[PPC02]。
ER模型的一个重要技术是实体-关系图(ER Diagram,ER图),即用图展示前述的概念及其联系,其中方框表示实体的类型;菱形表示关系;圆圈表示实体或关系类型的属性;实体类型关系和实体属性关系上还标注了数量关系。一个典型的ER图如下图所示。
尽管本节介绍的数据模型为数据表达提供了形式化工具,但是在面对复杂系统时,设计人员不可能凭空得出系统终极的数据表示,于是数据建模就成为支撑构建数据模型的重要方法论。
数据建模
实践表明,在软件需求分析起初就需要开始构建数据模型,数据建模应关注数据的需求和实现等特定方面。一般的数据建模过程依次产生下列三种数据模型:
概念数据模型(Conceptual Data Model),从高层角度描述系统的信息需求,具体包括主要的信息概念及其相互关系。1969年,网络模型之父Charles W. Bachman提出了数据结构图(Data Structure Diagram)[CWB69],并将其用于描述概念数据模型。
逻辑数据模型(Logical Data Model),描述信息中领域的具体结构,例如表、列及其关系等。在复杂度较低时,设计人员往往可以跳过概念数据模型,从而直接得出逻辑数据模型。该模型与概念数据模型都是独立于具体的持久化技术(例如通用的数据库管理系统)。
物理数据模型(Physical Data Model),满足非功能需求的且可立即被实现的数据模型。该模型与存储技术、维护技术和更新/查询场景等因素密切相关。
数据分类
在开始构建数据模型之前,需要首先识别系统需求中的数据分类,从而确定相应的问题范围,并使用相应的数据模型进行建模。实践中存在多种逻辑思维实践以实现前期的数据分析,[DMG08]描述了一种被广泛认可的数据分类方式,把数据按照特性划分为下列六类:
主数据(Master Data),表示业务需求中出现的人物、地点、事物等信息。
事务性数据(Transactional Data),表示业务发生时伴随的内部或外部事件或事务,例如发起订单、创建发票、支付等活动。
引用数据(Reference Data),表示被系统、应用、数据存储、进程、报表乃至事务性或主数据所引用的值或分类模式的集合,例如状态码、名词简写、产品类型等静态数据。
元数据(Metadata),表示数据本身的数据,方便数据的检索、解释和使用。
历史数据(Historical Data),表示在某个时刻发生、且不可修改的数据,例如日志。
临时数据(Temporary Data),表示因为某些技术需求而被临时创建的数据,通常没有独立的业务含义。
值得一提的是,上述分类方法只应被看作一个指导性原则,具体实践时应视上下文灵活调整。在本例中,对应前面提到的三种数据模型,概念数据模型通常考虑主数据和元数据,逻辑数据模型进一步包括了事务性和引用数据,物理数据模型最终实现覆盖全部类型的数据。采用前文提到的ER模型即可对这三种数据模型分别建模。
关系范式
在构建逻辑和物理数据模型时,为了能尽可能降低关系模型中的关系表示所带来的数据冗余,从而加强数据的一致性,关系模型提出了规范化(Normalization)的概念,以对关系表示本身进行约束,并在此后一段时间相继发展出了多种范式。其中常用的范式包括:第一范式(1NF),即没有多值属性的关系;第二范式(2NF),即满足第一范式且非主属性不依赖任何候选键的子集;第三范式(3NF),即在第二范式的基础上不存在传递依赖。虽然规范化对强化数据一致性约束方面有促进作用,但其造成的后果是使许多数据表示被物理隔离,从而在实现数据操作方面引起额外耗费。因此在实际设计数据模型时,规范化设计的采用是和系统的非功能需求(Non-functional requirement)密切相关的。
结论
数据模型是信息系统设计的重要内容,在经历上世纪70年代的激烈竞争后,关系模型因占据理论高位更加受到学术界青睐,最终成就了80年代起通用关系型数据库系统的统治地位。ER模型和ER图因其更具表达能力,从而成为最重要的数据建模工具。数据模型方法领域的先驱Bachman(网络模型)、Codd(关系模型)和Chen(ER模型)也先后因其开创性贡献而获颁图灵奖。
引用
CWB69, Data Structure Diagrams
EFC70, A Relational Model of Data for Large Shared Data Banks
PPC76, The Entity-Relationship Model-Toward a Unified View of Data
PPC02, Entity-Relationship Modeling: Historical Events, Future Trends, and Lessons Learned
DMG08, Executing Data Quality Projects: Ten Steps to Quality Data and Trusted Information