ORM基础——数据模型与持久化

数据模型是对现实世界中各种事物或实体特征的数字化模拟和抽象,用以表示现实世界中实体之间的相互关系,并将之存放到数据库中。数据库综合了用以描述实体信息的相关数据,其不仅反映了数据本身的内容,而且反映了数据之间的相互联系。数据模型是严格定义的一组概念的集合。这些概念准确描述了系统的静态属性、动态特征和完整性约束条件。静态属性包括数据结构和对数据的约束;动态特征包括对静态属性数据的操作方法,通常每个类的操作方法是在对象模型中明确定义的。因此数据模型通常由数据结构、数据操作、数据完整性三要素组成[1]

从分类角度看,数据模型主要分为两类:语义数据模型和结构化数据模型。语义数据模型指的是面向对象数据模型、实体联系模型等;结构化数据模型则有层次数据模型、网状数据模型和关系数据模型等。因此随之发展的数据库模型也分为层次模型、网状模型、关系模型和面向对象模型四类。

一、关系模型

关系模型作为结构化数据模型的一种,只有单一的数据结构,即关系。关系的表达形式是二维表,表和关系在关系数据库系统中是同义词。现实世界中实体和实体间的各种联系均以关系的形式来表示,并以二维表的形式排列数据。针对关系中存储的数据,可以用简单的程序实现各类操作。因此关系模型在如今的数据库实现中起到了很大的作用。

相对于层次模型与网状模型而言,关系数据库的优点在于:关系模型建立在严格的数学模型基础之上;关系模型表达方式单一。无论是实体还是实体之间的联系都用关系表示,对数据的检索结果也是关系,所以其数据结构简单清晰,用户易懂易用;关系模型的存取路径对用户透明,从而具有更高的数据独立性和更好的安全保密性。

关系模型的数学定义

定义1:域(Domain)。域是一组具有相同数据类型的值的集合。例如:整数,字符串等都可以是域。在关系模型中,要求每个元组的属性都属于某种基本类型,并把与关系的每个属性相对应的特定基本类型称为域。

(这部分因无法粘贴公式,所以直接贴图)

关系具有以下基本的性质:

1) 列是同质的,即每一列中的分量是同一类型的数据,来自同一个域;

2) 不同的列名可以出自相同的域,称其中每一列为一个属性,不同属性必须有不同的属性名;

3) 对同一组域,域的次序对关系没有影响,即关系中列的次序可以交换;

4) 关系中的任意两个元组不能完全相同;

5) 关系中元组的顺序无关,即关系中元组的顺序可以交换;

6) 分量必须取原子值,即每一分量都必须是不可再分的数据项;

关系模型的三要素

关系模型是结构化数据模型的一种,应具备关系数据结构,关系操作和关系完整性约束三个组成要素。

1) 关系数据结构

关系数据模型是由若干关系所组成的集合。从结构上看,每个关系实际上是一张二维表,表中的每一行表示一个实体对象,每一列对应一个实体属性。称这样的一张表结构为一个关系模式,称表中的内容为一个关系。

关系数据模型中,实体类型用关系表表示;实体类型之间的联系可以用关系表表示,也可以用属性来表示。关系是一种规范化的二维表。关系中的每个属性值一定是不可再分的数据项。关系数据库是大量二维关系表所组成的集合,每个关系表中是大量记录(元组)的集合,每个记录包含着若干属性。关系中的记录是没有重值且无序的。

二维表是关系模型的数据结构,关系模型把所有的数据都集合到表中,对表结构中的常用术语做出如下说明:

元组(Tuple):表中的一行为一个元组。一个元组可表示一个实体或实体之间的联系;

属性(Attribute):表中的一列为一个属性,即元组的一个数据项。属性的名称称为属性名,属性名在一个关系表中是唯一的。属性的取值范围称为属性域,在关系数据模型中,每个属性都有一个域;

分量:元组中的一个属性值;

主码(Key):或关键字。表中的一个或几个属性的组合,其值能唯一标识表中一个元组的称为关系的主码或关键字;

外部关键字(Foreign Key):一个关系中含有的与另一个关系的关键字相对应的属性组称为该关系的外部关键字;

关系模式

2) 关系操作

关系模型具备了对关系进行操作的能力。关系操作能力通常用代数方式和逻辑方式表示,分别称为关系代数和关系演算。

