2009年6月17日星期三

面向对象设计背后的数据库设计(摘自"The Object Primer")

  1. 把对象映射到关系数据库

首先,类的属性将会映射成关系数据库中的0列或多列(最好使用相似的命名规范)。

对象的有些属性本身就是对象,它真实地反映了两个类之间的关联。

并非所有的属性都是持久的,有一些被用来进行临时计算。

  1. 影子信息

影子信息(shadow information)是除了普通领域数据之外,对象需要维护的任何用于将它们自己持久化的数据。

一般如主键信息,特别是没有业务含义的代理主键。并发控制标记、时间戳、增量计数器。

  1. 映射继承结构

将继承映射进关系数据库中,有3种主要的方法:

  1. 把整个类层次映射到单张表中。
  2. 把每个具体类映射成自己的表。
  3. 把每个类映射成自己的表。

3种技术的对比

技术

优点

缺点

单表

  1. 方法简单
  2. 容易增加新的类:仅需要对额外的数据增加新列
  3. 通过简单改变行的类型来支持对象多态
  4. 数据访问是快速的,因为数据在一张表中
  5. 特殊报表是非常容易的,因为所有的数据都可以在一张表中找到
  1. 类层次的耦合增加了,因为所有的类都直接耦合到同一张表中。类中的变化可以影响表,这样就影响了层次结构中的其他的类以及他们的相关映射
  2. 数据库中潜在的空间资源的浪费,因为许多行将会是空行
  3. 当类型之间有严重的重叠式,表明类型变得复杂
  4. 对于大型层次结构,表增长得很快

每个具体类一张表

  1. 访问单张表中的数据时好的性能
  2. 生成特殊报表简单,因为一个类的所有数据都仅存处在一张表中
  1. 对类的修改需要我们修改他的表,及其任何子类的表。
  2. 无论何时对象改变了他的角色,就需要把数据拷贝到相应的表中。
  3. 支持多行信息,还要维护数据完整性,这很困难。

每个类一张表

  1. 映射简单,因为他是一对一的
  2. 容易支持对象多态,因为我们只在每种类型相应的表中有记录
  3. 修改父类和增加新子类非常容易,我们仅需要修改/增加一张表
  4. 数据大小的增长与对象数目的增长成正比
  1. 数据库中有多张表,每个类一张表(加上维护他们之间关系的表)
  2. 潜在的要花更多的阅读和读取数据的时间,因为我们需要访问多张表
  3. 特殊报表是困难的,除非我们增加视图来仿真待处理的表
  1. 映射关系

对象模式中的关系是通过对象引用和操作的组合来实现的。而在RDB中,他们通过外键来维护。

映射关系的方式依赖于他的多重性:

  1. 一对一关系

如果每个类都有一张表对应,那么这两张表之一需要实现一个外键。

第二种策略是简单的在单张表中存储两个类的数据。

  1. 一对多关系

它的实现方式是在关系中的那方面使用Hashset等集合,在的这方面使用对象引用。

在数据库中,他是在关系中多的一方通过外键来实现。

  1. 多对多关系

两个类之间的多对多的关系被映射成数据库内的关联表。

  1. 迭代关系

也称为自反关系,它是指关系的两侧都是相同的实体。

我们可以使用非迭代关系相同的方式来映射它们。

没有评论: