对象-关系数据库之间的映射
来源:互联网 发布:做淘宝代销怎么付款 编辑:程序博客网 时间:2024/04/27 23:19
UML软件工程组织 |
对象-关系数据库之间的映射 |
Scott W. Ambler Ronin International 的总裁 2000 年 7 月 |
为什么对象-关系数据库的映射对于现代开发者是一件大事呢?一方面,对象技术(例如 Java 技术)是应用于新软件系统开发的最常见的环境。另外,关系数据库仍然是许多人都青睐的持久信息存储方法,并且在较长时间内这种情况不太会改变。请继续读下去,了解如何使用这种技术。 为什么要写有关对象-关系数据库之间的映射的文章呢?因为在对象范例和关系范例之间“阻抗不匹配”。对象范例基于软件工程的一些原理,例如耦合、聚合和封装,而关系范例则基于数学原理,特别是集合论的原理。两种不同的理论基础导致各自有不同的优缺点。而且,对象范例侧重于从包含数据和行为的对象中构建应用程序,而关系范例则主要针对数据的存储。当为访问而寻找一种合适的方法时,“阻抗不匹配”就成了主要矛盾:使用对象范例,您是通过它们的关系来访问对象,而使用关系范例,则通过复制数据来联接表中的行。这种基本的差异导致两种范例的结合并不理想,不过话说回来,本来就预料到会有一些问题。使对象-关系数据库之间的映射成功的一个秘诀就是理解这两种范例和它们的差异,然后基于这些认识来进行明智的取舍。 本文应该能够消除现今开发周期中一些普遍共有的误解,对对象-关系数据库之间映射所涉及到的一些问题提供了切合实际的看法。这些策略基于我的开发经验,项目范围从小到大,涉及金融、销售、军事、远程通信和外购等行业。我已对使用 C++、 Smalltalk、Visual Basic 和 Java 语言编写的应用程序应用了这些原则。 如何将对象映射成关系数据库 将属性映射成列 在关系数据库中实现继承 将类映射成表 整个类层次结构使用一个数据实体 这种方法的优点是简单,因为所需的所有人员数据都可以在一张表中找到,所以在人们更改角色时支持多态性,并且使用这种方法,专门报告(为一小组用户特定目的所执行的报告,这些用户通常自己写报告)也非常简单。缺点是每次在类层次结构的任何地方添加一个新属性时都必须将一个新属性添加到表中。这增加了类层次结构中的耦合 - 如果在添加一个属性时有任何错误,除获得新属性的类的子类外,还可能影响到层次结构中的所有类。它还可能浪费数据库中的许多空间。我还必须添加 每个具体类使用一个数据实体 这种方法最大的好处是,它仍然能相当容易地执行专门报告,只要您所需的有关单一类的所有数据都只存储在一张表中。但也有几个缺点。一个是当修改类时,必须修改它的表和它所有子类的表。例如,如果要向 每个类使用一个数据实体 这种方法的最大好处就是它能够最好地适应面向对象的概念。它能够很好地支持多态性,对于对象可能有的每个角色,只需要在相应的表中保存记录。修改超类和添加新的子类也非常容易,因为您只需要修改或添加一张表。这种方法也有几个缺点。第一,数据库中有大量的表 -- 实际上每类都有一个(加上维护关系的表)。第二,使用这种技术读取和写入数据的时间比较长,因为您必须访问多个表。如果通过将类层次结构中的每个表放入不同物理磁盘驱动器盘片(假设每个磁盘驱动器磁头都单独操作)上来智能地组织数据库的话,就可以缓解这个问题。第三,有关数据库的专门报告很困难,除非添加一些视图来模拟所需的表。 比较映射策略 图 6 显示了一个更新过的持久性模型,用于将整个类层次结构映射成一个数据实体。尽管很明显,数据库中的空间浪费增加了,但请注意,按照这种策略操作,只需花非常小的代价就可以更新模型。 图 7 显示了将每个具体类映射成数据实体时的持久性模型。使用这个策略,虽然因为我们从教授提升到终身教授,这样对象和我们的关系就有了改变(学生变成教授),所以如何处理对象的这个问题更复杂了,但我只需要添加一个新表。 图 8 显示了第三种映射策略的解决方案 -- 将单个类映射成单个数据实体。这需要我添加一个只包括 要摒弃这样一种观点,即这些办法都不够好;每种办法都有其优缺点。在下面的表 1 中对它们进行比较。 表 1. 比较映射继承的各种办法
映射关联、聚合和组成 关联、聚合和组合之间的差异 在图 9 中有三个类,其中两个在它们之间有简单的关联关系,有两个共享聚合关系(实际上,组合可能是这种模型中更确切的说法)。(有关关系的详细信息,请参阅参考资料中的 "Building Object Applications That Work"。)从数据库的观点看,聚合/组合和关联是不同的,在聚合情况下,在整体中读取时,您通常希望在部分中读取,而在关联情况下,需要执行什么操作并不总是那么明显。在将对象保存到数据库中或从数据库中删除对象也存在相同的情况。当然,上述讨论通常特定于商业领域,但这种经验之谈往往在很多情况下出现。 在关系数据库中实现关系 在图 10 中有三张表,它们的键 (OID) 和外键用于在它们之间实现关系。首先,在 实现多对多关联 看一下图 11 中应用程序的复合度。规则是,一旦引入了关联表,复合度就“交叉”,如图 12 所示。值为 '1' 的复合度总在外边缘引入,如图 11 和 12 中所示,以保留原始关联的整体复合度。原始的关联表明雇员有一种或多种福利,并且任何给定的福利都给予一个或多个雇员。在图 11 中您可以看到,即使在有关联表维护关联的情况下仍然是这种情况。 有必要注明我选择应用构造型“<<关联表>>”而不是关联类的说明 -- 将关联类与它所描述的关联连接的虚线行 -- 出于两个原因。首先,关联表的目的是实现关联,而关联类的目的是描述关联。其次,图 11 中采取的方法反映了为使用关系技术所需的实际实现策略。 结束语 参考资料
关于作者
|
版权所有:UML软件工程组织 |
- 对象-关系数据库之间的映射
- 对象-关系数据库之间的映射
- 对象-关系数据库之间的映射
- Hibernate映射对象之间的多种关系
- mybatis对象之间映射关系以及数据库表建立的时候外键的添加
- Hibernate笔记2--映射对象之间的关系
- 对象/关系数据库映射基础
- 对象/关系数据库映射基础
- mysql数据库对象关系映射
- mysql数据库对象关系映射
- 业务对象到关系数据库映射的若干模式
- android中ORM(对象关系映射)数据库LitePal的使用
- android中ORM(对象关系映射)数据库greenDAO的使用
- NHibernate如何实现对象与数据库之间的映射
- ORM中对象与数据库表之间的映射机制
- 对象之间的关系
- 对象之间的关系
- 对象之间的关系
- MVC模式在考试系统中的应用(一)
- To be a man 男人 [摘录]
- Eclipse 3.1 M4 关于Generics的Bug
- [随时感动]之三
- (转)大谈特谈---《倩女幽魂》之《玄心奥妙诀》
- 对象-关系数据库之间的映射
- 什么时候可以不再需要换SIM卡
- 写于情人节
- MVC模式在考试系统中应用之二
- 今天激活了我的另外一个Blog!呵呵~~~
- 两个页面的Alpha混合C++源码
- 新年愿望
- 终于基本掌握了STRUTS
- 第一次