1、2.3 重新排列对象3 使用Name mapping设计好逻辑模型后,利用Name mapping的设置,可以通过2个映射文件,在物理模型里自动命名表名和列名。一般情况下逻辑模型中的实体(表)和属性(列)名都使用中文,以便于理解,而在物理模型里一般使用英文,以实现比较优化的设计。3.1 映射文件范例表名映射文件范例:纳税人信息,FACT_nsrxxb列名映射文件范例:纳税人电子档案号,nnsrdzdah设立日期,dslrq行业,_HY行业名称,_CAPTION行业代码,_HYDM3.2 Name mapping设置依次打开菜单项:Tools-Names-ModelNaming Options选
2、择Name Mapping选项卡设置以下项目:项目值Enity to Table%Lookup(B1_tableC2E.txt,%EntityName)Attribute to Column%Decl(test,_)%=(test,%Lookup(B1_C2E.txt,%AttName)%If(%=(%Substr(%:test,1,1),_)%Substr(%:test,2)%else%:test其中黑体字为映射文件名,这2个文件需要与erwin文件保存在同一目录中。3.3 常见问题为什么在物理模型中不能通过映射文件自动修改表名?1. 可能映射文件修改后,并没有被ERWin重新载入,把ERW
3、in关闭后,重新打开再试2. 物理模型的表名已经有值,所以没有通过映射文件自动修改表名,把表名清空后再试3. 打开.erwin文件后,提示映射文件找不到这种情况可能发生在直接双击.erwin文件时,在开始菜单中打开ERWin,然后通过菜单打开.erwin文件即可解决。4 外键的使用在设计多维模型时,为维表和事实表建立外键关系,可以直观展示维表和事实表的关联关系。观察一个事实表和与它直接相关联的维表,则可以看到一个清晰的星形模型。一般情况下维表与事实表的关系是:维表是主表,事实表是子表,维表中的一行数据对应事实表中的多行数据,维表与事实表使用维表的唯一关键字(即主键)关联。在ERWin中建立外键
4、关联时,前提条件是在主表上创建了主键。以下例子中均以事实表作为子表,维表作为主表建立外键关系。4.1 相同列名建立外键关联建立外键关联最简单的情况是维表的主键列与事实表的维度列具有相同的名称。具体操作如下:1. 点击工具条中的,然后再点击维表(主表),最后点击事实表(子表)2. 此时将弹出如下提示框:直接点击“OK”按钮3. 这时外键关系已经建好了,在事实表中与维表主键列同名的列上会加上“FK”外键标识。4.2 不同列名建立外键关联在很多情况下,事实表的维度列列名往往与维表主键列列名不一样,这时的处理方法有所不同,在下例中,我们希望将事实表的“行业”列与维表相关联。2. 此时外键关系已创建,但
5、是事实表上新建了一个与维表主键列相同的列“行业代码”作为外键,并没有提示选择事实表使用的关联字段3. 双击两表之间的连接线,在“Relationships”提示框中,选择“Rolename”选项卡,在Rolename输入框中,输入期望的关联字段:行业,点击“OK”按钮。4. 此时弹出提示框,直接点击“OK”按钮。5. 自动增加的“行业代码”列删除,外键移到“行业”列上。注意:要在逻辑模型视图下做此操作,如果在物理模型做此操作,在逻辑模型中,事实表的维度列名将会被修改为维表的主键列名。4.3 同一维表关联事实表的多个字段有时候,事实表的多个维度列都需要与同一个维表关联,在下例中,事实表已经通过“
6、行业代码”列与维表关联,我们还希望再将事实表的“行业”列与维表相关联。2. 此时新增加了一个外键关系,但实际上关联字段仍是“行业代码” 3. 在新增加的外键关系上,把Rolename改为“行业”,即可让新增的外键使用“行业”列关联。在此步会有提示框,直接点击“OK”即可。4.4 维表关联到事实表上非默认列当事实表中有与维表主键列名相同的列时,新建的外键关系默认会放在此列上。如果希望外键关系在其他列上,则在建立外键的对话框中,需要选择另一个选项。如:希望事实表使用“行业”列与维表关联。新建外键关系时,在弹出提示框中,选择第3项“Rolename migrating attribute”,输入“行
7、业”,点击“OK”按钮在紧接着的提示框中,直接点击“OK”即可达到目标4.5 删除外键关系删除外键关系时,会自动删除事实表上的外键列,而往往此列并不希望被删除掉。可以使用以下办法解决:1. 复制实体(表)2. 删除外键关联3. 将复制表中的列拖到原表中4. 删除复制表5 使用Subject Area当模型里的表比较多,特别是事实表很多,又有很多维表,关联有关系很多时,在ERWin(或其他建模工具)里显示比较混乱,不容易清晰地看到各主题和维表之间的关系。下图是农发行账户模型中的E-R图的局部:下图是农发行账户模型中的E-R图的整体:在我们常用的星型模型结构中,整个模型实际是由一个个相对独立的星形
8、模型组成的,只是各个星形模型之间会共用许多维表,这样就形成了上图那样的蜘蛛网结构。实际上我们观察模型时,希望得到的效果是:关注哪个星形模型时,只需要显示出与此星形相关的事实表和维表,其他无关的表不希望看到。实际上这种功能,在ERWin中是可以提供的。ERWin提供了Subject Area(主题域)功能,主题域相当于一个视图区域,在此视图区域里可以为各实体建立快捷方式,让指定的实体在此视图中显示,而实体上原先定义的各种属性在此视图中可以正常显示。所有的Subject Area单个Subject Area视图:利用此功能,我们可以把一个星形模型中涉及的一个事实表和多个维表放到Subject Ar
9、ea中,此时即可以清晰地看到各表之间的关系,又不至于太乱,同时在此Subject Area中对实体做的任何修改都会反映到实体本身。在ERWin里,所有对象会全部显示在Main Subject Area中。在界面左侧树形菜单上,通过右键即可创建一个新的Subject Area,如“测试”修改此Subject Area的属性: 在Members选项卡中,加入实体到Subject Area中,添加时只需要选择事实表,再通过“级联添加”的方式,即可把一个事实表和所有与其直接关联的维表加入到Subject Area中。在级联的选项中注意选择:Ancestors:1,Descendants:0。不要使用复
10、制、粘贴的方式从Main Subject Area中向新建的Subject Area中复制对象,这种方式会复制出重复的对象,而不是创建快捷方式,这种方式也得不到我们预期的原始对象与Subject Area中对象同步的效果。6 反向工程6.1 使用反向工程创建ERWin模型文件使用反向工程,可以从已有的数据库生成ERWin模型文件。6.2 将逻辑模型的名称显示为物理模型的Comment如果在数据库中,表和列上都已经写了COMMENT,使用反向工程生成ERWin文件后,查看模型的时候,无论是物理模型还是逻辑模型都显示的是英文表名和列名,但实际上相应的COMMENT信息实际已经读入并写入到了模型中。
11、在物理模型中,列的COMMENT值保存在列的Comment属性上。在逻辑模型中,列的COMMENT值保存在列的Definition属性上。但是一般情况下为了便于理解,我们希望在逻辑模型中,表名和列名都能显示为中文,即COMMENT。现在知道了Comment在哪里,需要做的事,就是在逻辑模型里把Definition的值写到Name上。为达到此目的,可以利用ERWin API编写一段小程序来实现。以下是一段Python脚本(此脚本在python2.6, pywin32-214调试通过):#!/usr/bin/python# -*- coding: cp936 -*- import win32com
12、.client #创建COM对象 scapi = win32com.client.Dispatch(AllFusionERwin.SCAPI) # conn=win32com.client.Dispatch(ADODB.Connection)#建立与持久装置中模型的连接 #源文件filename = c:adbcdw-lx.erwin#目标文件newfilename = adbcdw-lx2.erwinscPUnit = scapi.PersistenceUnits.Add(filename,RDO=yes#建立存取内存中模型数据的连接 scSession = scapi.Sessions.A
13、dd() scSession.Open(scPUnit,0,0) #事务控制 scTranId = scSession.BeginTransaction() #获取所有Entity模型对象 scMObjects = scSession.ModelObjects.Collect(scSession.ModelObjects.Root,Entity,1) for scObj in scMObjects: #取Definition属性的值 try: scDefineName = scObj.Properties(Definition).Value except Exception,ex: scDef
14、ineName = scName = scObj.Properties(Name scName = #对象名赋值 scObj.Properties(Physical Name).Value = scName ).Value = scDefineName #获取该Entity的所有Attribute对象 scAttrObjects = scSession.ModelObjects.Collect(scObj,Attribute for scAttrObj in scAttrObjects: # scAttrDefineName = scAttrObj.Properties( # scAttrNa
15、me = scAttrObj.Properties( scAttrDefineName = scAttrObj.Properties( scAttrDefineName = scAttrName = scAttrObj.Properties( scAttrName = scAttrObj.Properties().Value = scAttrName ).Value = scAttrDefineName scSession.CommitTransaction(scTranId) #另存为一个新的文件 scPUnit.Save(newfilename,OVF=yes7 在DW项目中的应用方法7.
16、1 使用ERWin来生成模型文档在目前的项目实施过程中,建模工具还没有广泛使用,但作为项目文档资料,E-R模型关系图还是一个比较通用、易于理解和交流的方式,因此建议使用ERWin来生成模型的文档。这种方式主要适用于未使用ERWin的项目,包括进行中的项目和已经完成的项目。应用方式:1. 使用反向工程生成ERWin模型文件2. 将逻辑模型中的表名、列名更新为中文3. 在逻辑模型中为各事实表和维表建立外键关系4. 以事实表为单位建立主题域(Subject Area),每个主题域中只包含一个星型模型通过以上方式,将数据库中的表创建为模型文件中的星型模型。这种方式的缺陷是数据库中发生修改后,要同步到E
17、RWin模型中比较麻烦,因为在DW项目里,一般都不建立外键关系,这样数据库与模型的差异是很大的。7.2 使用ERWin进行模型设计在新的项目中,通过使用ERWin来建模,将可以形成规范的工作方式,对模型也能进行有效的管理。1. 在ERWin里设计逻辑模型和物理模型2. 可以使用Name mapping来自动生成物理模型中的表名和列名5. 使用正向工程生成DDL脚本,在数据库中创建表6. 当模型需要修改时,先修改ERWin中的模型,再使用正向工程生成DDL脚本,更新数据库中的表以上方式,是一个完整建模过程,能充分地使用建模工具来规范模型的设计工作。在初期可能会存在效率下降的情况,但从项目的整个周期来看,在模型的修改和项目组内交流沟通方面,将能大大提高工作效率。为了减少对项目实施的影响,我们也可以循序渐进地推进建模工具的使用,可以在初期暂时不使用Name mapping功能,首先保证能使用建模工具进行设计和利用它进行沟通交流。ERWin提供了强大的API,使用API能够读出模型中的表、列、关联关系。实际上,利用API,我们不仅能把列名更改为中文,甚至还能够生成主题维度交叉表,这些更强大高效的功能,还需要在日后的使用中不断丰富和完善。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1