实体间引用关系的描述方法与维护策略分析
2009-08-20
作者:王杰文 张大方
摘 要: 分析了IDEF1X的实体引用关系描述方法和引用关系类型,剖析了实体间的依赖性对引用关系的影响,讨论了引用关系的维护策略及在ERwin中的实现方法。
关键词: IDEF1X方法 实体关系 实体依赖
IDEF(Integrated Computer-Aided Manufacturing DEFinition)方法是美国空军ICAM项目建立的。最初开发了功能建模(IDEF0)、信息建模(IDEF1)、动态建模(IDEF2)三种方法。随着信息系统的相继开发,又开发出了一系列IDEF族方法。其中用于数据建模的方法IDEF1X(IDEF1 extended)是IDEF1的扩展版本,它是IDEF1方法和LDDT(逻辑数据库设计技术)相结合的产物。数据建模的关键是对数据之间关系的表达。IDEF1X方法为数据间关系的描述提供了较丰富的表达能力。
1 引用关系的描述方法
E-R模型中的实体可以分为独立实体和依赖实体二类。独立实体(Independent Entity)是指不需要模型中任何其他实体标识的实体,其键属性完全由自身给定。依赖实体(Dependent Entity)是指依赖于模型中其他实体的实体,其属性中包括了其他实体的主键属性(外部键)。在依赖实体(子实体)和被依赖实体(父实体,可能是独立实体,也可能是依赖实体)之间将存在引用关系(也称引用完整性)。引用关系直接表达的是父实体与子实体之间的一对多关系,即子实体的某(些)属性取值来源于其父实体的键值。
通常,二个实体的引用关系可表示为:
其中:s是描述被依赖实体的关系(父关系),r是描述依赖实体的关系(子关系),X是r的属性子集,K是s的主键属性集,且X和K满足并相容规则(在ERwin所构造的模型中X是K的迁移)。
根据父实体中的键(K)向子实体迁移的位置不同,可以对一对多关系进一步分类。
(1)标识关系(Identifying Relationship)。父实体的键迁移到子实体的键区,成为子实体标识的一部分,即子实体的标识依赖于父实体。标识关系运用其业务规则,通过父实体的标识符来标识子实体。引入参与度的概念,父实体的参与度为(0,1),子实体的参与度为(1,n)。即在标识关系中,存在着父实体部分参与、子实体完全参与的一对多联系(zero-or-one-to-one-or-more)。
(2)非标识关系(Non-Identifying Relationship)。父实体的键迁移到子实体的非键区(数据区),即子实体的标识不依赖于父实体。对于非标识关系还应该区分二种情况:①非标识强制关系(Non-Identifying Mandatory Relationship)。即从子实体看,非标识关系是强制(mandatory)的,尽管子实体不由父实体所标识,但子实体的存在仍然依赖于父实体。引入参与度的概念,父实体的参与度为(0,1),子实体的参与度为(1,n)。即在非标识强制关系中,也存在父实体部分参与、子实体完全参与的一对多联系;②非标识非强制关系(Non-Identifying Non-Mandatory Relationship)。即非标识关系是可选的,子实体既不由父实体标识,也不依赖于父实体而存在。引入参与度的概念,父实体的参与度为(0,1),子实体的参与度为(0,n),即在非标识非强制关系中,存在着父实体部分参与、子实体也部分参与的一对多联系。
通常,一对多关系引起父子实体间的依赖。不论父实体的键迁移到子实体的键区还是数据区,若子实体的存在依赖于父实体的存在,则称这种父子关系存在依赖(Existence-dependency)。所以标识关系和非标识强制关系总是导致存在依赖。存在依赖表达了二种关系,即伴随关系和限制关系。在伴随关系中,子实体将伴随着父实体的删除而被自动删除,例如:学生被开除,其选课记录也应该一同删除。在限制关系中,子实体的存在将限制父实体的删除,例如:有学生选修的课程不得删除。若父实体的键迁移到子实体的键区,则子实体由父实体所标识,这种父子关系称标识依赖(Identification-Dependency)。所以标识关系总是导致标识依赖。值得注意的是,非标识关系从不引起标识依赖(因为迁移键只到数据区)。
一对多关系是关系数据模型可以直接表达的关系,其他的关系在转化为数据模型时可以用一对多关系来表示。例如:子类(Subtype)和超类(Supertype)的关系实际上就是一个父子关系(一对多),只是为了进一步描述一个实体集中某些实体的不同性质,从该实体集中取出一部分实体构成一个(或多个)新的实体集,即原来实体集的子类,而原实体集是新实体集的超类。显而易见,子类和超类之间体现的是标识关系(子类由超类标识)。一个实体可以是某一实体的子类,同时,也可以是另一实体的超类。
从实用上讲多对多关系(也为不确定关系)没有意义。如图1所示,在学生选课系统中,实体STUDENT(学生)和COURSE(课程)之间是多对多关系。但是,在引入一个关联实体STUDENT_COURSE(学生选课)以后,就可以将这个多对多关系转化为二个一对多关系,即STUDENT与STUDENT_COURSE、COURSE与STUDENT_COURSE二个一对多关系,并且这种关系是标识关系。因为STUDENT和COURSE的键均迁移到关联实体STUDENT_COURSE的键区,共同构成了关联实体STUDENT_COURSE的键。此时的关系就具有明确意义了。
综上所述,实体之间的关系可以归纳为标识关系和非标识关系二类。标识关系和非标关系均导致父子实体之间的引用关系。标识关系与非标识强制关系遵循的引用规则为“zero-or-one-to-one-or-more”(0或1对1或多);非标识非强制关系遵循的引用规则为“zero-or-one-to-zero-or-one-or-more”(0或1对0或1或多)。
2 引用关系的维护策略
对数据库进行更新可能破坏实体之间的引用关系(引用完整性)。因此,在对具有引用关系的实体关系,例如r(子关系)和s(父关系)进行更新时,应该设法维护引用完整性。下面是一般规则。
(1)如果在r中插入一个实例t,则系统必须保证在s中有一个实例u使u[K]=t[X]。也就是说必须保证t[X]∈ΠK(s)。(2)如果从s中删除一个实例u,则在r中的相应实例集合σX=u[K](r),如果不是空集,则系统或者拒绝执行该命令,或者自动删除r中的相应实例(即实施级联删除)。(3)对更新操作应该考虑二种情况:对子关系r的更新和对父关系s的更新。
如果更新r中的实例t,并且更新涉及到X的值,则应该做类似于在r中插入实例的处理。设t′表示实例t的新值,则系统应该保证t′[X]∈ΠK(s)。
如果更新s中的实例u,并且更新涉及到K的值,则应该做类似于在s中删除实例的处理。对于子实体关系r中相应实例集合σX=u[K](r),如果不是空集,则系统或者拒绝执行该更新操作,或者进行按上述级联删除方式作级联更新,以确保r中的实例引用s中K的新值。
具体地说,对标识关系和非标识关系应分别采取不同的处理策略。
当删除实体中的实例时,应遵循如下删除规则:若父子实体之间存在依赖(即标识关系和非标识强制关系),当父子实体之间为伴随关系时,删除父实体的实例,子实体的相应实例则实施级联(cascade)删除(父去子消);当父子实体之间为限制关系时,子实体的实例将限制(restrict)对父实体相应实例的删除(子在父存)。标识依赖旨在表达父实体对子实体的鉴别关系,不关心子实体的存亡,所以在数据更新时可以不考虑。为维护既无存在依赖又无标识依赖的非标识非强制关系中的引用关系,在删除父实体实例时,可以将子实体中的相应迁移键设置为空值(NULL)。
例如:图1中STUDENT与STUDENT_COURSE是标识关系,STUDENT的键(S_NO)是STUDENT_COURSE主键的一部分。根据基数规则,STUDENT_COURSE的每一个实例都有一个STUDENT实例与之对应,标识关系明确地记载了STUDENT_COURSE存在依赖于STUDENT,且这种存在依赖为伴随关系。所以,若删除STUDENT的实例,则应删除STUDENT_COURSE中与STUDENT已删除实例对应的全部实例。而COURSE与STUDENT_COURSE也是标识关系,二者之间为存在依赖,但这种存在依赖为限制关系。所以,若要删除COURSE的实例,只要STUDENT_COURSE中存在着对应于COURSE的实例,就禁止删除COURSE。
如上所述,删除规则决定了实体中的一个实例(即表中的一行数据)被删除时数据库的反映;插入和替换规则决定了当数据行被插入或改变时数据库的反映。
当在实体中插入与替换实例时,应遵循如下规则:
对于插入,若父子实体之间有存在依赖,则只有在子实体引用的外键与父实体中已存在的键值匹配时,子实体实例才能被插入;若父子实体之间为非标识非强制关系,则可以先令外键为空值将子实体的实例插入。在效果上,替换与插入应使用同样的规则。
例如,在学生选课系统中,STUDENT_COURSE与STUDENT、COURSE之间都是标识关系,构成了存在依赖。因此,不能在STUDENT_COURSE中插入STUDENT中没有的学生和COURSE中不存在的课程。而在图2所示的机票预订系统中,PASSENGER和SEAT-RESERVATION之间是非标识非强制关系,所以,没有被旅客预订的机票也可以插入SEAT-RESERVATION中。此时,外键属性passenger-name取空值,这是符合现实的。
3 ERwin对引用关系的实现
ERwin的正向工程可以自动为每个父实体建立删除和更改2个触发器,为每个子实体建立插入和更改2个触发器。若一个实体既是父实体又是子实体,则建立插入、删除和更改3个触发器。各类触发器的功能因引用关系类型不同而有所差异。
图2所示为一个航班座位预订系统的ERwin逻辑视图。在该系统中,PASSENGER和SEAT-RESERVATION之间是非标识非强制关系,FLIGHT和SEAT-RESERVATION之间是标识关系。它们之间的引用关系上面已经作了分析。当ERwin进行正向工程时,这些引用关系将由一系列的触发器来实现和维护。例如,为了维护PASSENGERT和SEAT-RESERVATION之间的非标识非强制关系,在PASSENGER上建立了删除触发器tD_PASSENGER(涉及属性passenger-name的)和更改触发器tU_PASSENGER。当在PASSENGER中进行删除和更改时,它们都将SEAT-RESERVATION中相应实例的属性passenger-name置空值。
4 结束语
数据建模是数据库设计的关键,IDEF1X数据建模奠定了数据库设计的基础。目前,IDEF1X方法在国内外已广泛应用于政府、工业和商业领域中,支持广泛的企业应用。在建立企业信息管理系统之前,采用IDEF1X方法为信息系统建立合适的信息模型,对实体间的引用关系做出充分、准确、清晰的描述是十分必要的,这也是企业信息管理系统开发成败的关键。