实验内容
学生信息管理中有如下实体型:
student实体
General选项卡设置通用属性,Attributes选项卡设置实体包含的属性,Identifiers选项卡设置实体的码,Notes选项卡记录备注信息,Rules选项卡设置规则。General和Attributes选项卡中的内容必须设置,其他内容可以根据需要设置。
选择General选项卡,设置该实体的Name属性为student,Code属性与Name属性一致即可。
选择Attributes选项卡,设置该实体所包含的属性。Name列设置属性的名称,Code列设置属性的代码,Data Type列设置属性的数据类型,Domain列设置属性的域。M和P列设置属性的约束。M列设置属性是强制非空的,属性Sname要求强制非空。P列设置该属性是主键中的属性,属性Sno设置为主键。D列表示该属性被显示。一般在设置实体的属性时,一定要设置实体的主键,如果某个属性被设置为主键中的属性则自动强制非空。
Name与Code的区别是:Name供显示使用,Code是之后物理数据模型中表(或字段)的代码。
单击Identifiers选项卡,设置实体主、次标识符的定义界面。主标识符指主键,只能有一个,次标识符指其他候选键,可以有多个。主标识符后面的P为选中状态,由于前面已经指定属性Sno为主键,系统会自动创建主标识符并自动命名为Identifier_1。
设置属性Sid为候选键。单击工具栏上的Add a Row(添加)按钮,出现一行,系统自动命名为Identifier_2,修改为Sid_u,Name和Code相同即可。
设置规则,要求属性Ssex只能取“女”或“男”。
在General选项卡中输入规则名为Ssex_r,单击Expression选项卡,输入规则内容。
创建course实体
按照上面的方法创建course实体。在General选项卡中,设置该实体的Name属性为course,Code属性与Name属性一致即可。Cno为主键,即主标识符。Cname强制非空。
创建department实体
按照上面的方法创建department实体。在General选项卡中,设置该实体的Name属性为department,Code属性与Name属性一致即可。Dno为主键,即主标识符,Dname为候选键,即次标识符。
创建teacher实体
按照上面的方法创建teacher实体。在General选项卡中,设置该实体的Name属性为teacher,Code属性与Name属性一致即可。Tno为主键,Tname强制非空,创建规则Tsex_r要求Tsex取值只能是“女”或“男”。
设置student和course之间的联系
在PowerDesigner中,有Association(实体间的联系)与Relationship(实体间的关系),二者之间的区别是:前者用于m:n联系、多个实体型之间的联系,在转换为PDM(物理数据模型)时对应一个表(另外,也用于自身带有属性的1:n和1:1联系,但在转换为PDM时不对应一个表,而是附加属性);后者用于不带属性的1:n和1:1联系,在转换为PDM时附加属性(1:n在n方附加1方的主键,1:1由Dominant Role决定在其中一方附加对方的主键)。
student和course之间应该使用Association。单击设计元素面板上的代表Association的图标,将鼠标指针指向设计区域的合适位置,单击鼠标左键,在设计区域中创建一个Association,自动命名为Association_1。
双击Association_1,出现Association_1的属性设置界面。在General选项卡中设置Name为sc,code与Name相同即可。选择Attributes选项卡,添加Grade属性。
单击设计元素面板上的代表Association Line的图标,然后将实体student和联系sc连接起来,同样将实体course和联系sc连接起来。
设置teacher和course之间的联系
参照student和course之间的联系设置teacher和course之间的联系tc,联系自身有两个属性:Location(授课地点)、Term(授课学期)。
设置student和department之间的关系
在设计元素面板上单击代表Relationship的图标,光标置于department实体,按下左键并从department实体拖动到student实体,此时,在两个实体间创建了一个Relationship。
双击student和department之间的关系,在General选项卡设置关系的Name为ds,Code与Name一致即可。在Cardinalities选项卡中设置关系类型和每个方向上的基数(Cardinality)。
设置关系类型为One-Many,意思是由Entity1到Entity2为One-Many。由于创建该关系时,鼠标是由department拖动到student,因此,Entity1指department,Entity2指student,也可以在General选项卡中重新设置。
在Cardinalities选项卡中,关系的每个方向都包含一个分组框,每个分组框中包括下列属性:
Role name:用来描述该方向关系的作用,例如,在department to student分组框中可以填写have,而在student to department分组框中可以填写belong to。
Dependent:用来表示该方向两个实体之间的依赖关系,只有子实体依赖于父实体。
Mandatory:表示该方向具有强制特性。
Cardinality:表示该方向上关系的基数。例如,对于department to student,基数指对于department中的一个院系在student中可能存在的最大与最小实例数。现实世界中,一个院系可以拥有多个学生,也可以没有任何学生,所以department to student方向的基数应选择“0,n”,不设置Mandatory;而一个学生必须属于一个院系,并且只能属于一个院系,所以student to department方向的基数应选择“1,1”,设置Mandatory。
Dominant role只在一对一联系中才进行设置。
设置teacher和department之间的关系td_belongto
参照student和department之间的关系,创建teacher和department之间的关系td_belongto,由department到teacher是“1:n”关系。在General选项卡设置关系的Name为td_belongto,Code与Name一致即可。
Role name:在department to teacher分组框中可以填写have,在teacher to department分组框中可以填写belong to。
Cardinality:现实世界中,一个院系可以拥有多个教师,也可以没有任何教师,所以department to teacher方向的基数应选择“0,n”,不设置Mandatory;而一个教师必须属于一个院系,并且只能属于一个院系,所以teacher to department方向的基数应选择“1,1”,设置Mandatory。
设置teacher和department之间的td_manage关系
创建teacher和department之间的关系td_manage,是“1:1”关系。在General选项卡设置关系的Name为td_manage,Code与Name一致即可。
Role name:在department to teacher分组框中可以填写managed by,在teacher to department分组框中可以填写manage。
Cardinality:现实世界中,一个院系只能而且必须有一个院长,所以department to teacher方向的基数应选择“1,1”,设置Mandatory;而一个教师可以不是院长,如果是则只能担任一个院系的院长职务,所以teacher to department方向的基数应选择0,1,不设置Mandatory。
Dominant role:只有在一对一联系中出现,表示支配方向。所选择的支配方向在生成PDM时产生一个参照。例如,选择teacher->department,在生成PDM时,将在department表中增加tno属性,存储某院系的院长编号,而这个属性是department表的一个外键,参考teacher表,结合Cardinality中department to teacher方向的基数“1,1”,意味着该外键不能接受空值。
设置course实体集的自反联系course_self
假设某门课可以是其他多门课的先行课,而一门课如果有先行课则只能有一门先行课,这样course实体集内部存在“1:n”关系。
在设计元素面板上单击代表Relationship的图标,光标置于course实体,按下左键并在course实体上拖动一段距离,此时,在course实体上创建了一个Relationship。右击鼠标,进入对象编辑状态。双击course自身的关系,在General选项卡设置关系的Name为course_self,Code与Name一致即可。
Role name:在上面的course to course分组框中可以填写pioneer,在下面的course to course分组框中可以填写succeed。
Cardinality:现实世界中,某门课可能不是先行课,也可能是多门课的先行课,所以,上面的course to course方向的基数应选择“0,n”;而一门课可以没有先行课,如果有先行课则只能有一门,所以,下面的course to course方向的基数应选择“0,1”。
至此,根据上面E-R图创建的CDM已经完成。
PowerDesigner自动生成PDM
PowerDesigner的PDM可以描述逻辑结构和物理结构,根据CDM生成PDM。
检查CDM的正确性
在CDM设计界面上,选择Tools|Check Model,检查CDM的正确性,如果存在错误,请检查并更正。
将CDM转换为PDM
在CDM不存在错误(警告不影响模型转换)的情况下,可以将CDM转换为PDM。在CDM设计界面上,选择Tools|Generate Physical Data Model,出现模型转换选项设置界面。在General选项卡中,设置转换生成PDM的基本属性,包括使用哪种DBMS(请选择SQL Server2005),要生成的PDM模型的Name属性(请设置为SIM_PDM),Code属性与Name属性一致即可。Detail选项卡设置转换过程中的选项,例如转换过程中是否需要检测CDM模型,转换生成表时是否增加前缀,各种约束的命名规则等。Selection选项卡设置需要转换的实体。
PDM如下图所示。