今天上午主要学习了CDM。由于所用的版本和作者的版本不同,我用的是PowerDesigner15.所以在学习的过程中,自己进行了一下整理并截图。
- 概念数据模型
1) 概念数据模型
概念数据模型CDM(Conceptual Database Model)
以下我们要完成对示例论坛系统的数据库设计工作,首先让我们建立目标系统的概念数据模型(CDM)。
在进行相关CDM演示之前,让我先简要介绍概念数据模型(CDM)的相关概念。我们进行数据库设计时,一般都是概念层次(Conceptual level)开始的。在概念层次上,你无须考虑数据库的实际物理执行细节。概念模型(CDM)描述了与任何软件或数据存储系统无关的数据库整体逻辑结构,通常包含了与物理数据库无关的数据对象,提供了一种对用于运行企业或业务行为的形象化的表达方式。
CDM功能:[v1]
(1)通过创建实体关系图表(E-R)来描述数据的组织结构。
(2)能够校验数据设计的合理性。
(3)生成指定了相应物理实现数据库的物理数据模型(PDM)
(4)能够生成用UML标准描述CDM中对象的面向对象模型(OOM)
(5)为在不同的设计阶段创建另一个模型版本,可以生成概念数据模型(CDM)
关于Palette工具面板中含义简介:
工具 | 对应名称 | 含义 |
| Pointer | 选择图形 |
| Grabber | 选定某个范围的图形 |
| Zoom In | 放大 |
| Zoom Out | 缩小 |
| Properties | 显示相应图符的属性 |
| Delete | 删除图符 |
| Package | 插入一个包(package)的图符 |
| Entity | 插入一个实体图符 |
| Relationship | 插入一个关系(Relationship)图符 |
| Inheritance | 插入一个继承(Inheritance)图符 |
| Association | 插入一个关联(Association)图符 |
| Association Link | 插入一个关联连接(Association Link)图符 |
2) 新建CDM
新建CDM
(1) 选择File->New Model[v2] ,打开New窗口,在左边模型选择列中选中Conceptual Data Model,单击OK,即确认创建概念数据模型。
(2) 双击资源浏览窗口中新创建的CDM名称图标,打开CDM模型属性窗口,进行相关属性信息设置。如下图:
对刚创建的CDM进行详细之前有必要先说说有关实体属性命名问题。
PowerDesigner默认在CDM中不能存在相同名称的实体属性,这也是考虑到可能产生的一些如主键外键等名称冲突问题,但当我们进行实际数据库设计时,可能会多次使用相同数据项(DataItem)便于理解各实体。为此需要对更改PowerDesigner相关设置。软件默认为DataItem不能重复使用(重名),需要进行以下操作:
选择Tools->Model Options,
在Model Setting设置目录中,将Data Item下的Unique Code取消选中即可,系统默认将Unique Code和Allow Reuse均选中。
同时该设置均是面向特定模型的,即针对当前模型有效,若希望在其它模型中也有此命名设置,则需要重新进行设置。不过在Check Model时,如果选择全部Check,则依旧会报DataItem重名的错误信息,这时需要我们在人为检查确认数据项无误时,可以在选择不对DataItem不检查,如下图示:[v3]
无法显示
各种数据类型对应匹配(这里只给出与SQL Server中的常用对应类型,其它DBMS可以使用类似处理)
3) 实体及各类关系
实体(Entity)
(1) 在新创建的CDM中,选择Palette工具面板中的Entity工具,再在模型区域淡季鼠标左键,即添加了一个实体图符。
|
(2) 单击鼠标右键或单击面板中Pointer工具,使鼠标处于选择图形状态。
(3) 双击新创建的实体图符,打开实体属性窗口,输入实体名称和代码。
(4) 单击OK,即完成实体创建过程。
继续上述操作,创建多个实体,分别设置为不同名称,具体信息参考示例文档。
实体创建完成后资源浏览窗口中层次结构如下所示:
现在编辑各实体的详细内容,如属性组,实体间关系等。
实体属性(Entity Attributes)
(1) 以User实体为例,打开实体User属性窗口,进入Attributes属性页,如下图示:
(2) 单击属性窗口工具栏中Add a Row工具,即在属性实体属性列表中添加了一个属性,同时设置该属性相关信息,如数据类型,是否为主标识符,是否不可为空等。
(3) 详细设置新添加的属性为UserID,作为系统唯一标识区别的用户编号,同时选择P,M,数据类型(DataType)选择Integer。如下图:
(4)
(4)对属性列进行更为详细的设置,可以通过单击对应属性列左边箭头,进入Attribute Properties窗口,可以进行更为精确详细的设置,如数据上下限,精度等。如下图:
(5)同时若要更改实体属性列表中显示的相关选项可以通过单击工具栏中Customize Columns and Filter工具以打开Customize Columns and Filter窗口[v4]
只要在列表中选择想要显示的项目即可完成设置。
标识符(Identifiers)
标识符是能够用于唯一标识实体的每条记录的一个实体属性或实体属性的集合,CDM中的标识符等同于PDM中的主键(Primary Key)或候选键(Alternate Key)。每个实体至少要有一个标识符,若一个实体中只存在一个标识符,它就自动被默认指派为该实体的主标识符(Primary Identifier)。
指定相应标识符
(1) 在双击图表中对应实体以显示实体属性窗口。
(2) 在当前实体属性窗口中选择Identifiers属性栏,如下所示:
(3) 可以通过单击工具栏上Property 工具或双击所要选择的标识符栏,进入标识符属性编辑窗口。
(4) 选择Attributes属性,可以看到当前标识符所关联的属性列表,如下图:
(5) 单击工具栏中Add Attributes工具,即可以进行为当前标识符添加属性。
关系(Relationship)
关系(Relationship)表示实体间的连接。如在一个人力资源管理系统的CDM中,员工是团队中的成员,关系”Member”连接了员工(Employee)和团队(Team),这种关系表述了每个雇员在团队中工作且每个团队都由员工组成。
建立关系(Relationship)这里以用户实体(User)和帖子实体(Post)为例
(1) 在Palette面板中左键单击Relationship工具
(2) 在实体User上单击鼠标左键,按住不放,拖拽鼠标至实体Post上后才松开,这样即建立了User和Post之间的Relationship.
(3) 单击鼠标右键或左键单击Palette面板上的Pointer工具,使鼠标返回至选择状态。
(4) 双击图表中的刚建立的两实体之间关系(Relationship)以打开关系属性窗口,便于对关系进行详细定义。
(5) 输入相应的Name和Code,选择Detail选项,进入如下属性编辑页:
(6) 选择One-Many选项,因为User和Post为”一对多”关系,且每一条Post均对应有User,因此User to Post角色的基数(Cardinality)下拉列表中选择”0,n”,在Post to User角色的基数列表中选择”1,1”。同时Role name中输入相应的角色名称。
(7) 确定修改后,单击OK,即可在模型图表中显示新建的Relationship。
(8) 若要自定义关系显示信息,可通过选择菜单栏中Tools->Display Preferences,打开Display Preferences窗口,在左边树型菜单中选择Object->Relationship[v7] ,这时即可在右侧选择你所要显示的项目了。
当然你也可以选择其它节点,实现对图符的显示属性设置。
各种类型关系(Relationship)
这部分是比较令人头疼的,不太好懂,需要投入较多时间研究。
自反关系(Reflexive relationship)
是一种实体和它自身的关系。这里用员工的管理概念来表述管理人员管理员工,同时管理人员也属于员工范畴。
(1) 左键单击Palette面板中Relationship工具
(2) 在实体内单击鼠标左键且按住不放,将鼠标拖放至实体旁的空白位置后松开鼠标。
(3) 再次单击实体即成功创建自反关系。
不过这时自反关系的图符不太雅观,可以通过先选定需要更改的图符,然后选择Tools->Display Preferences->Format[v8] ,单击Modify以打开Symbol Format窗口,然后更改Line Style属性中的Corners下拉框中选项
确认修改后,最后在单击Display Preferences窗口的OK按纽后会弹出Change Formats选择对话框,若只要将修改应该至当前的自反图符,只需选择所选定图符(Selected symbols)即可。
依赖关系(Dependent relationship)
支配关系(Dominant relationship)
强制关系(Mandatory relationship)
以上其它关系不再赘述,需要在实际使用过程加以运用才能加深进一步的理解,同时以上知识点和关系型数据库的理论知识密切相关,PowerDesigner的这些功能只是对应于这些理论的一种运用映射。
关系(Association)
Association也是一种实体间的连接,在Merise模型方法学理论中,Association是一种用于连接分别代表明确定义的对象的不同实体,这种连接仅仅通过另一个实体不能很明确地表达,而通过”事件(Event)”连接来表示。下面通过示例论坛系统的用户实体(User)和论坛栏目(ForumColumn)实体的Association来讲解。示例论坛系统中通过一个Association来表示目标系统中论坛栏目对应的版主关系,包括了属性创建时间(DateCreated)用于记录版主添加的时间。
创建Association
(1) 在Palette面板中单击Association Link工具[v9]
(2) 在实体User内单击鼠标左键且按住不放,拖放鼠标至另一实体ForumColumn上,松开鼠标左键,即在两实体间创建了Association。如下图:
(3) 双击模型图表中刚创建的Association图符以打开Association Properties窗口。
(4) 输入Association的Name和Code,选择Attributes属性页,添加实体属性DateCreated,并设置相关属性[v11] ,如下图:
(5) 同时可以通过在模型图表中双击相应的Association Link[v12] 来打开Association Link Properties来编辑连接属性:
按类似方法可以创建论坛栏目实体(ForumColumn)和角色实体(Role)之间的Association。
继承(Inheritance)
Inheritance允许你定义一个实体为另一个更一般(常规)的特例。涉及到继承的实体之间有着共同相似的特征,但却是不同的。超类(或父类)指那些包含共同特征的更一般的类,而特例则被成为子类型,包含了一些更为具体和特殊的特例。
关于继承方面的例子不少,稍具有面向对象观念的都应该能够理解,不再赘述。
而PowerDesigner中关于继承方面的操作过程在这只作简要介绍:
(1) 在Palette面板中单击Inheritance工具
(2) 左键单击子类型,按住鼠标不放,拖放至鼠标至父类型实体图符中,松开鼠标,即完成了一个Inheritance Link的创建
(3) 要再次添加另一子实体时,可以单击Inheritance工具,从半圆形图处拖动鼠标至另一子类型实体,然后松开鼠标即可。
(4) 双击新创建的继承图符或实体之间的连接线即可打开弹出Inheritance Properties编辑窗口。
(5) 输入相应Name和Code,完成基本设置,单击OK,即完成创建过程。
现在已经基本上完成了目标系统的概念建模过程,为此下一步我们需要校验已经设计好的模型,便于能够正确地转换为物理数据模型(PDM)。
检验模型(Check)
(1) 选择Tools->Check Models,打开Check Model Parameters窗口,如下图:
在这你可以对需要Check的项目进行自定义选择。
(2) 确认选择后,单击OK,则PowerDesigner开始对模型进行检验。
(3) 完成检验后,PowerDesigner会将检验结果在输出列表中显示出来
我们可以根据所列出的错误信息对模型进行修改,错误信息分别有Error,Warning, Automatic correction三种,同时只要经过检验后没有Error一类的错误信息,我们就可以将该CDM转化为对应PDM。
4) 生成PDM
生成PDM
当你从一个CDM生成PDM时,PowerDesigner将CDM中的对象和数据类型转换为PDM对象和当前DBMS支持的数据类型。
PDM转换概念对象到物理对象的对象关系如下表:
CDM对象 | 在PDM中生成的对象 | 备注 |
实体(Entity) | 表(Table) |
|
实体属性(Entity Attribute) | 列Table Column) |
|
主标识符(Primary Identifier) | 根据是否为依赖关系确定是主键或外键 |
|
标识符(Identifier) | 候选键(Alternate key) |
|
关系(Relationship) | 引用(Reference) |
|
|
|
|
|
|
|
同一个表中的两列不能有相同的名称,如果因为外键迁移而导致列名冲突,PowerDesigner会自动对迁移列重命名,新列名由原始实体名的前三个字母加属性的代码名组成。主标识符在生成PDM中的主键和外键,非主标识符则对应生成候选键。
在PDM中生成的键类型取决于CDM中用于定义一个Relationship的基数和依赖类型。[v13]
1. 非依赖性一对多关系(Independent one-to-many relationships)
在非依赖性关系中,”一”端的实体主标识符将转化为:
(1) 由关系中”一(one)”端的实体生成的表的主键(Primary key)
(2) 由关系中”多(many)”端的实体生成的表的外键(Foreign key)。
如下图所示:
|
生成的PDM中的Independent one-to-many relationship
2. 依赖性一对多关系(Dependent one-to-many relationships)
在依赖性关系中,被依赖端的主标识符转化为主键,依赖端则产生一个与被依赖端主标识符同名称的字段同时作为同时作为依赖端的主键和外键,如果依赖端实体中已经存在主标识符转化为主键,则该键同主键共同组成主键,同时作为外键。
3. 非依赖性多对多关系(Independent many-to-many relationships)
在非依赖性多对多关系中,各实体的主标识符(Primary key)迁移至一个新生成的连接表中都作为外键,同时共同组成这个新连接表的主键,各实体的主标识符也转化为其所生成表的主键(Primary key)。下图所示CDM,每个雇员可以是一个或多个团队的成员,同时每个团队也可能包含一个或多个的雇员。
4. 非依赖性一对一关系(Independent one-to-one relationships)
在非依赖性一对一关系中,如果没有定义支配角色(Dominant role)的方向,则各实体的主标识符均自动迁移转化为另一实体生成的表的外键。
个人觉得在生成PDM过程中有关生成主键,外键等问题比较棘手,我自己在生成该示例论坛系统的PDM时就遇到这方面问题,后来在多次对一些设计得比较优秀的开源系统进行反向工程,然后慢慢研究借鉴,发现自己在设计过程的一些问题,因此觉得这方面只有多多研究才能逐渐得心应手。
准备差不多了,开始生成我们需要的PDM。
(1) 选择菜单栏上Tools->Generate Physical Data Model弹出PDM Generation Options窗口,如下图:
(2) 选择Generate Physical Data Midel,在DBMS下拉列表中选择相应的DBMS,输入新物理模型的Name和Code.
(3) 若单击Configure Model Options则进入Model Options窗口,可以设置新物理模型的详细属性。
(4) 选择PDM Generation Options中的Detail页,设置目标PDM的属性细节。
(5) 单击Selection页,选择需要进行转化的对象。
(6) 确认各项设置后,单击确定。即生成相应的PDM模型。
生成PDM后,我们可能还会对前面的CDM进行更改,若要将所做的更改与所生成的PDM保持一致,这时可以对已有PDM进行更新。这时操作也很简单,Tools->Generate Physical Data Model,在打开的PDM Generation Options窗口中选择Update existing Physical Data Model,并通过Select model下拉框选择将要更新的PDM。如下图:
最后我们在CDM部分的工作应该就是根据所建立的概念模型生成文档了,文档是作为设计成果的输出,也用于开发小组成员交流的媒介,其重要性不能忽视。这方面我们可以参考前面生成报告(Report)方面的内容。
[v1]关于CDM功能,光靠描述看不能深刻理解,希望在以后的操作中能够深刻理解。
[v2]教程中这个是New,我的是New Mode
[v3]这个地方一直都没有看懂。不知道怎么操作。所有这个图片没有办法截取。
[v4]这里也是看了很久都没有看清楚,不知道怎么操作!
[v5]当时找这个工具找了好久,不知道说的是这个Customize Columns and Filter工具
[v6]这个就是打开Customize Columns and Filter工具的界面。
[v7]我在这里是Content
[v8]这个我是从头操作的的,加上了Tools。
[v9]不知道怎么回事,我的这个工具是灰色的,不能用。所有下面没有办法继续。
[v10]解决办法:tools->model options->Notation 改为"E/R+Merise"
[v11]关于这个实体属性我没有弄明白。
[v12]双击连接线,会出现如下图。
[v13]关于这几个关系,还要细看。没有很搞懂,这里的截图是我直接截教程上面的图片。