一、实验目的
(1)了解数据库设计的过程
(2)学会用PowerDesigner等数据库设计工具经行数据库设计
(3)学会从实际需求进行数据库的设计
二、验证性实验
1、根据详细步骤完成奖学金模块数据库设计
用PowerDesigner软件设计奖学金模块。该模块的功能设计中有4个实体,具体信息如下表所示。
(1) 利用PowerDesigner软件设计概念模型
概念模型也称为信息模型,以ER图理论为基础,并对其经行了扩充。该模型是从用户的观点对信息经行建模,主要用于数据库的概念数据模型设计。利用PowerDesigner软件设计概念模型时,一般会经过创建实体,添加实体之间的关系两个阶段。
① 创建实体
打开PowerDesigner软件,选择File -> New Model ,打开New Model对话框,然后在该对话框中选择“Conceptual Data Model”模型类型,同时设置“Model name”模型名称的信息,如下图所示:
单击Ok后进入概念数据模型主界面,为了保证概念数据模型图能绘制到一个表格中,我们要通过选择View -> Zoom In 命令,对图标窗口中的表格经行放大,如下图所示,
为便于查看,我们对中间的表格进行标注,方法是通过选择Toolbox面板中的Free Symbols中的Text工具按钮,对其标注为奖学金模块,如下图3-3所示。如果没找到Toolbox面板,可以通过选择菜单View -> Toolbox 来调出Toolbox面板。
接着我们通过选择Toolbox中的Entity工具 添加班级实体,如下图所示。
双击实体,弹出实体属性对话框Entity Properties。在General选项卡中,设置用于标识实体名称的Name选项为“班级表”,设置用于标识实体代码的Code选项为“t_class”,设置用于对实体注释的Comment选项为”这是关于班级的表格“
·单击用来设置实体属性的Attributes选项卡,其中Name字段用于标识字段名称,Code字段用于标识字段代码,Data Type字段、Length字段和Precision字段用于设置字段的类型。
单击确定,得到最终的关于班级的实体信息
下面我们以同样的方式设计”奖学金模块“中的学生、成绩、奖学金实体
最终,关于奖学金模块的4个实体对象具体信息
② 添加实体之间的关系
在数据库设计中,实体之间存在三种关系,分别是”一对一关系“,”一对多关系“,”多对多关系“。在此次设计中,我们先添加班级与学生之间的关系。选择Toolbox中的Relationship工具 ,为创建好的班级实体和学生实体添加联系
添加成功后,双击关系图标,弹出Relationship Properties对话框,设置班级实体与学生实体之间的属性信息。在General选项卡中,设置用来标识实体间关系名称的Name选项为班级学生关系,设置用来标识实体间关系代码的Code选项为class_stu_r,设置对实体经行注释的Comment选项为班级与学生的关系
在Cardinalities选项卡中,存在一个Cardinalities选项组,可用来设置实体间的各种关系。班级与学生是一对多关系,我们选择One-Many选项
单击确定,就设置好了班级与学生实体之间的关系
以同样的方式创建并设置其他的实体之间的关系。学生实体与成绩实体是一对一关系One-One,学生实体与奖学金实体是多对多关系Many-Many
至此,关于奖学金模块的概念模型设计完成
(2) 利用PowerDesigner软件转换生成物理数据模型
物理数据模型,就是根据计算机系统的特点,为给定的概念数据模型确定合理的存储结构和存取方法。其中合理主要指设计出的物理数据库占用的存储空间少,对数据库上数据的操作能有更高的效率。
当概念数据模型设计完成后,我们选择Tool->Generate Physical Data Model命令,弹出”PDM Generation Option“对话框,然后在该对话框中设置DBMS为MySQL5.0,同时设置name,Code都为scholarshipPDM
单击确定,在物理模型主界面中会根据概念模型,结合所给出的数据库管理系统设计出合理的表和表之间的关系
至此,即完成了订单管理模块的物理数据模型。
(3) 生成数据库创建脚本
生成物理数据模型后,就可以利用PowerDesigner软件,将其转换为数据库脚本。打开物理数据模型scholarshipPDM,选择Database -> Generate Database 命令,打开Generate Database对话框,然后在对话框中设置数据库脚本的名称和位置
打开数据库脚本文件,具体内容如下:
/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2015/4/18 19:14:24 */
/*==============================================================*/
drop table if exists stu_scholarship_r;
drop table if exists "t_ scholarship";
drop table if exists t_class;
drop table if exists t_grade;
drop table if exists t_stu;
/*==============================================================*/
/* Table: stu_scholarship_r */
/*==============================================================*/
create table stu_scholarship_r
(
studentId int not null,
scholarshipId int not null,
primary key (studentId, scholarshipId)
);
alter table stu_scholarship_r comment '学生与奖学金之间的关系';
/*==============================================================*/
/* Table: "t_ scholarship" */
/*==============================================================*/
create table "t_ scholarship"
(
scholarshipId int not null,
scholarshipNamevarchar(20),
department varchar(40),
money float(8,2),
primary key (scholarshipId)
);
alter table "t_ scholarship" comment '这是关于奖学金信息的表格';
/*==============================================================*/
/* Table: t_class */
/*==============================================================*/
create table t_class
(
classId int not null,
classNamevarchar(20),
classTeachervarchar(20),
primary key (classId)
);
alter table t_class comment '关于班级的表格';
/*==============================================================*/
/* Table: t_grade */
/*==============================================================*/
create table t_grade
(
gradeId int not null,
studentId int,
chinese smallint,
maths smallint,
extraActivitiessmallint,
primary key (gradeId)
);
alter table t_grade comment '这是关于成绩的信息';
/*==============================================================*/
/* Table: t_stu */
/*==============================================================*/
create table t_stu
(
studentId int not null,
classId int,
gradeId int,
name varchar(20),
sex numeric(1,0),
primary key (studentId)
);
alter table t_stu comment '这是关于学生的信息';
alter table stu_scholarship_r add constraint FK_stu_scholarship_r foreign key (studentId)
references t_stu (studentId) on delete restrict on update restrict;
alter table stu_scholarship_r add constraint FK_stu_scholarship_r2 foreign key (scholarshipId)
references "t_ scholarship" (scholarshipId) on delete restrict on update restrict;
alter table t_grade add constraint FK_stu_grade_r2 foreign key (studentId)
references t_stu (studentId) on delete restrict on update restrict;
alter table t_stu add constraint FK_class_stu_r foreign key (classId)
references t_class (classId) on delete restrict on update restrict;
alter table t_stu add constraint FK_stu_grade_r foreign key (gradeId)
references t_grade (gradeId) on delete restrict on update restrict;
三、观察与思考
(1)使用PowerDesigner将概念模型转换成物理模型后,实体、属性、联系有哪些变化?
当概念模型转换成物理数据模型时,实体变成了具体的数据库表,实体的属性转化为表中的列。联系在概念模型中表现为实体之间的关联,而在物理模型中,这些联系通常通过外键约束在相关表之间建立。
(2)PowerDesigner工具中的自动的模型转换是否符合模型转换的理论规则?
PowerDesigner在将概念模型转换为物理模型时,通常遵循标准的模型转换规则。
(3)尝试设计一个一对一的实体联系,看看PowerDesigner工具将如何处理?结合模型转换的理论规则,说说PowerDesigner工具这样处理是否妥当?你是否能想出更有创新的处理办法?
对于一对一的关系,PowerDesigner通常会在其中一个实体的表中添加另一个实体的主键作为外键,或者共享一个主键。理论上,一对一关系可以有两种处理方式:一种是在一方实体中增加另一方的主键作为外键,另一种是将两个实体合并为一个实体,共享一个主键。
PowerDesigner的处理方式是妥当的,因为它遵循了一对一关系的标准数据库设计原则。然而,更创新的方法可能包括使用视图或触发器来实现逻辑上的一对一关系,即使物理上两个实体各自有独立的主键。这种方法可以在不改变物理结构的情况下提供更灵活的数据访问和控制。