弥合对象/关系之间的鸿沟(四)—— 映射(一)几种映射方案

 弥合对象/关系之间的鸿沟(四)

 

映射(一)

继承。在领域对象模型中,继承是两个类之间的关系,其中一个类是另一个类的泛化。图1显示了人类的关系对象模型,这其中全职员工(FullTimeEmployee)兼职员工(PartTimeEmployee)员工(Employee)的泛化,员工(Employee)又是一个人(Person)的泛化。 

 

 

有数种方式将这个领域对象模型映射到关系模式。其中单表继承策略将继承层次结构中所有类映射到一个表,此表中包含的列对应任何类的所有字段。在这种映射中,若表中的单元格包含空值或默认值,则表示该行对应的那个类的实例中不包含该列的字段。

为了使用单表策略,数据库必须包含的信息,允许映射来确定哪一个类和哪个特定行映射到一起。映射通常包含一个标志列的名称,该列的值映射到每一个可能的类。

例如,人(Person)表(如图2所示)可以包含一个标志(DISCRIMINATOR列,根据该行是否映射到一个人(Person)员工(Employee)全职员工(FullTimeEmployee)兼职员工(PartTimeEmployee)的实例,其值分别是S,E,F和P之一。当从PERSON表中检索行时,提供程序将总是检索标志列的值,以实例化正确的类。

 

单表单类继承策略(图3)每个类映射到它自己的表,并且映射每个字段到对应表中的一个列。单个实例中的所有数据将在各个表中都有相同的主键列值,数据库模式将会声明表之间的外键关系。当查询这些表时,服务提供程序建立连接查询,以确定一行数据映射哪一类。例如,要找到一个特定的日期后聘用的所有员工,查询将连接(join)PERSON表、EMPLOYEE表、PART_TIME_EMPLOYEE表和FULL_TIME_EMPLOYEE表,以确定该行是否被映射到了Person类、PartTimeEmployee类或FullTimeEmployee类。 

 

单表单具体类继承策略(图4)每个非抽象类映射到它自己的表,并且映射每个字段到映射表中的列。这种策略减少了表示领域类所需的表的数目。

 

混合继承策略,可能使用多策并下相结合的方法。例如,它可能会将Person类和Employee类中的字段映射到一个包含标志列的表;映射FullTimeEmployee类的字段到第二个表,并把PartTimeEmployee类的字段映射到第三个表。 

单表继承映射的优点是简单和高效。只需要用一个表,就可以查询到层次结构中任何类的实例。单表继承的缺点是,它可能需要很多列,但只有很少的类映射。这种低效可能是一个非常广泛的继承层次的问题。 

其他映射继承策略的优点是,其数据库模式可以被完全的规范化。由于继承映射策略不包括鉴别列,所以主要缺点是性能。大多数子类实例的查询需要一个层次中表之间的外联接,而优化这些查询是非常困难的。

关系。在关系模式中,关系通过外键来建模 定义的像一个允许列包含特定值的约束,这个值基于其他表的行中的值。由数据库来强制执行此约束。如图5所示,EMPLOYEE表可能包含一个存有部门编号的DEPT列,表示该雇员所属的部门。有一个约束声明在EMPLOYEE表的DEPT列上,EMPLOYEE表中任何一行的DEPT列的值,必须也包含在DEPARTMENT表的主键列的值中。 

 

一个外键约束可以映射到领域对象模型中的多个关系字段。例如,DEPT列映射到对象模型中的两个关系字段:Employee类包含一个Department类的引用;Department类包含一个Employee集合类的引用。 

如果一个外键列有唯一(unique)属性,那么在这个表中只有一行与另一个表中的相同行有关联。在图6中,INSURANCE表的Employee列使得INSURANCE表与EMPLOYEE表一一对应,EMPLOYEE表中的任何一行都只有一行在保险表中对应。这个外键列通过每个领域类中的一个引用映射到对象模型,这个引用指向其他的类。

 

下一篇 映射(二)

posted @ 2012-04-09 18:36  ScottGu  阅读(1091)  评论(2编辑  收藏  举报