关系代数是关系数据操纵语言的一种传统表达方式,它用关系的运算来表达查询的要求。关系代数也是关系理论及SQL语言的基础,它的运算可分为两类,即传统的集合运算和专门的关系运算,两者在功能上是等价的:

传统的集合运算。包括并(Union)、交(Intersection)、差(Difference)、广义笛卡儿积(Extended Cartesian Product)等。集合运算把关系看作元组的集合,从水平(行)方向进行运算,广义笛卡儿积是把两个关系的元组以所有可能的方式组成对。

专门的关系运算。包括选择(Select)、投影(Project)、联结(Join)、除(Divide)等。该类运算从行和列的方向进行运算。“选择”会删除某些行;“投影”会删除某些列;各种联结运算是从两个关系的元组中有选择的组成对,构成一个新的关系。

关系演算是用谓词来表达查询要求的方式,包括查询(Query)、更新(Update)和删除(Delete)等操作。

3) 关系完整性约束

实体完整性。关系数据库模式可由实体-关系模式导出,实体完整性是关系完整性的主要约束之一。实体完整性是指表中行的完整性,要求表中的所有行都有唯一的标识符,即主关键字。实体完整性规则规定基本关系的所有主关键字对应的主属性都不能取空值。例如,学生选课的数据库表(学号,课程号,成绩,…)中,主关键字由学号和课程号共同组成,则学号和课程号两个属性都不能为空,表明没有学号的成绩或没有课程号的成绩都不允许存在。主关键字是否可以修改,或整个列是否可以被删除,取决于主关键字与其它表之间的完整性约束。

域完整性。域完整性是指列的值域的完整性,如数据类型、数据格式、值域范围、是否允许空值等。域完整性限制了某些属性的取值范围,把属性值限制在一个有限的集合中。

引用完整性。关系模型中,用关系来描述现实世界中实体与实体之间的联系,这样就存在关系与关系之间的引用。引用完整性是指被引用表中的主关键字和引用表中的外部主关键字之间的关系。引入外关键字定义:

设FK是基本关系R的一个或一组属性,但不一定是关系R的主关键字。 如果FK与基本关系S的主关键字相对应,则称FK是基本关系R的外关键字,并称基本关系R为引用关系,基本关系S为被引用关系。

引用完整性定义了外关键字与主关键字之间的引用规则,即如果要删除被引用的对象,那么也要删除引用了它的所有对象,或者把引用值设置为空(如果允许的话)。

图1 关系的完整性约束

由上图1所示,实体完整性是对应元组或行而言、域完整性是对应属性或列而言、引用完整性是对不同表之间的属性或列的引用关系而言。

用户定义完整性。根据应用环境的不同,关系数据库系统往往需要一些特殊的约束条件来反应在某一具体应用中涉及的数据必须满足的语义要求。用户定义的完整性是针对某一具体应用领域,对关系数据库提出的约束条件。例如,目前操作系统的类型取值只能是:批处理操作系统、分时操作系统、实时操作系统、网络操作系统和分布式操作系统中的一类。

关系模型提供了定义和检验这些完整性约束的机制,以便用统一的系统方法来处理它们,而不必用复杂的应用程序加以处理。

关系数据库模型

关系数据库模式是所有关系模式之间具体关系的集合,它是数据模型的表示,而关系数据库则是数据的值的表示。

④ 关系数据库模式

外部层、概念层和内部层构成了关系数据库系统的三层模式结构,三层模式是数据库管理系统基本的结构特征。

图2 关系数据库三层模式结构

1)三层模式

外模式又称用户模式。外模式即可以根据用户视图对数据进行定义,也可以从概念模式中导出。

概念模式又称逻辑模式。概念模式是现实世界和数据存储之间的扭带,是为了实现数据库数据的共享,在对数据库进行设计之后得到的全局性数据逻辑关系的抽象和描述。它独立于数据的物理存储结构,是所有用户共同的逻辑数据视图。

内模式又称物理模式。用以描述数据在数据库中的存储和存取方式。

外模式与具体的应用程序和每个应用程序使用的高级编程语言相关联。概念模式独立于具体应用和物理环境,是数据库中全体数据的逻辑表示。内模式与数据的物理存储(操作系统)和硬件有关。

2)两层映射

为了实现数据从抽象概念到物理存储的转换,关系数据库的三层结构模式提供了两层映射功能,分别是外模式和概念模式之间的映射以及概念模式和内部模式之间的映射。

