前两天要划ER图,使用ER-STUDIO6.5,对关系relationship的使用不甚了解,所以翻译了帮助中的关于relationship的相关内容,与大家共享。
1 资料
ER-STUDIO的帮助(英文)
2 内容
2.1 关系 RelationShips
目录结构:Using ER/Studio àWorking with Data Models àData Model Objects
àLogic Model Objects àRelationShips
关系有助于在一个数据模型中执行业务规则和声明。关系决定了在2个表(或视图)间数据是如何关联的。关系在物理模型中由外键来实现。这些外键的参数通过约束和触发器表明了在表间完整的引用是如何执行的。
ER/Studio允许创建“recursive relationships”当一个实体和他本身相关联;创建“duplicate relationships”当多个关系关联到同一个实体;创建“view relationships”可以关联到视图。
ER/Stduio 通过3个参数propagates外键:
1. Type
2. Existence
3. Cardinality
2.1.1 理解关系类型 RelationShip Types
IDEF1X支持3种关系类型:
l 识别 Identifying
l 非识别 Non-Identifying
l 非特定的 Non-Specific
关系类型的选择是把完整的指示(referential integrity)构建进你的数据模型的基础。为了帮助你为你的环境选择适当的关系类型,在下面描述了支持的关系类型。
2.1.1.1 识别关系类型 Identifying Relationships
识别关系类型propagate父实体的主键给子实体的主键。在IDEF1X的符号中,识别关系类型是一个“在子实体端带有实心圆圈的实线”。
2.1.1.2 非识别关系类型 Non-Identifying Relationships
不识别关系类型propagate父实体的主键给子实体不是主键的参数。在IDEF1X的符号中,不识别关系类型是一个“在子实体端带有实心圆圈的虚线”,如果该非识别关系类型是可选的,在父实体端会有一个空心菱形。
2.1.1.3 非特定的关系类型 Non-Specific Relationships
非特定的关系类型表示“多对多”的关系类型,因为数据库不能解决多对多的关系类型,所以非特定的关系类型不代表任何外键。多对多类型是不建议使用的,应该从你的数据模型中移除。在IDEF1X的符号中,非特定的关系类型是一个“在两端都带有实心圆圈的实线”。
2.1.1.4 关系类型和复合主键(Compound Keys)
仔细思考不同的关系类型和他们代表的含义,识别的关系类型代表一个子实体的主键,可以实现复合主键。复合主键的使用经常是有效的和适当的。但是你应该在只有需要的时候才使用他们,因为这样会限制你数据模型的灵活性。当你使用复合主键时,就意味着在子实体中的数据只能被父实体所识别,当你需要独立的数据时,就会有问题。
2.1.2 理解关系存在 RelationShip Existence
存在描述了从子实体的角度来描述一对实体间的关系。他问了这样一个问题:子实体总是要求一个外键值吗?可能的回答是:
存在 | 含义 |
可选的 Operational | 子实体不是总是要求一个外键值。如果一个值不存在,在父实体的主键中不许存在外键值。 |
必选的 Mandatory | 子实体必须有一个外键值,该外键值必须是父实体中的主键。 |
为了描述存在的使用,举一个“订单”和“订单状态”的例子。如果设置了关系存在为“可选的”,那么没有被分配给订单状态的订单可以存在。这样,你可以知道也可以不知道某个订单是一个完成的,或取消的,还是回退的订单,这些状态可能导致业务逻辑变复杂或者简单。在这个例子中,设置存在为“必选的”应该是合适的。但是,你必须在业务系统和信息说明中强制执行这个规范。
2.1.2.1 关系类型设置
l 识别 Identifying:总是“Mandatory”的。
l 非识别 Non-Identifying:可以是“Mandatory”或“Operational”。在IDEF1X的符号中,可选的非识别关系标识为在关系线的父实体端有一个空的菱形。
l 非特定的 Non-Specific:不能强制非特定的关系类型,因为我们不能处理多对多的关系。
2.1.2.2 对Cardinality的影响
关系存在也表示关系Cardinality,Mandatory的关系类型中,Cardinality必须是一对多的形式;Operational的关系类型中,Cardinality可以是零对多或是一对多。
2.1.2.3 在物理视图中实现关系存在
ER STUDIS可以把逻辑视图的关系含义在物理视图中表示出来。为了实现关系存在规则,他默认设一个“Mandatory“的外键列为NOT NULL,“Operational”的外键列为NULL.
2.1.3 理解关系集的势 RelationShip Cardinality
Cardinality从父实体的角度描述了一对实体间的数量维度。他问了这样的问题:对任何父实体的主键,可以找到多少个子实体的实例?答案可以从零到N。
举一个例子:Customer and CustomerNote。Customer是CustomerNote的父实体,关系类型是识别的。虽然一个Customer可以识别任何CustomerNote,但是不意味着任何Customer必须有一个CustomerNote,因为这是不实际的。为了实现灵活性,我们设置关系Cardinality为一对零或多(toOne-to-Zero or More (each Customer may have zero or more CustomerNotes).)
再举一个不同的例子:Order and OrderDetail。每一个Order必须至少有一个OrderDetail,否则我们怎么知道顾客订了什么咚咚?在这个例子中,我们设置关系Cardinality为一对一或多(One-to-One or More (each Order must have at least one OrderDetail))。
2.1.4 Cardinality符号
Cardinality被读作相关的父实体和子实体实例的比例。父实体的比例依赖于关系是“必选的(一或多)”还是“可选的(零或多)”。IDEF1X对子实体支持4种不同的Cardinality:零或多,一或多,零或一,确切的N。符号如下:
2.1.5 增加一个关系
在2个实体间增加关系前,你首先要建2个有数据关系的实体。
如果在父和子实体/表中有相同的参数/列名称,ER STUDIO打开“Duplicate Native Attribute Editor”来解决冲突。
符号:
for an Identifying relationship
for a Non-Identifying, Mandatory relationship
for a Non-Identifying, Optional relationship
for a One-to-One relationship
for a Non-Specific relationship
2.1.6 修改一个关系
略
2.1.7 删除一个关系
E/R STUDIO允许你删除关系,而且可以自动更新实体数据模型。删除一个关系时会导致ER STUDIO删除关系,并且删除所有被该关系propagated到子表的外键。
你一次只能删除一个关系。
当从子模块(submodel)中删除一个对象时,该对象仍保留在主模块中,除非你选择了“Delete from Model option”。
1. 在“Diagram Explorer”或“Diagram Window”中,选择你想删除的关系。
2. 删除关系:
在“Edit”菜单中,选“Delete Relationship”。
点击右键,选“Delete Relationship”。
在键盘上,按下Delete键。
ER STUDIO会打开一个对话框。
3. 点击yes,就会删除所选择的关系,并且删除了所有被该关系propagated到子表的外键。
2.2 表 Tables
2.2.1 编辑表
2.2.1.1 编辑表的列
2.2.1.1.1 重复的本地属性编辑器 Duplicate Native Attribute Editor
当你创建或者重命名一个主键参数,关系或外键时,“复制本地属性编辑器”会打开,并且在子表/实体中会复制存在的列/参数。比如,有2个实体:Parent和Child,父实体Parent有一个主键参数Key,子实体Child也有一个参数Key,该编辑器就会打开。你要决定如何处理。下面的表描述了选项和功能:
选项 | 描述 |
传播参数 Propagating Attributes to Resolve | 显示一个重复的参数列表,选择要propagating的参数和方式。 |
用propagating参数替换本地参数 Replace Native Attribute with propagating Attribute | 会用propagating的主键参数替换子实体中的参数。如果关系被删除,会删掉propagating的参数和原是的本地参数。 |
重命名propagating参数 Rolename propagating Attribute | 能重命名propagating参数,这样子实体的本地参数还能继续使用他的原始名称,2个参数都存在子实体中,需要为propagating参数重新输入一个名字。 |
改变本地参数名称,允许propagating参数名 Change Native Attribute Name to allow propagating Attribute Name | 能重命名子实体的原始本地名称,以便能使用父实体的propagating参数名称,2个参数都存在子实体中,需要为子实体的原始本地名称输入一个新名字。 |
使用propagating参数统一本地参数 Unify Native Attribute with propagating Attribute | 使用propagating参数统一子实体的本地参数,如果关系以后被删除,会留下子实体的本地参数。 |
例子:
Original:
Replace Native Attribute with propagating Attribute:
如果删除关系,会从子实体中删除id
Rolename propagating Attribute:
重命名为id_rolename
Change Native Attribute Name to allow propagating Attribute Name:
子实体的新名字是id_change_native
Unify Native Attribute with propagating Attribute:
如果删除关系,会保存子实体的id