对象设计时如何选择“一对多”与“多对一”关系

原创 2017年01月03日 10:27:11

对象设计时如何选择“一对多”与“多对一”关系

  • 做面向对象设计的时候,我们常常面对这样一个问题。当对象之间存在一对多关系的时候,在物理设计的时候应该选择一对多关系还是多对一关系?举例来说,假设有一个订单对象,每个订单对象对应多个订单条目。这个时候我们在设计的时候有两中选择,一种是在订单对象中加入一个订单条目集合,另外一种方法是在订单条目中引用订单对象。分别对应以下两种设计。

     一对多
    多对一

  • 最简单一种方法是同时保留两种关系,也就是既在订单对象中保留订单条目集合,也在订单条目上引用订单对象。这也是很多根据数据库生成对象模型的工具的默认选择。但是这样做存在一个性能问题,很多ORM
    Mapping的工具在保存具有一对多关系的对象时,都会将“多方”的对象每个都重新保存一遍(以Nhibernate为例,如果订单对象引用了订单条目对象的集合,那么如果在保存订单对象时,订单对象是脱钩对象,Nhibernate会把所有订单条目对象重新保存一遍)。

  • 从上面的例子可以看到,使用一对多关系在很多情况下,在很多情况下都会引入性能问题。那是不是可以说在做对象设计的时候不要使用一对多关系,每次仅使用多对一关系就可以了呢?答案当然是不。那什么时候可以使用一对多关系呢?主要有两中情况,第一种情况是,一对多关系中的多方在保存时需要参照多方中其它的对象,才可以确认是不是可以保存。还是以订单对象为例,假设订单条目对象有一个金额,如果每个订单下的订单条目金额的总和不能超过一个特定的值,这种情况下一定要使用一对多关系。因为单独看一个订单条目的情况无法确认该订单条目是否可以保存,而每次保存都把和该订单条目在同一订单下的所有订单条目读出来,而且还要避免保存冲突问题需要大量的代码,这种情况下就不如使用一对多关系了。另外一种情况相对比较少见,那就是多方的对象直接的顺序有严格的要求,这种情况也必须使用一对多关系。这种情况在开发工作流设计器时经常会出现,每个工作流会有多个活动,而活动的执行顺序是一个很重要的属性,如果出现问题会导致工作流整体执行的异常。必须保证工作流与工作流活动的每次保存都是整体保存,如果两个人同时保存了一个工作流,即便保存的是不同的活动,只要调整了活动的顺序,都可能会让整个工作流的执行顺序出现异常,这种情况下最好也是使用一对多关系。

版权声明:本文为博主Leo Fan原创文章,未经博主允许不得转载。

Java复习之对象一对多关系与对象多对一关系

这篇博客主要是在集合的基础上学习一下对象的一对多关系与对象的多对一关系。...

表关系(一对一,一对多,多对多)

可以在数据库图表中的表之间创建关系,以显示一个表中的列与另一个表中的列是如何相链接的。在一个关系型数据库中,利用关系可以避免多余的数据。例如,如果设计一个可以跟踪图书信息的数据库,您需要创建一个名为 ...
  • ago52030
  • ago52030
  • 2007年08月01日 14:26
  • 27876

关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】

查了好多资料 old: @ManyToMany 注释:表示此类是多对多关系的一边,mappedBy 属性定义了此类为双向关系的维护端,注意:mappedBy 属性的值为此关系的另一端的属性名。 ...

MyBatis一对多,多对一,多对多

MyBatis中的一对多和对多一,多对多 主要就是resultMap中 association – 一个复杂的类型关联;许多结果将包成这种类型(一对多) collection – 复杂类型的集合...

CentOS7上安装MySQL Workbench

配置EPEL(企业版Linux软件附加包)】 yum install epel-release.noarch yum repolist 如果显示的信息里面有epel,则安装成功。安装My...

Linux下MySQL服务突然无法正常启动

查看日志文件后发现是磁盘空间不足造成的。 查看硬盘的使用情况df,-h单元为根据大小适当显示,-m单位为M,查看指定目录的文件大小du,查看当前目录的总大小,查看当前目录下子目录分别的大小,指定目录...

Flask-SQLAlchemy 配置,处理对象-关系,一对多,多对多,

初始化和配置 ORM(Object Relational Mapper) 对象关系映射。指将面对对象得方法映射到数据库中的关系对象中。 Flask-SQLAlchemy是一个Flas...

hibernate对象关系映射( 一对一,一对多,多对一,多对多的单向,双向映射 ——)

对象之间的关系: 关系映射之间的关系只的是对象之间的关系,并不指数据库表的关系(外键关系)这儿解决的问题是当对象之间的关系之一时,数据库表该如何映射,编程上如何对待。   一对一(主键关联,...
  • oufua
  • oufua
  • 2014年09月13日 19:19
  • 382
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:对象设计时如何选择“一对多”与“多对一”关系
举报原因:
原因补充:

(最多只允许输入30个字)