外模式和概念模式之间映射的作用在于实现逻辑数据的独立性。当数据的整体逻辑结构改变时,只需调整相应的外模式和概念模式之间的映射即可,外模式和外模式对应的应用程序都不需要改变。从系统对象的角度看,这一映射过程也是将对象从现实的领域模型中抽象出来,根据用户需求对应到具体系统行为逻辑的过程。

概念模式和内部模式之间映射的作用在于实现物理数据的独立性。当数据库的物理存储结构或模式改变时,只需调整相应的概念模式和内模式之间的映射关系即可,概念模式和应用程序均不需要改变。从对象-关系(O-R)的角度看,持久层映射功能等同于关系数据库模式中的这一映射,即当底层数据库表结构或存储模式发生改变时,只要对持久层的构造做出相应改变,领域模型和应用程序均不需要调整。

⑤ 关系数据库

关系数据库的功能实现是基于结构化查询语言(SQL,Structured Query Language)的标准之上。SQL的实际功能包括数据定义、数据操纵和数据控制。它是一种表示方式,操作者用其来描述要查询的结果特性,至于如何查询、以及查询结果的表达形式都由DBMS(数据库管理系统)来完成。

1) 基本功能

查询和数据更新是关系数据库提供的最为常用和基本的功能。查询的操作类型分为:简单查询、多表连接查询、嵌套查询和联合查询;数据更新主要通过插入语句(Insert)、更新语句(Update)和删除语句(Delete)来实现。

2) 基本技术

视图:被存储的查询定义,其属性名由子查询确定。视图是一个基于查询的逻辑表,视图本身并不存储数据,因此视图的数据在物理上不存在。视图可以表示来自不同来源的数据,对应用程序来说,视图相当于一个表,数据可以从视图中查得,而且在权限许可的情况下,还可以通过视图来插入、更改和删除基本表中的数据。

游标:系统为用户开辟的数据缓冲区,用于存放 SQL 的查询结果。当查询结果为一组记录时,不能把提取的元组集合直接传递到应用程序中,必须先放到某种缓冲存储空间,称为使用游标(Cursor)。

检索:根据指定的数据库表列建立起来的顺序。检索提供了快速访问数据的途径,并且可以监督表的数据,使索引指向的列中的数据不重复。

触发器:用户定义的一个 SQL 事务命令的集合。当设立的一些条件被满足时,如到达了一定的时间点等,这组命令就会自动执行。

存储过程:存放在服务器上、预先定义与编译好的 SQL 语句的命名集合,是一个独立的数据库对象。存储过程在第一次执行时进行语法检查和编译,编译好的版本存储在过程高速缓存中用于后续调用,执行速度快。存储过程可由应用程序多次激活,提高了重复任务的执行性能。

二、对象模型

面向对象方法起源于面向对象编程,面向对象程序则是由对象组成的。对象是一个真实或抽象的类的实例,对象包括了描述对象的属性数据和操作处理对象属性数据的方法。面向对象方法是程序开发者面对问题模型时,对问题模型中的各个组件分别识别为真实或抽象的对象,并细化各个对象之间的关系,对象与对象之间依靠消息进行沟通。

对象模型中的相关概念

对象模型是采用面向对象方法所建立的待解决问题的模型,用多个对象来描述待解决的问题。建立对象模型的作用在于抽取存在于问题域中的各种对象实体,分析、明确这些对象实体的静、动态操作属性和它们之间的相互关系,从而反映出由多个对象组成的系统整体功能和状态。对象模型的构成包含了下述基本概念:

1) 对象(Object)

对象是对某个事物的抽象描述;是具有唯一对象名和固定对外接口,并对其属性的数据和定义加以描述的一组操作构成的实体。

其中,对象名(即对象标识符,Object Identifier, OID)是一个对象区别于其它对象的标志;对外接口是对象在约定好的运行框架和消息传递机制中与外界通信的通道;对象的属性表示了对象所处的状态;对象的操作表示对象的行为。对象最主要的特点是以数据为中心,它是集成了数据和相应操作的逻辑单位。

对象的主要属性是状态和行为。对象的状态又称为对象的静态属性,主要指对象内部所包含的各种信息,即变量。每个对象个体都具有自己专有的内部变量,这些变量的值表明了对象所处的状态。对象的行为又称为对象的操作,它主要描述了对象的动态属性,操作的作用是设置或者改变对象的状态。

2) 类(Class)及类与对象间的关系

