一对多,多对一的关系在面向对象中是怎么样去实现的
发布网友
发布时间:2022-05-01 03:53
我来回答
共1个回答
热心网友
时间:2022-04-14 10:23
做面向对象设计的时候,我们常常面对这样一个问题。当对象之间存在一对多关系的时候,在物理设计的时候应该选择一对多关系还是多对一关系?举例来说,假设有一个订单对象,每个订单对象对应多个订单条目。这个时候我们在设计的时候有两中选择,一种是在订单对象中加入一个订单条目集合,另外一种方法是在订单条目中引用订单对象。分别对应以下两种设计。
最简单一种方法是同时保留两种关系,也就是既在订单对象中保留订单条目集合,也在订单条目上引用订单对象。这也是很多根据数据库生成对象模型的工具的默认选择。但是这样做存在一个性能问题,很多ORM
Mapping的工具在保存具有一对多关系的对象时,都会将“多方”的对象每个都重新保存一遍(以Nhibernate为例,如果订单对象引用了订单条目对象的集合,那么如果在保存订单对象时,订单对象是脱钩对象,Nhibernate会把所有订单条目对象重新保存一遍)。
从上面的例子可以看到,使用一对多关系在很多情况下,在很多情况下都会引入性能问题。那是不是可以说在做对象设计的时候不要使用一对多关系,每次仅使用多对一关系就可以了呢?答案当然是不。那什么时候可以使用一对多关系呢?主要有两中情况,第一种情况是,一对多关系中的多方在保存时需要参照多方中其它的对象,才可以确认是不是可以保存。还是以订单对象为例,假设订单条目对象有一个金额,如果每个订单下的订单条目金额的总和不能超过一个特定的值,这种情况下一定要使用一对多关系。因为单独看一个订单条目的情况无法确认该订单条目是否可以保存,而每次保存都把和该订单条目在同一订单下的所有订单条目读出来,而且还要避免保存冲突问题需要大量的代码,这种情况下就不如使用一对多关系了。另外一种情况相对比较少见,那就是多方的对象直接的顺序有严格的要求,这种情况也必须使用一对多关系。这种情况在开发工作流设计器时经常会出现,每个工作流会有多个活动,而活动的执行顺序是一个很重要的属性,如果出现问题会导致工作流整体执行的异常。必须保证工作流与工作流活动的每次保存都是整体保存,如果两个人同时保存了一个工作流,即便保存的是不同的活动,只要调整了活动的顺序,都可能会让整个工作流的执行顺序出现异常,这种情况下最好也是使用一对多关系。
一对多,多对一的关系在面向对象中是怎么样去实现的
最简单一种方法是同时保留两种关系,也就是既在订单对象中保留订单条目集合,也在订单条目上引用订单对象。这也是很多根据数据库生成对象模型的工具的默认选择。但是这样做存在一个性能问题,很多ORM Mapping的工具在保存具有一对多关系的对象时,都会将“多方”的对象每个都重新保存一遍(以Nhibernate为例,如...
MySQL中的一对多与多对一关系详解mysql一对多多对一
多对一关系指的是多个实体(比如学生)属于同一个实体(比如一个班级)。在MySQL中,我们可以通过在从表中添加一个外键来实现多对一关系。1.创建主表和从表 我们仍然需要创建两个表,一个是主表(比如班级),另一个是从表(比如学生)。CREATE TABLE classes (class_id INT PRIMARY KEY,class_nam...
颠覆式网络营销的课程中 客服之“一对多”和“多对一”应该如何做得更...
重要客户,可多个客服对一个客户;普通客户,可一个客服对多个客户。大客户,有时为了考验你的专业度,会一下子问你一连串问题。那么,可以让多个客服协同解答。小客户,零零散散,问的问题大都相差无几,可以让一个客服对应多个客户。客服术语的创作,需要与众不同,独树一帜,才能给客户新鲜的感觉。...
请给我讲讲在hibernate中,什么时候用“一对多”、“多对一”、“一对...
一对一就是比如每个人都有且只有一张身份证(排除你的身份证是假冒伪劣啥的),然后必然有且只有一个一个户口本,所以身份证和户口是一对一的关系,你一次查询就可以把一个人的身份证和户口都查询出来,但是由于用途的关系,身份证和户口还是需要用两张表格来存储的。一对多的情况就是比如一个公司有...
Spring配置映射关系时一对多、多对一和多对多关联到底有何区别,可否...
因为关系数据库系统无法保存多对多的联系,所以必须把多对多转换成1对多,请看"T_同学"与"T_学生借书记录"的关系就是一对多.因为一个学生可以多次借书, "T_图书"与"T_学生借书记录"的关系也是一对多.因为一本书在不同时间可以被许多人借阅.实际上"一对多"与"多对一"这两个说法只是对一种关系的...
设计模式(五)行为型模式
在上一篇结构型模式中,我们以功能为基本单位,研究了一些设计模式,用于实现功能转换、功能组合、功能封装等目的。 我们知道,面向对象编程有两个核心元素:对象、对象间通信协作。从面向对象的角度看,任何系统和功能,都是由一个个对象,相互分工合作实现的。推而广之,很多系统也都是这样组织和运行的。 本章的设计模...
表在数据库中是一个非常重要的数据对象,它是用来()各种数据内容的。
表在数据库中是一个非常重要的数据对象,它是用来存放各种数据内容的。数据库中以表为组织单位存储数据,根据表字段所规定的数据类型,可以向其中填入一条条的数据,而表中的每条数据类似类的实例对象,表中的一行一行的信息称之为记录。
Oracle中有一对多,多对一的关系吗?怎样读取关系
你的意思是,产品分类,一个分类下面有多个分类吗 比如说,电器分类下面有电视机,电脑之类的分类吗,这个可以用一个表自身一对多来实现 就是一个表,有 typeid,name ,note,visible,这四个字段之外,增加一个字段parentid,其中parentid又是跟本身这个表通过外键相关联的。parentid代表的是这个类型的父...
中间件技术详细资料大全
对应用程式的结构没有约束:在复杂的套用场合中,通讯程式之间不仅可以是一对一的关系,还可以进行一对多和多对一方式,甚至是上述多种方式的组合。多种通讯方式的构造并没有增加应用程式的复杂性。 程式与网路复杂性相隔离: 程式将讯息放入讯息伫列或从讯息伫列中取出讯息来进行通讯,与此关联的全部活动,比如维护讯息...
以实例说明什么是“对象—关系映射”
对象关系映射只是一个统称,本人觉得意思就是将java的pojo类的字段名持久化到数据库!因为java是面向对象而数据库是面向关系的,所以将之称为对象跟关系之间的映射