




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第九章 联系的实现 对象类型间通过属性的引用建立了对象实例间的联系 本章重点研究对象间联系的语义及其实现方法 对象间的联系可以是n元联系(n2)n个对象间通过一个联系进行联接 其中最简单,常用的是二元联系(n=2) 二元联系中,二个对象间的联系语义有1:1,1:n,n:1,n:m9.1 没有属性的二元联系一个二元联系本身没有任何属性,它只表达了二个对象类型间的联系联系的实现:通过设置进入点entry point来完成1. 进入点设在tleft处:tleft类型增加一个引用对象tright的属性,tright类型无需增加属性2. 进入点设在tright处3. 增加一个对象类型rbin,它仅有二个
2、元组属性,分别是tleft类型和tright类型,这种方法可以加载rbin本身独特的属性tleftrbintright1:1的二元联系的实现(一)无冗余的表达方式一个联系仅在一个对象属性中表达 采用 (或者)方法应当从查询需求入手,选择查询频度高的一方作为进入点问题: 1)反向查询速度极慢:对一个特定的tright实例,查其相应的tleft实例时需要查过所有的tleft实例集合2)即使正向查询,若存在联系的偶对集合很小,那么仍然费时 采用方法定义一个rbin类型,tr并由系统维护tr集合,适用于tr相对tleft(tright)较小时问题:1)需要二次查找才能定位2)当tr集合仍然庞大是,寻找
3、一组特定的偶对效率仍然很低需要建立索引tleftrtright11type tleft is body r:tright; end type tleft;type tright body r-1 :tleft; end type tright;type tr is with extension is body left:tleft; right:tright;end type tr;1:1的二元联系的实现(续)(二)冗余的表达方式1二个进入点 在tleft中建立r属性类型为tright 在tright中建立r-1属性类型为tleft优点:提高反向查询效率问题:当两个对象实例间的联系发生变更时,
4、容易产生修改异常,生成对象库状态的一致性受到破坏 解决方法:重新定义r属性的值接受操作refine r:tright code setr;define setr(oright) isbegin oright.r-1 := self; self.r := oright;end define setr; 由此,确保了r属性与.r-1属性的同步修改 必须利用封装技术来控制不会单独修改.r-1 (.r-1只读)总结1. 利用封装技术重新定义关联属性的状态的修改2. 特别注意不能在同一时间,以同样的方式修改类型tright的.r-1的值接受操作,否则导致递归操作的无限循环即:重写tleft,r的值接受操
5、作隐藏tright,.r-1 的值接受操作,使其为只读类型(三)冗余表达方式2采用显式的冗余方式 用tr作为中间联系方法将二者显式相连 查询为二次查询,但管理方便 对r, r-1 的修改自然要遵照异常处理方式重定义vco和做相应的隐藏type tleft is body r:tr; end type tleft;type tr is with extension is body left:tleft; right:tright;end type tr;type tright body r-1 :tr; end type tright;1:n 的二元 联系的实现type tleft is typ
6、e tright is type tr body body with extension is body r: tright ; r-1: tleft; left: tleft ; right: tright; end type tleft; end type tright ; end type tr ; 方式(1)方式(2)方式(3)tlefttrightr1n 其中唯有方式(2)能确保一致性约束,r-是单值的。 方式(1)(3)均不能确保两对象间1:n的约束。 对(1),必须重新定义r属性的值接受操作 对(3),必须对tr的对象实例库进行一致性维护,即tr的insert操作进行一致性维护n
7、:m的二元联系的实现type tleft is type tright is type tr body body with extension is body r: tright ; r-1: tleft ; left: tleft ; right: tright; end type tleft; end type tright; end type tr ; 方式(1)方式(2)方式(3) 采用原则:以最大查询频率为依据选择入口点 可以采用组合冗余方法,但需要进行状态一致性维护tlefttrightrnm具有k个属性的二元联系的实现 1:1的联系:仍然可以采用方式(1)或(2),k个属性寄放在
8、tleft或tright 1:n的联系只能放在单值属性的对象类型方 n:m的联系寄存在那一方均不合适,只能采用方式(3),定义此属性的类型tr, tr具有k+2个元组属性tlefta1trightraktype trwith extension isbodyleft: tleft ; right: tright;a1:t1r;ak:tkr; operationsdeclare tr: tleft , tright,t1r, , tkr - tr code inittr;implementationdefine inittr(oleft ,oright,o1,ok) isbegin self.l
9、eft := oleft; self.right := oright; self.a1 := o1; ; self.ak := ok ;end define inittrend type trn元联系的实现 只能采用方式(3)建立tr类型处理 对初始化进行重定义,以保证约束的一致性。 为了检索高效率,需要考虑受控的冗余建模。t1t2a1aktnrtype trwith extension isbodyentitiy1: t1 ; entitiyn: tn;a1:t1r;ak:tkr; operationsdeclare tr: t1 , , tn,t1r, , tkr - trimplemen
10、tationend type tr示例分析(一) 1-1联系实例:工程师与他所占办公室的联系处理约束条件:一个工程师一间办公室type engineer is type office is bodybody residein: office; isoccupied: engineer; end type engineer ; end type office; 先有工程师,再分 经常查询某办公室的工程师是谁配房间engineersofficesresidesin11用方式(1)和(2)组合建模下冗余的一致性维护 联系更新时一般的方式(1)if (thepenthouse.isoccupiedby
11、 != null)thepenthouse.isoccupiedby.residesin :=null; (2)if (leonardo.residesin != null ) leonardo.residesin. isoccupiedby :=null; (3) leonardo.residesin := thepenthouse;(4) thepenthouseis.occupiedby := leonardo; 设计操作movetooffice来维护一致性状态define movetooffice(newresidence ) isbegin if (newresidence.isoc
12、cupiedby != null)newresidence.isoccupiedby.residesin := null; if (self.residesin != null )self.residesin.isoccupiedby := null; self.residesin := newresidence; newresidence. isoccupiedby := self;end define movetooffice;示例分析(二) 工程师与部门间的1:n的联系type engineer is type division is body body worksfor: divisi
13、on; employs: engineerset; end type engineer ; end type division; type engineerset is body engineer end type engineerset; engineersdivisionsworksforn1控制类型冗余模型的两个操作 hiredefine hire(neweng) isbeginself.employs.insert(neweng);neweng.worksfor := self; end define hire; firedefine fire(badeng) isbeginself.
14、employs.remove(badeng);badeng.worksfor := null; end define hire; 聘用和辞退两个操作可以保持db的完整性约束。递归的1:n的关系 产品与产品间具有递归的组合联系 e-r图的展开可以有两种描述模式productscompositionn1subsuper a:通过super属性表达了is.part-of的语义关系:即:一个产品属于上层产品的一个部件type product is body super: product ; end type product ;适用范围:查找某种产品被组装在什么部件中。沿part-of路径进行导航或访问
15、super:super:super:super:super:super:super:super: b:通过sub属性表达了partlist的语义关系:即:一个部件由几个子部件所组成type product is body sub: productset ; end type product ;type productset is body product end type productset ;适用范围:查找组成某部件的所有子部件sub:sub:sub:sub:sub:sub:sub:sub:应用示例 操作partlist:输出组成某个产品的所有部件 采用结构idefine partlist
16、 isvar resultset: productset;beginresultset.create;!create an empty setresultset.insert( self );foreach ( part in ext( product ) if ( part.super = self )resultset.setunion(part.partlist);!recursive call of partlistreturn resultsetend define partlist 采用结构iidefine partlist isvar resultset: productset;
17、beginresultset.create;resultset.insert( self );foreach (part in self.sub) resultset.setunion(part.partlist);!recursive call of partlistreturn resultset;end define partlist; 该程序是高效的。 操作is part of: 采用结构idefine ispartof(thesuperpart) is !is self a subpart of thesuperpart?var part: productbeginpart := s
18、elf;while ( part != null )if ( part = thesuperpart )return true;else part := part.super;return false;end define ispartof; 高效,只需沿self向上查找到根一条路径 采用结构iidefine ispartof(thesuperpart) is var isused: bool := false;beginforeach ( part in thesuperpart.partlist)if ( part = self ) isused := true;!we could alr
19、eady exit the loop herereturn isused;end define ispartof; 低效,需到thesuperpart节点的所有组件中寻找self第iii种冗余组合模式 type product is body super:product; sub:productset; end type product 该模式的使用中,重要的是维护db的一致性n:m关系举例engineersproductsdesigns 方式一,采用组合的冗余表达方式 type engineer is type product is body body designs: productset
20、; designedby: engineerset; end type engineer ; end type product; type engineerset is type productset is body engineer body product end type engineerset; end type productset;nm 方式二,采用单独定义的tr类型表示联系type designswith extension is bodytheparticipatingengineer:engineer;theproduct:productend type designs互逆联
21、系的实现 问题的提出:在用冗余表达对象间的联系时,如何用系统来自动维护修改的一致性? 互逆联系:对称的联系偶对,由inverse显示标识。 系统将按照用户标识指定的互逆联系的修改进行自动的一致性维护。(一)1:1的单值逆属性 示例:关于婚姻的一致性控制,没有两个类型及其冗余的联系: type man istype woman is body body wife:woman husband:man . ; ; end type man; end type woman mickeymouse.wife := minimouse; minimouse.husbnd:=donaldduck; 控制婚姻
22、联系的一致性约束条件为: w.husband =m; 当且仅当 m.wife = w 如果上面的约束由系统自动维护,则需要用户显示的指明互逆联系 type man is wife : woman inverse woman$husband; end type man; type woman is husband : man inverse man$wife; end type woman;mickeymouse.wife := minimouse;minimouse.husband:=donaldduck; (二)多值逆属性 利用多值(集合)逆属性来实现对象间1:n联系的冗余表示,例如递归组合
23、属性super与sub(多值)间的互逆的联系。 示例:用户界面窗口的设计(无重叠的全包含窗口) 窗口:用一个矩形框表示 窗口之间是全包含的联系r1r11r112 其中: r1包含r11、r12 且r11r1 r1不直接包含 r111, r111被r11直接包含 r111r12type rectangle is body height,length:float; contains:rectangle ; end type rectangle; 其中联系属性contains是一个多值集合属性,其元素为矩形框对象。 现定义contains的一个逆关系containsin,其约束为: 若两个窗口对象r
24、,r具有r contains r,则 r containsin r, 即 containsin(r)=r| rcontains(r) 最多仅由一个矩形r直接包含r。r1r12r11r112r111 包含一对互逆联系属性的窗口类型定义如下: type rectangle is body height,length:float; contains:rectangle inverse rectangle$containedin; containedin:rectangle inverse rectangle$contains; ; end type rectangle;9.6 复合对象引用的支持 g
25、om支持对象间引用的更复杂的语义描述 引用的分类 弱引用: (weak reference)两个对象o1,o2除了它们之间存在一个引用联系外,没有任何其它的语义约束,即它们在同一个语义层次上是独立的两个实体,则称o1,o2间是一个弱引用 复合对象引用:(composite reference) 复合对象对部分对象的引用具有复杂的语义约束。复合对象引用的语义分类 依赖/独立 dependent/independent 专有/共享 exclusive/shared 它们组合成了四种复合对象的引用语义 复合对象的引用分类 依赖 专有 共享 独立 专有 共享依赖专有复合对象引用(最严格的语义引用) 语义表示:该引用保证部分对象仅仅可能是一个复合对象的成份 一致性约束:部分对象当且仅当它所依赖
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东外语外贸大学南国商学院《信息图形设计》2023-2024学年第二学期期末试卷
- 辽宁城市建设职业技术学院《机电创新实验》2023-2024学年第二学期期末试卷
- 宁夏医科大学《国际贸易业务实训》2023-2024学年第二学期期末试卷
- 大理大学《美术史专题研究》2023-2024学年第二学期期末试卷
- 郑州汽车工程职业学院《幼儿园活动指导社会》2023-2024学年第二学期期末试卷
- 辽宁特殊教育师范高等专科学校《城市轨道交通行车调度指挥实训》2023-2024学年第二学期期末试卷
- 鹤壁能源化工职业学院《广播电视播音主持技巧二》2023-2024学年第二学期期末试卷
- 辽宁师范大学《工程设计软件》2023-2024学年第二学期期末试卷
- 中国计量大学《生物统计学及试验设计》2023-2024学年第二学期期末试卷
- 广州体育职业技术学院《商法专题与案例研习》2023-2024学年第二学期期末试卷
- 领导干部离任交接表
- 储运安全检查分析(SCL)评价记录
- 人教版六年级上册道德与法治教案(5篇)
- (中职)中职生创新创业能力提升教课件完整版
- 中班健康课件《我不挑食》
- 生猪屠宰兽医卫生人员考试题库答案(414道)
- 《完善中国特色社会主义法治体系》课件
- 2025版 高考试题分析-数学-部分4
- 2024版高一上册语文模拟试卷
- 知道网课智慧树《哲学导论(湖南师范大学)》章节测试答案
- 防止员工集体离职合同
评论
0/150
提交评论