类是对象集合的软件抽象,也是创建对象的模板,即从一个类中实例化出的每个对象都具有相同的属性和行为。因此对象就是符合某一特定类的定义,并由该类所产生出来的实例,可以看得到、听得到,而类仅是一个抽象的概念。

对象和类是面向对象模型中最基本的概念,其灵活性足以支持丰富的语义表达和复杂的数据模型。

类之间的关系

复杂的应用系统必然包含了多个类,而在类和类之间存在着五种可能的关系,即泛化关系(Generalization)、关联关系(Association)、聚合关系(Aggregation)、合成关系(Composition)、依赖关系(Dependency)。

1) 泛化关系

泛化关系可以是类与类之间的继承关系、接口与接口之间的继承关系以及类对接口的实现关系。

继承关系。继承指一个类(子类)继承另外一个类(基类/父类)的行为(操作方法等)和状态(属性),并增加自己的新行为和状态。一个类仅从一个类中继承称为单一继承;当类从两个以上的类中继承时称为多重继承。继承的主要意义不仅在于代码复用,而且在子类与基类之间引入了“as-a”的关系。

实现关系。实现关系用接口将一个类与另一个类连接起来,接口是行为的说明而不是实现,而被连接的类必须实现接口的所有操作(通过继承或者直接声明)。

2) 关联关系

关联关系是类与类之间的联结,它使一个类知道另一个类的属性和方法,是类与类之间最弱的一种关系。关联关系所涉及的两个类在概念上位于相同的层次,是平等关系。关联可以是双向的也可以是单向的。在面向对象模型中,关联关系通常是使用实例变量实现的。

3) 聚合关系

聚合是关联的一种,是强关联关系,其表达的是整体和个体之间的关系。聚合关系所涉及到的类处于不同的层次,它们之间是“整体-部分”的关系。与关联一样,聚合也是通过实例变量实现的。

4) 合成关系

合成是更强类型的聚合。合成关系中代表整体的对象负责代表部分对象的生命周期。在合成关系中,一个部分对象仅属于一个整体对象,并且部分对象通常与整体对象共存亡。

5) 依赖关系

依赖关系是单向的,描述了两个类之间的使用关系。存在两个独立的类,当其中的一个类负责构造另一个类的实例,或者依赖另一个类的方法时,两者存在依赖关系。如有零件类A和生产零件的机器类B,则有A依赖于B,B的改变会影响A。与关联不同的是,B不能出现在A的实例变量中。在对象模型中,依赖关系一般体现为引用B的局部变量、在方法的参数里传入B的实例、或调用类B的静态方法等。

三、持久化的概念

持久化(Persistence),就是把内存中的数据模型保存到可永久保存的外部存储设备中(通常是磁盘)。数据持久化通常将内存中的数据模型保存到关系型数据库中、XML文件、二进制文件等。持久数据有时需要被读入内存以供使用或修改,但它最终仍被输出到外部数据存储设备中加以长期存储。在面向对象的程序中,数据是以对象的形式存放在内存中的,如果对象的生存期超过应用程序的运行期就说明对象具有持久性。对象持久化技术的主要目标是使对象具有持久化属性,进而更方便地存储和管理持久对象(Persistent Object)。

狭义的“持久化”仅指把数据保存到数据库中;广义的“持久化”包括对数据库相关的各种操作:

1)保存:在数据库中一直保存对象。

2)更新:更新数据库中对象的状态。

3)删除:从数据库中删除一个对象。

4)加载:从数据库加载对象数据到内存中。

5)查询:根据特定的查询条件,把符合查询条件的一个或者多个对象从数据库加载到内存中。

四、持久化层

在大型的应用系统中,系统通常按照一定的逻辑划分为不同的层次结构,这样可使得系统的结构更加的清晰,更易于扩展和维护。在一般的系统开发中多采用三层体系结构,分别为表现层、业务逻辑层和数据层。在这种结构下,业务逻辑层既要处理业务逻辑,又要对数据的存储进行管理,导致系统的业务逻辑与数据存储耦合性太强,降低了系统的灵活性和适应性。为降低这种耦合性,将与数据存储打交道的数据访问部分分离出来,单独作为一个数据持久化层。

如下图3所示,持久化层从业务逻辑层中分离出来,将与持久化相关的类或组件组织在一起专门负责实现数据持久化的操作。

图3 多层体系架构中的持久化层

 

[1] 张彦歆. 基于.NET平台ORM技术的研究与应用[D].上海交通大学,2009.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值