Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->Linux技术 ->系统管理 ->正文

对象/关系映射--聚合模式

来源:Linux-cn.com 作者:Webmaster 时间:2007-05-05 点击: [收藏] [投稿]

聚合映射的模式

在面向对象建模期间(OOA)最难回答的问题是,何时使用聚合,何时使用关联。性能和灵活性的权衡将会影响到这个问题的答案。你可以使用Single Table Aggregation。这是一种最自然的聚合映射方式。你也可以使用Foreign Key Aggregation,它常常用于处理1:n聚合的映射,我们将在Foreign Key Aggregation的相关章节中讨论它。

模式:Single Table Aggregation

摘要:

该模式展示了如何通过把所有的聚合的对象属性集成到单个的表中的方法把聚合映射到一个关系数据模型。

示例:

考虑下列的对象模型:

一个AddressType,为其它的对象所聚合。

图1.一个AddressType,为其它的对象所聚合。

问题:

如何将聚合映射到关系表中?

约束:

  1. 性能:为了得到最佳的性能,该方案应该在一次的数据库访问中,不用Join操作获取一个对象。数据库访问应该只获取最少的页面,以节省IO带宽。
  2. 可维护性:为了获得最佳的可维护性,那些为多个对象所聚合的聚合类型,应该映射到一组表中,而不是分散到物理数据模型的各个点上。在数据模型层次上实行标准化,这样可以使维护简单。
  3. 数据库的一致性:聚合意味着被聚合对象的生命周期和需要聚合的对象的生命周期是相互耦合的。这一点需要由数据库或应用程序代码来保证。

解决方案:

把被聚合对象的属性和使用聚合对象的属性放在同一张表中。

结构:

使用聚合的对象被转换为物理数据模型的一张表中,被聚合对象的数据集成到该表中。

解决方法示例:

我们为Customer对象创建Customer表。InvoiceAddress和DeliveryAddress都集成到Customer表中。

将一个被聚合的对象类型映射到使用聚合的对象的数据库表中。

图2.将一个被聚合的对象类型映射到使用聚合的对象的数据库表中。

我们使用前缀来区分同类的属性。这有点类似于C++中的命名空间的概念,例如Customer.DeliveryAddress.Street。

结论:

  1. 性能:在性能方面,该方案是最佳的,因为只需要访问一张表就能够获取一个带聚合的对象,并读入所有聚合对象。另一方面,由于聚合对象的字段的增多,一次读取将会增大数据库读入的页面数,导致IO带宽的浪费。
  2. 可维护性和灵活性:如果聚合的对象类型被多个对象所引用,那么将会降低可维护性,因为每一次对聚合对象类型的修改都会导致对所有引用聚合对象的修改。
  3. 数据库的一致性:删除使用聚合的对象时,聚合对象将会自动删除。不需要任何其它的程序或数据库触发器来控制。
  4. 特殊查询:类似查询数据库中所有的AddressType对象之类的查询,都会变得很难处理。

实现:

  1. 命名规则:需要为聚合的对象的属性考虑前缀或其它的命名规则。在上面的例子中,我们使用属性名称的缩写形式作为前缀。
  2. 物理数据库的页面大小:将聚合对象和使用聚合对象放在同一张表中,在一定程度上弥补了由于对象的部分属性存储在另一个数据库页面上的性能损失。这种情况下,读入的是两个页面,而不是一个。

变化:

我们已经讨论了使用聚合对象类型和聚合对象类型之间最简单的1:1关系。Foreign Key Association模式描述了两种对象类型间1:n的关系,Overflow Table则展示了在1:n的关系下避免采用外键的技巧。

相关模式:

Foreign Key Aggregation模式是Single Table Aggregation模式的备选方案。参考Representing Collections in a Relational Database [Bro+96]。当应用到普通的关系型数据库访问层的时候,还可以对比Denormalization [Kel+97]。

参考:

《Mainstream Objects》(Ed Yourdon [You+95] )在第21章完整的讨论了在建模时期何时使用聚合和关联、以及如何使用它们的问题。




 如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<



上一篇:对象/关系映射--概述   下一篇:对象/关系映射--继承模式

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号