实验五 数据库设计实验
1.实验目的
掌握数据库设计基本方法及数据库设计工具。
2.实验内容和要求
掌握数据库设计基本步骤,包括数据库概念结构设计、逻辑结构设计,物理结构设计,数据库模式SQL语句生成。能够使用数据库设计工具进行数据库设计。
3.实验重点和难点
实验重点:概念结构设计、逻辑结构设计。
实验难点:逻辑结构设计。逻辑结构设计虽然可以按照一定的规则从概念结构转换来,但是由于概念结构通常比较抽象,较少考虑更多细节,因此转换而成的逻辑结构还需进一步调整和优化。逻辑结构承接概念结构和物理结构,处于核心地位,因而是数据库设计的重点。
4.实验过程
设计一个简单的学生选课系统的数据库。
数据库包含学生信息,课程信息,学生选课信息。
(1)数据库概念结构设计
三个实体:学生,课程,选课。每个实体的属性、码如下:
①学生Student:
文字描述 | 标识符 |
---|---|
学号(主码) | Sno |
姓名 | Sname |
性别 | Ssex |
年龄 | Sage |
班级 | class |
院号 | Dno |
②课程Course:
文字描述 | 标识符 |
---|---|
课号(主码) | Cno |
课程名 | Cname |
学时数 | Hours |
学分 | Credit |
类型 | Type |
开设院系 | Dno |
③选课表SC:
文字描述 | 标识符 |
---|---|
学号(主码) | Sno |
课号(主码) | Cno |
成绩 |
E-R图:
(2)数据库逻辑结构设计
按照数据库设计原理中概念结构转化成逻辑结构的规则,每个实体转换成一个关系,多对多的联系也转换成一个关系。
因此,根据上述画出的E-R图设计数据库逻辑结构。
①创建概念模型
在“文件”-“新建模型”中,创建一个概念模型Conceptual Diagram,并命名为ST:
②根据E-R图创建实体
a.建立新Enity-Student
单击paletee中的Enity
然后在空白处单击:
注:若没有看到palette工具栏,则打开“工具”->“自定义菜单和工具栏”
选中“Palette”即可。
b.修改Enity属性
空白处出现一个Enity后,再在paltee中单击“鼠标”按键恢复,双击空白处建立的Enity,如下图:
“常规”:书写name的时候,code自行补全,name可以是英文的也可以是中文的,但是code必须是英文的。
“属性”Attributes:
结果:
Name: 实体名字一般为中文
Code: 实体代号,一般用英文
Data Type:实体的数据类型
Length:实体的数据长度
Domain域表示属性取值范围如可以创建10个字符的地址域
M:Mandatory强制属性,表示该属性必填。不能为空
P:Primary Identifer是否是主标识符,表示实体唯一标识符
D:Displayed显示出来,默认全部勾选
c.创建Enity-Course
d.创建Association-SC
1)Palette中的Association图标灰色
问题:
解决:
Tools -> Model options ->Notation, 将Notation修改为E/R+Merise
解决:
2)创建选课SC-联系对象
1】单击Palette中的association,再单击空白处:(与创建Enity的步骤相同)
2】双击创建的“Association_1”,修改名字与属性:
3】结果
3)Association LInk建立联系
单击Palette中的Association Link,分别将学生表与选课联系、课程表与选课联系。
双击关系的“线”,改为一对多:
(3)数据库物理结构设计
①check model
工具-->check model:
②自动转换得到数据库物理结构
a.生成PDM
工具-->Generate Physical Data Model
b.运行结果
(4)生成SQL语句
①生成数据库
数据库-->生成数据库
设置生成sql语句的文件夹和文件名:
②查看生成结果
/*==============================================================*/
/* DBMS name: MySQL 5.0 */
/* Created on: 2023/12/2 19:56:00 */
/*==============================================================*/
drop table if exists Course;
drop table if exists Course2;
drop table if exists Student;
/*==============================================================*/
/* Table: Course */
/*==============================================================*/
create table Course
(
Cno char(12) not null,
Cname char(12),
Hours int,
Credit int,
Type char(12),
Dno char(12),
primary key (Cno)
);
/*==============================================================*/
/* Table: Course2 */
/*==============================================================*/
create table Course2
(
Sno char(12) not null,
Cno char(12) not null,
Grade int,
primary key (Sno, Cno)
);
/*==============================================================*/
/* Table: Student */
/*==============================================================*/
create table Student
(
Sno char(12) not null,
Sname char(12),
Ssex char(2),
Sage int,
Class char(12),
Dno char(12),
primary key (Sno)
);
alter table Course2 add constraint FK_Course foreign key (Sno)
references Student (Sno) on delete restrict on update restrict;
alter table Course2 add constraint FK_Course2 foreign key (Cno)
references Course (Cno) on delete restrict on update restrict;
③测试生成结果
在mysql workbench中运行上面生成的sql语句:
a.学生表:
b.课程表:
c.选课表:
5.实验总结
数据库的设计的基本步骤包括数据库概念结构设计、逻辑结构设计,物理结构设计。
其中概念结构设计通常用E-R图表示。
逻辑结构设计比较重要,需要从E-R图转换得到,并需要完成一些细节,进行调整优化。
物理结构设计则需要完成存储路径的设计和存储结构的设计,需要根据实际情况进行设计。例如每个关系的存储结构,具体的数据类型和长度都要符合实际,同时尽量减小开销。使
用类似PowerDesigner的工具可以辅助设计,方便的进行模型间的转化,并可以直接生成SQL语句,有必要掌握使用的基本方法。