ERwin Data Modeler (以下简称 ERwin) 是 CA公司 (Computer Associates) 的一款优秀建模工具,历经数年的开发和维护,享有很高的市场占有率。使用 ERwin,用户可以可视化的设计维护数据库、数据仓库,并对企业内部各种数据源模型进行统一规划管理。本文将向读者展示如何利用 ERwin7.3进行数据库建模。
ERwin支持 IDEF1X和 IE两种建模方法,两种方法都适用于大规模企业级数据库建模。本文将采用 IDEF1X进行建模,它是由美国空军开发出来的一种建模方法,被广泛应用于政府机构的各种项目里,是在实践中逐渐成熟起来的一种建模方法。从需求规范开始,随着对项目了解的深入, IDEF1X用一系列逐步细化的模型来进行建模,直至生成最终物理数据库,如图 1所示:
在开始使用 ERwin之前,我们先来了解一下 IDEF1X的基本概念:
Area Model / Project Model : Area model覆盖了一个大的业务领域,通常难以用一个项目来解决业务中的所有问题,要细分成多个项目来实现。 Project Model侧重于整体业务的一个具体方面,能够在一个项目里面实现。
Logical Model / Physical Model: 即逻辑模型 / 物理模型。逻辑模型方便客户、项目管理人员、程序员之间的沟通;物理模型侧重于目标系统上的实现。
ERD : Entity relationship diagram,展现业务的关键实体以及它们之间的关系。在这个阶段中,只关心关键实体的定义以及实体之间的关系(业务规则),并不关心实体的具体属性。
举例来讲,在一个简化的在线购物的系统中,关键实体可能为:
产品( product),客户( customer),订单( order),订单明细( order line item),付款记录( Payment),这些实体间的关系为:
l 一个客户可以有多个订单。
l 一个订单包含多个产品明细。
l 一条产品明细对应一种产品。
l 一个客户可以有多次付款记录。
l 一次付款记录可以包含多个订单。
Key Based Model: 有了 ERD模型,下一步就是对 ERD模型进行细化,针对各个实体,找到一个属性来标志该实体的实例,也就是找到实体的主键。确定了主键以后,主键也就随着实体间的关系而迁移,形成其它实体的外键。
Fully Attributed Model : Key Based Model进一步细化,模型中加入项目所涉及到的所有实体、属性、关系以及各种完整性约束,形成 Fully Attributed Model。在这个阶段中,可能发现新的实体,因此整个建模过程是一个迭代的逐步完善的过程。
Transformation Model: 至此,细化的逻辑模型就和最终的数据库实现很接近了。因项目需要或者目标数据库系统的限制可能仍需做些调整,比如为了效率原因而引入一些冗余数据,或者改变数据类型长度等等,此模型有时不再满足第三范式。
DBMS Model: 经过上述模型,最终得到了适用于目标数据库系统的数据库结构,可以通过工具来生成 DDL脚本, ERwin中也可以直接连接到数据库服务器生成目标数据库。
下面我们开始使用 ERwin。打开 ERwin,点击工具条上的“ Create Model”按钮,在弹出窗口中选择“ Logical/Physical”,目标数据库选择“ SQL Server”,版本选择 2005/2008(选择的数据库在后面过程中可以修改)。如图 2所示:
图 2:创建模型
点击“ OK”之后出现 ERwin的工作区, ERwin缺省采用 IDEF1X表示法,如果想用 IE表示法可修改模型属性。
实体分为 Dependent Entity和 Independent Entity两种, Dependent entity用普通的矩形表示,这类实体不依赖其它实体的属性来标志自己的实例。另一类实体则需要把外键做为主键的一部分,即依赖其它实体来标志该实体的实例,这类实体用圆角矩形来表示,这两种实体稍后都会用到。
创建第一个实体 Customer并为其添加属性:
点击工具栏上的“ Entity”按钮,然后点击工作区的任意部分就会创建一个新的实体,命名为“ Customer”。实体的属性区域分为键区(存放实体的主键)和非键区(存放非主键属性),当定义关系时, ERwin会自动根据关系类型,把外键摆放在键区或者非键区,用户也可以通过拖拽来调整属性的位置。
图 3:创建实体
右键点击 Customer实体并从弹出菜单中选择“ Attributes...”菜单进入属性编辑对话框:
图 4:属性编辑对话框
点击按钮“ New”来添加“ customer id” 属性,数据类型为 Number,并设为主键。如图 5所示。在该对话框中涉及到了“ Domain”这个概念,意思是具有相同数据类型的一组数据集合(有限多个,如省份的列表,或者无限多个,如电话号码等)。 ERwin中支持自定义 Domain,定义后可以在多个实体中使用,这样可以统一的表达属性的含义,并对属性数据进行验证。
图 5:创建属性
依次输入 Customer的其它属性,并照此方法输入其它实体及其属性,完成后如图 6:
图 6:实体及属性
上图新增了 Employee实体, Employee实体定义为网站的工作人员,负责处理客户的订单以及付款信息(如果用户选择货到付款)。
对于付款方式,我们想支持信用卡付款和货到付款(用 type属性区分),对于信用卡付款,系统记录客户的信用卡号;对于货到付款,记录付款人的名字。这两种付款方式可以看成是付款信息( Payment)的子类型,我们可以用_ ( sub-category)来定义这种关系,如下图:
图 7:付款信息及其子类型
Payment的主键 Transaction number自动迁移到两个子实体中, type属性被定义为 Discriminator(用来区分子类型的属性),定义方法如下:选择“ Subtype Properties....”,在弹出的属性窗口中“ type”属性前面打勾:
图 8:定义 Discriminator
实体间的关系是展示业务规则的重要元素。首先定义 Customer和 Order实体间的关系。点击工具条上的 _ (non-identifying relationship)按钮,先单击 Customer实体,再单击 Order实体,建立关系:
图 9: non-identifying relationship
所谓 non-identifying,就是外键 customer id没有成为 Order实体主键的一部分。 Order是一个独立实体,但是它的存在却要依赖 Customer(订单中 customer id属性不能为空,需要双击关系打开属性对话框来编辑一下关系的属性:
图 10:编辑关系属性
将“ Nulls”(允许空值)设置为“ No Nulls”,同时可以在“ Verb Phrase”中键入表明关系含义的文字。(工作区上下文菜单中“ Relationship Display” ->“ Verb Phrase”可以控制这些文字是否显示在工作区上。)结果如图所示,虚线一端靠近“ Customer”实体的菱形消失了,表示外键“ customer id”不允许为空。
图 11
照此方法定义其它实体间的关系,最终结果如图:
图 12:实体关系图
有两点值得注意:
l Order Line Item是一个非独立实体,用圆角矩形表示。
l 其中 Employee定义了一个递归关系,用来表达员工的上下级关系。为了更清晰的表达这种关系,这里定义了一个 Rolename(角色),打开关系属性对话框,切换到 Rolename 标签页,在 Rolename中键入角色的名字:
图 13:定义 Rolename
在一个大的应用中,如果所有实体都显示在同一个视图中,看起来会有些混乱。这时可以将相关实体按“ Subject”组织起来,如图 14所示,创建了一个“ order” subject(相关实体可以从树形目录“ Entities”节点中拖拽到这个 subject),当转到 order subject 视图时(右键点击“ order”并选择“ Switch to”),实体间的关系变得更清晰。
图 14: Subject
对于 Payment实体的两种子类型,我们可以将它们合并到 Payment实体中,这样最后可以少两张数据库表,这个转化在 ERwin中可以通过如图所示功能按钮实现,这里不再叙述:
在菜单中选择“ Model”->“ Physical Model”切换到物理视图,“选择 Tools” ->“ Forward Engineer”->“ Schema Generation”出现属性对话框:
图 14:生成数据库
可以看到 ERwin提供了很多参数,例如用户可以选择是否生成触发器等等。点击“ Preview”可以预览 DDL脚本,点击“ Generate”就可以连接到数据库服务器来创建数据库。
ERwin涵盖了数据库设计所需的各种功能,包括数据库正向工程( forward engineer,根据数据模型来生成物理数据库)、数据库逆向工程( reverse engineer,根据已经存在的数据库来生成数据库的模型),完全比较 (complete compare,比较模型、数据库之间的差异,在迭代开发过程中非常实用,可以检查各个版本之间的差异,并生成差异报表,便于后续的维护工作 ) 。本文只展示了很少一部分功能,读者可以从 CA公司的网站上下载 ERwin Data Modeler的试用版本 (http://www.ca.com/us/data-modeling.aspx)。最后希望本文能对读者有一定帮助。