企业架构模式读后感企业架构模式之O/R映射

一、 数据源模式

1. Table Data Gateway

根据表为单位来对数据源进行封装,一个实例处理这个表中所有的行的操作。

查询操作的对象都为RecordSet.主要用处就是隔离sql操作和面向对象操作。

2. Row Data Gateway

根据记录为单位来对数据源进行封装。

3. Active Record

将数据库的一行包装起来,封装数据库访问,并在其中实现领域逻辑。(充血式对象)

4. DataMapper(JAVA中目前使用最多的一种方式)

隔离O/R映射,在其中完成对象à关系和关系à对象转换,并保持对象和关系的独立性。耳熟能详的DAO方式应该就是此方案的实现。

二、 对象-关系结构模式

  • 唯一性:

       关系型数据中记录是以主键唯一标识一条记录,对象是以内存的地址来唯一标识对象的,那么在这两者关系交界时,需要一种机制来解决这个问题。

1. Identity field

       将数据库标识ID保存在对象中以在内存对象和数据库记录之间维护唯一性。

  • 生成机制:

      在新对象产生后,究竟是在插入数据库之前就有了标识,还是插入数据库之后才产生标识。

  • 解决方法:

       数据库内产生,由数据库保证其序列唯一性。

       自增长列,每次新记录插入数据库后自动生成标识(应该是事物),并在插完之后更新标识,并把标识返回给对象层。

       计数器,如oracle的sequence.

     对象层产生:

     对象层产生主要面对问题是保证序列唯一。

     产生机制上保证:uuid,产生必然唯一。

     数据访问上保证:数据库中内置count,每次访问时加锁,用完之后+1,并解锁。

  • 结构:
  • 关系结构-->面向对象
  • 一对一,一对多

  2. foreign key mapping

        主要在于面向对象增加一个对象时,如何处理其关联的对象(一个或多个)

         行为层次:

  • 增加:可以插入一个主对象,然后插入引用主对象的多个对象。

比如订单和订单条目的关系,先插入订单,产生订单ID;然后设置创建订单条目所需要的订单Id,然后batch 插入订单条目。

  • 修改:要分析修改的是实体域,还是关系域。

实体域即直接根据其标识修改即可

关系域修改就比较麻烦,必须比较这个关联ID集合,看其是否有变化,或者全部删除,重新插入。

  • 删除:根据需求的不同需要有级联或不能删除。
  • 查询:采用两次查询,先查主对象,再查引用它的对象。
  • 多对多:

     3. association Table Mapping

       针对多对多情况,一般数据库中会有一个关联表,放两者之间的映射关系。

   对象层的结构会是一个对象有一个列表引用到对象集合,反之依然。

   行为层次

  • 增加: 需要先插入一个主对象,再插入一批引用主对象的对象集合,最后将两者关系插入关联表。
  • 修改:分析要修改的是实体域,还是关系域。

  实体域即直接根据其标识修改即可。

  关系域要在关联表中先将所有之前关联删除,再插入新的关联集合。

  • 删除:根据需求的不同需要有级联或不能删除。
  • 查询:采用两次查询,先查主对象,再将关联表和引用主记录表做连接查出引用主对象的对象集合。
  • 面向对象特性-->面向关系
  • 树形结构(类目树)

   4. serialized LOB

    将对象图式关系串行化成一个流,存入到数据库一个字段里。

  • 弱对象:

  5. Dependent Mapping:

  必须依赖其他对象存在的对象。

  可以将数据源访问代码合并于主对象。

  • 继承:

6. Single Table Inheritance

用一张表中的所有列将继承体系中对象的所有属性都保存起来。

Pros:

只有一张表,不需要连接

当继承关系改变时不需要对关系表作改变。

Cons:

空间冗余,结构体系相差越大,冗余空间越大。

7. Class Table Inheritance

一张表对应继承体系中的一个类。

Pros:

不会浪费空间。

通过表的关系可以清晰地看到继承体系。

Cons:

由于继承体系中的一个子对象对应的属性散布在多个表中,因此需要连接或多次查询。

所有继承体系中的属性上提或下置,都必须改动表结构。

父表可能存在瓶颈,因为所有继承体系中对象的数据库操作都需访问父表。

8. Concrete Table Inheritance

继承体系中非抽象类都有一个表对应。

Pros:

每个表自包含,没有相关联的字段。

找具体的子类时不需要连接。

找一个具体的子类时负载只会在子表上。

Cons:

主键跨多个表,较难维持唯一。

父类查找需要跨多个子表进行多次查找。

继承体系中的属性上提或下置的代价在Single Table Inheritance和Class Table Inheritance 之间

原文地址:https://www.cnblogs.com/jinspire/p/2747412.html