O/R Mapping中对象关系映射解决方案汇总
来源:互联网 发布:梧桐叶落天下知秋 出自 编辑:程序博客网 时间:2024/04/28 02:56
1、 继承
说明:
对于比较完善的继承关系一般会有如下共有特点:首先,只允许一个非接口类型的父类(虽然有的程序语言支持从多个这样的父类继承,但一般不被推荐),同时允许多个接口类型的父类;其次,父类有可能为抽象类(即不能实例化,而只能被继承)。
方案:
一般,既然接口或抽象类不能被实例化,自然也不需持久化,因此,映射中只需考虑能够实例化,也即能够持久化的实体类,对于这些实体类,具体的常用映射方案有三:
1) 每个继承体系用一张表存储,该表包含整个继承体系中所有类的属性集合,并且每行包含一个额外的、用以识别该行代表的被持久化的实体类类型的列;
2) 每个实体类映射到一张表,并且,每个子类对应的表重复包含其所有层级的父类的属性,属于一个继承体系中的每张表包含相同的主键值以表示同一实例,并且此时,你有两种选择:一、当向子类对应的表插入一条记录的同时,需要向其所有层级的父类插入记录,以维持该继承语意,这样当取子类数据时,不需链接其父类对应的表,二、当向子类对应的表插入一条记录的同时,不向其所有层级的父类插入记录,但是,在取一个类的数据时,需要链接其所有的子类对应的表,以取得所有语意上属于该类型的数据,一般,对于可以选择用一个专用的继承关系查询表来存储所有的继承关系;
3) 每个实体类映射到一张表,但是,每个子类对应的表不重复包含其所有层级的父类的属性,而是,只保证属于一个继承体系中的每张表包含相同的主键值以表示同一实例,这时,子类的主键,同时也是对应到其父类的表的外键,当需要取得子类数据时,需要链接其所有层级的父类对应的表,好处是可以减少方案二中的数据或表结构的冗余,但是,此时,需要在取子类数据时链接子类的所有父类对应的表,一般,可以选择用一个专用的继承关系查询表来存储所有的继承关系。
2、 一对一关联、一对多关联(包含一对一和一对多的自关联)
说明:
所谓一对一关联,实际上还可以分为三种情形,即0..1 - 1,1 – 1,1 – 0..1三种情形;而一对多关联则分为* - 1和1 - *。
方案:
一对一或一对多关联的实现一般比较简单,以下三种方案中第一种为最常用的映射方案,二、三、四则是两种在某些数据较简单的情形下可参考的方案:
1) 最常用的方案为为需要其他对象引用的类对应的表增加一个到被引用对象对应表的外键即可,只不过,与表对应的实体类代码中,对于一对多情形下的“多”这一端,需定义成集合类型;
2) 第二种是在Hibernate提出的所谓“组件(Component)映射”,举例来说,假如Person类包含一个Address成员类型的属性,而Address由City,Street,ZipCode三个成员属性组成,假如Address除了与Person关联不被其他对象使用,则我们可以考虑只用一张数据表Person来持久化Person和Address这两张表,Person数据表包含Person类中除Address的属性和Address类中的所有属性的集合,当然,这时需要在元数据中特别指明映射关系;
3) 还有一种针对上面的方案中的Person,Address两个类的持久化方案则是将Address类型的所有属性先序列化,再存入Person表的字段Address中,这样也可以只用一张表来持久化两个类,当然,本方案中这种被序列化对象成员数据量应尽量小;
4) 在Hibernate中还提到了一种共享同一主键值的一对一关联。实际上,这种映射方实感觉只用于一种比较特殊的情形,就是,将原本可以同属于一个表中相对使用不太频繁的字段提出来放在另一张表中,这样,这两张表的记录就可以通过一个相同的主键进行关联,更多说明见Hibernate的文档。
3、 多对多关联(包含多对多的自关联)
说明:
所谓多对多关联自然就是* - *这种情形了。
方案:
对于多对多关联的实现一般有两种可选方案:
1) 类似一对多情形中的最常用方案,为关联的双方增加到对方的外键,该方案的好处是取数据时不需链接操作,只要读一张表就行,操作比较简单,缺点是会造成数据冗余;
2) 新增一张包含关联双方主键的关联表,这时,在取数据时,需要链接该关联表和数据表,优点是没有数据冗余,缺点是带来了一定的时限复杂度。
//文章结束
- O/R Mapping中对象关系映射解决方案汇总
- O/R Mapping中对象关系映射解决方案汇总
- O/R Mapping中对象关系映射解决方案汇总
- 对象/关系数据库映射基础(Basic O/R Mapping)
- 对象/关系数据库映射基础(Basic O/R Mapping)
- O/R Mapping 对象关系映射 (ORM) 之Hibernate
- C# 之 O/R Mapping 对象关系
- 第 6 章 对象/关系数据库映射基础(Basic O/R Mapping)
- Hibernate之 对象/关系数据库映射基础(Basic O/R Mapping)
- 【转】Hibernate之 对象/关系数据库映射基础(Basic O/R Mapping)
- Hibernate之 对象/关系数据库映射基础(Basic O/R Mapping)
- 对象/关系数据库映射基础(Basic O/R Mapping) - Hibernate reference 3.2.0 ga 正式版中文参考手册
- O/R Mapping解决方案--iBatis
- O/R Mapping解决方案--iBatis
- iBatis:O/R Mapping解决方案
- O/R 实体关系映射
- O/R 实体关系映射
- iBatis:又一个O/R Mapping解决方案
- 应用软件的层次划分
- IT软件工程师求职记,有点启发吧
- 【软件测试】软件测试的常识
- 基于消息与.Net Remoting的分布式处理架构
- Exo Platform(特点及使用)
- O/R Mapping中对象关系映射解决方案汇总
- 页面间传递变量的方法及使用范围的讨论
- subversion安装与配置备忘录linux
- 细节决定成败:数据囊的前因后果
- 在Windows上使用Subversion
- DotNet软件开发框架
- Berkeley DB中Btree、Queue、Recno记录编号的说明及应用实例
- 关于VR+GIS的一些思考
- 实例讲解Apache+tomcat+ssl配置
继承关系有三种映射方式:
l 整个类层次结构使用一个数据实体:将一个完整类层次结构映射成一个数据实体,而层次结构中所有类的所有属性都存储在这个实体中。这种方法的优点是简单,因为所需的所有数据都可以在一张表中找到,支持多态性,并且使用这种方法,专门报告(为一小组用户特定目的所执行的报告,这些用户通常自己写报告)也非常简单。缺点是每次在类层次结构的任何地方添加一个新属性时都必须将一个新属性添加到表中。这增加了类层次结构中的耦合- 如果在添加一个属性时有任何错误,除获得新属性的类的子类外,还可能影响到层次结构中的所有类。另外,此种方式数据库冗余较大,可能浪费数据库中的许多空间。
l 每个具体类使用一个数据实体:每个数据实体就既包含属性又包含它所表示的类继承的属性。这种方法最大的好处是,它仍然能相当容易地执行专门报告,只要您所需的有关单一类的所有数据都只存储在一张表中。但也有几个缺点。一个是当修改类时,必须修改它的表和它所有子类的表。第二,无论何时,只要对象更改了它的角色,则需要将数据复制到相应的表中,并为它指定一个新的OID。这又涉及到很多工作。第三,很难在支持多个角色的同时仍维护数据完整性。
l 每个类使用一个数据实体:为每个类创建一张表,它的属性是 OID 和特定于该类的属性。这种方法的最大好处就是它能够最好地适应面向对象的概念。它能够很好地支持多态性,对于对象可能有的每个角色,只需要在相应的表中保存记录。修改超类和添加新的子类也非常容易,因为您只需要修改或添加一张表。这种方法也有几个缺点。第一,数据库中有大量的表 -- 实际上每类都有一个(加上维护关系的表)。第二,使用这种技术读取和写入数据的时间比较长,因为必须访问多个表。如果通过将类层次结构中的每个表放入不同物理磁盘驱动器盘片(假设每个磁盘驱动器磁头都单独操作)上来智能地组织数据库的话,就可以缓解这个问题。第三,有关数据库的专门报告很困难,除非添加一些视图来模拟所需的表。
比较映射继承的各种办法:
考虑因素
每个层次结构一张表
每个具体类一张表
每个类一张表
专门报告
容易
中等
中等/困难
实现的难易程度
容易
中等
困难
数据访问的难易程度
容易
容易
中等/容易
耦合
非常高
高
低
数据访问速度
快
快
中等/快
对多态性的支持
中等
低
高
所以在设计的时候需要自己权衡使用某种方式。