如何使用PowerDesigner软件进行数据库设计(多对多关系)
1 多对多关系示例
1、表名和字段
学生表:Student(s_id,s_name,s_birth,s_gender) -->学生编号,学生姓名,,出生年月,学生性别
课程表:Course(c_id,c_name) -->课程编号,课程名称
教师表:Teacher(t_id,t_name) -->教师编号,教师姓名
成绩表:Score(s_id,c_id,s_score) -->学生编号,课程编号,分数
教师—课程表(teach):Teach(t_id,c_id)
2、表之间的关系
学生与课程之间是多对多(m:n)的关系:一名学生要学习多门课程,一门课程有多名学生学习。
教师与课程之间是多对多(m:n)的关系:一个老师可以上多门课程,一门课程可以由多个老师上
注意:多对多的关系,会生成第三张表,将多对多的关系转换成一对多的关系
2 创建CDM
点击菜单栏“File”,点击“New Model”,打开New Model对话框,在该对话框中:
①选择第二个,Model types;
②选择第二个,Conceptual Data Model;
③默认选中了Conceptual Diagram
④在Model name处为模型起一个名字,在本例中命名为:sct;
⑤点击ok。
将Diagram_1改名,改成CDM,然后点击保存按钮,选择合适的路径保存该模型。
在最右边的Toolbox,选择Conceptual Diagram,选择第2个图标,在中间的绘图区域绘图,有几个实体,就点几下鼠标(在本例中有三个实体,因此绘制三个),然后将鼠标恢复成箭头状态。
①双击第一个实体图标(刚刚创建的蓝色的图像),根据Student表(s_id,s_name,s_gender,s_birthday)进行绘制;
②进入General界面,更改Name,本例中更改为:Student;
③点击Attributes,添加属性,在Name处填写字段名,在Data Types处选择数据类型(两个图标都是修改数据类型的选项),如果该字段为主键,则勾选中间列(Primary Identifier);
④点击Identifiers,在Name处添加主属性,点击下方的“应用”,再点击确定。
其余的两个实体图标也按照上面的方法进行设置,设置结果如下所示:
为了使实体图看起来更美观,为实体图设置字体等。鼠标右击Student实体图,选择选择Format,然后点击Font选项卡,在这里可以修改字体,最后点击“应用”,再点击“确定”即可,Teacher和Course实体图也是同样操作。
3 建立实体之间的联系
①点击Toolbox下的Conceptual Diagram下的第3个小图标(Relationship);
②将鼠标按住从Student框内拉到Course框内,再松开鼠标,然后将鼠标切换回去箭头,Teacher和Course也相同。
双击Relationship_1部分,会弹出关系窗口,在General选项卡中将Name改名,学生和课程之间的关系是成绩,因此将Name修改为Course。然后点击Cardinalities选项卡,在Student to Course部分选择1:n,在Course to Student部分选择1:n,点击最下面的应用,再点击确定。
双击Relationship_2,在General选项卡中将Name改名,老师和课程之间的关系是上课,因此将Name修改为Teach。然后点击Cardinalities选项卡,在Teacher to Course部分选择1:n,在Course to Teacher部分选择1:n,点击最下面的应用,再点击确定。得到下面的效果:
4 检查CDM
点击最上方菜单栏的Tools选项,选择Check Model,打开检查模型的界面,根据自己的需求来选择检查的项目,在本例中选择全部检查,点击确定后,会打开Result List窗口,如果该窗口下什么都没有显示,代表模型并没有检查出错误,如果显示了信息,代表检查到了错误。
5 将CDM转换成PDM
点击最上方菜单栏的Tools选项,选择Generate Physical Data Model,则会弹出以下窗口,在DBMS一栏中选择自己使用的数据库,本例中使用的数据库是MySQL,因此选择MySQL 5.0,该版本可以兼容MySQL 8.0版本数据库,然后点击应用,点击确定。
这时会打开以下页面,在这个页面中,<pk>
代表了主键<fk>
代表了外键。
这时界面上会显示两个CDM,会产生冲突,所以需要将该页面的CDM改名为PDM。
这时需要再次将PDM保存,点击保存的按钮,选择合适的文件夹下进行保存。
保存之后,需要对Score表进行编辑。双击Score表,打开表格属性的对话框,在Columns选项卡中再增加一列成绩s_score。点击应用,点击确定。
修改之后,在页面上显示效果如下:
6 由PDM生成sql文件
切换到PDM页面,选择菜单栏中的Database(注:在CDM页面没有Database选项),点击Generate Database。
在弹出的对话框中,先修改sql文件存放的路径,然后修改sql文件的名字,点击应用,点击确定。
紧接着弹出以下窗口,点击Edit,可以查看生成的sql文件。生成了sql文件之后,就可以从数据库中将这个sql文件导入了。
生成的sql文件如下:
/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2022/1/26 18:15:25 */
/*==============================================================*/
drop table if exists Course;
drop table if exists Score;
drop table if exists Student;
drop table if exists Teach;
drop table if exists Teacher;
/*==============================================================*/
/* Table: Course */
/*==============================================================*/
create table Course
(
c_id varchar(10) not null,
c_name varchar(100),
primary key (c_id)
);
/*==============================================================*/
/* Table: Score */
/*==============================================================*/
create table Score
(
s_id varchar(20) not null,
c_id varchar(10) not null,
s_score decimal(5,2),
primary key (s_id, c_id)
);
/*==============================================================*/
/* Table: Student */
/*==============================================================*/
create table Student
(
s_id varchar(20) not null,
s_name varchar(50),
s_gender varchar(2),
s_birthday date,
primary key (s_id)
);
/*==============================================================*/
/* Table: Teach */
/*==============================================================*/
create table Teach
(
t_id varchar(20) not null,
c_id varchar(10) not null,
primary key (t_id, c_id)
);
/*==============================================================*/
/* Table: Teacher */
/*==============================================================*/
create table Teacher
(
t_id varchar(20) not null,
t_name varchar(50),
primary key (t_id)
);
alter table Score add constraint FK_Score foreign key (s_id)
references Student (s_id) on delete restrict on update restrict;
alter table Score add constraint FK_Score2 foreign key (c_id)
references Course (c_id) on delete restrict on update restrict;
alter table Teach add constraint FK_Teach foreign key (t_id)
references Teacher (t_id) on delete restrict on update restrict;
alter table Teach add constraint FK_Teach2 foreign key (c_id)
references Course (c_id) on delete restrict on update restrict;