O/R Mapping中对象关系映射解决方案汇总

对于一个ORM方案时,为了提供用户对具体映射方案的细颗粒度的控制的可能,特别对于企业级应用,应该是用户选择是否使用该产品比较重要的因素之一,需要尽可能多的实现各种可选的常用映射方案,本文的目的就是对O/R Mapping中对象关系映射方面的解决方案作一个汇总,当设计或评价一个ORM方案的时候,也可以相应的以此作为参考。

1、  继承

说明:

对于比较完善的继承关系一般会有如下共有特点:首先,只允许一个非接口类型的父类(虽然有的程序语言支持从多个这样的父类继承,但一般不被推荐),同时允许多个接口类型的父类;其次,父类有可能为抽象类(即不能实例化,而只能被继承)。

方案:

一般,既然接口或抽象类不能被实例化,自然也不需持久化,因此,映射中只需考虑能够实例化,也即能够持久化的实体类,对于这些实体类,具体的常用映射方案有三:

1)  每个继承体系用一张表存储,该表包含整个继承体系中所有类的属性集合,并且每行包含一个额外的、用以识别该行代表的被持久化的实体类类型的列;

2)  每个实体类映射到一张表,并且,每个子类对应的表重复包含其所有层级的父类的属性,属于一个继承体系中的每张表包含相同的主键值以表示同一实例,并且此时,你有两种选择:一、当向子类对应的表插入一条记录的同时,需要向其所有层级的父类插入记录,以维持该继承语意,这样当取子类数据时,不需链接其父类对应的表,二、当向子类对应的表插入一条记录的同时,不向其所有层级的父类插入记录,但是,在取一个类的数据时,需要链接其所有的子类对应的表,以取得所有语意上属于该类型的数据,一般,对于可以选择用一个专用的继承关系查询表来存储所有的继承关系;

3)  每个实体类映射到一张表,但是,每个子类对应的表不重复包含其所有层级的父类的属性,而是,只保证属于一个继承体系中的每张表包含相同的主键值以表示同一实例,这时,子类的主键,同时也是对应到其父类的表的外键,当需要取得子类数据时,需要链接其所有层级的父类对应的表,好处是可以减少方案二中的数据或表结构的冗余,但是,此时,需要在取子类数据时链接子类的所有父类对应的表,一般,可以选择用一个专用的继承关系查询表来存储所有的继承关系。

2、  一对一关联、一对多关联(包含一对一和一对多的自关联)

说明:

所谓一对一关联,实际上还可以分为三种情形,即0..1 - 11 – 11 – 0..1三种情形;而一对多关联则分为* - 11 - *

方案:

一对一或一对多关联的实现一般比较简单,以下三种方案中第一种为最常用的映射方案,二、三、四则是两种在某些数据较简单的情形下可参考的方案:

1)  最常用的方案为为需要其他对象引用的类对应的表增加一个到被引用对象对应表的外键即可,只不过,与表对应的实体类代码中,对于一对多情形下的“多”这一端,需定义成集合类型;

2)  第二种是在Hibernate提出的所谓“组件(Component)映射”,举例来说,假如Person类包含一个Address成员类型的属性,而AddressCityStreetZipCode三个成员属性组成,假如Address除了与Person关联不被其他对象使用,则我们可以考虑只用一张数据表Person来持久化PersonAddress这两张表,Person数据表包含Person类中除Address的属性和Address类中的所有属性的集合,当然,这时需要在元数据中特别指明映射关系;

3)  还有一种针对上面的方案中的PersonAddress两个类的持久化方案则是将Address类型的所有属性先序列化,再存入Person表的字段Address中,这样也可以只用一张表来持久化两个类,当然,本方案中这种被序列化对象成员数据量应尽量小;

4) 在Hibernate中还提到了一种共享同一主键值的一对一关联。实际上,这种映射方实感觉只用于一种比较特殊的情形,就是,将原本可以同属于一个表中相对使用不太频繁的字段提出来放在另一张表中,这样,这两张表的记录就可以通过一个相同的主键进行关联,更多说明见Hibernate的文档。

3、  多对多关联(包含多对多的自关联)

说明:

所谓多对多关联自然就是* - *这种情形了。

方案:

对于多对多关联的实现一般有两种可选方案:

1)  类似一对多情形中的最常用方案,为关联的双方增加到对方的外键,该方案的好处是取数据时不需链接操作,只要读一张表就行,操作比较简单,缺点是会造成数据冗余;

2)  新增一张包含关联双方主键的关联表,这时,在取数据时,需要链接该关联表和数据表,优点是没有数据冗余,缺点是带来了一定的时限复杂度。

//文章结束

posted @ 2005-07-21 13:42  Teddy's Knowledge Base  Views(11237)  Comments(25Edit  收藏  举报