CSDN博客

img newc_k

映射的基本原理

发表于2004/9/14 10:48:00  1496人阅读

分类: 设计模式

原文来自http://www.agiledata.org/

现在大部分时髦的商业软件是用对象语言比如JAVA和C#开发,并用关系型数据库存贮数据。当然这并不能说你就不能有其它的选择,有许多程序就是用过程语言比如COBOL来开发的,并且很多系统使用对象数据库或者XML数据库来保存数据。不管怎样,到目前为止对象语言加关系数据库仍是标准,所以我假定你是工作在这种情况下。如果你正在用不同的储藏技术工作那麽许多观念仍然可适用,虽然这可能会被修改。

在对象语言和关系型技术之间存在“阻抗失谐”,对此项目团队一般是开发一个软件做为系统的基础。这样可以很容易的克服“阻抗失谐”的问题,这个密诀表现为两个方面:你需要了解映射对象到数据库的过程和在一个数据库中映射表之间的关系。

1、敏捷DBA的角色

图1:显示敏捷DBA角色映射到对象到关系数据库。这里有三个主要活动是我们所感兴趣的:

(1)映射。映射的基本目标就是确定对于一个持久对象的数据所确定的有效策略。这包括保存个体对象的数据属性和对象之间的关系,以及所有类之间继承结构的关系。

(2)实现映射。

(3)性能调整。

一个有趣的事是关于图1:敏捷DBA和应用开发者一起工作在所有的三个活动上。尽管敏捷DBA是负责确保映射有效,但是他们不会单独对实际的成果负责。其它的工作也不会是单独行事,这就是敏捷软件成功的秘密。

2、基本理念。

当开始学习对象映射到数据库的第一步就是对象的数据属性。在关系数据库中一个属性将被映射到零到多个列中。记住,不是所有的属性都被持久化,临时计算属性就不用。举个例子,你的程序中的“学生”对象有一个“平均分”的属性,不过它不用保存在数据库中,因为它是在程序中计算出来的。有的属性是一个类,一个“客户”对象有一个“地址”类做为属性,这真实的反映了两个类之间的联合很有可能被映射,并且“地址”类本身的属性也要被映射。重要的事是清楚的定义:一些点上的属性会被映射到零到多个列上。

最简单的映射是将单独的属性映射到单独的列上。它们有同样的基本类型,举个例子:它们全是日期类型,属性是STRING而列是CHAR,或者属性是NUMBER而列是FLOAT。

映射术语

Mapping(v)。对象及其它们之间的关系被持久化在永久数据存贮器中,持久化在关系型数据库中。
Mapping(n)。对象的属性或一个关系被持久化在永久数据存贮器中。
Property。数据属性,任一一个实现可以是如“FirstName”字符类型的物理属性,也可以是一个经由如返回一个顺序的总和的“getTotal()”操作。
Property mapping。描述映射如何持久化对象的属性。
Relationship mapping。描述如何持久化两个或更多对象之间的关系(联合、聚合、合成)。

某种程度上类映射到数据表比较简单,但并不是总是直接的。除了非常简单的数据库以外你将会无法有一对一的对表的类映射,稍后在本章中你会注意到有关“映射继承”。然而,一个你在本章各处将会看见的通常主题是对一张表映射的一一个类对你的起始映射是较好的。

现在,让我们从简单的入手。图2描述了两个模型,一个UML图和一个物理数据模型,两个图表为一个次序系统描述简单的实例部分,你可以看到类的属性可以被映射到数据库的列上,举个例子“order”表的“DataFulfilled”列被映射到类“order”的“DataFullfilled”属性上。

图2



 初始的属性因为几个理由是很容易被确定的。首先,命名的标准适用于所有的模型,敏捷建模的一个方面是应用于建模标准惯例。第二,很有可能由同一个人建立所有的模型。当人们在分开的团队中工作时他们的解决是通常会改变的,即使他们工作的很好。因为他们不同的设计决定了不同的方法 。第三,一个模型可能由其它模型来驱动开发。在“不同的项目需求不同的策略”一节中,我们讨论了当你开发一个新的项目时对象实例将驱动你的数据库实例的开发。

即使两个实例像图2描述的那样相似仍有不同,不同就意味着映射将不会是完美的,两者不同表现为:

(1)在对象实例中对于TAX有几个属性,而数据库中仅有一个。当对象保存数据时,大概要将“order”类的TAX的三个属性累加并保存到“order”表的“tax“列。然而,当对象被读入内存,三个属性需要被计算。

阅读全文
0 0

相关文章推荐

img
取 消
img