【数据库原理】概念结构、逻辑结构设计案例

概念结构设计宏观步骤.

依据案例的数据流图DFD以及数据字典DD:

  • 建立局部E-R模型
  • 合并优化多个局部E-R模型
  • 得到全局E-R模型

局部E-R模型设计.

以学校中的教师任课以及学生选课关系为例,分析其中所涉及的数据结构以及多个数据结构间的联系,可以得到如下所示的实体间的语义约定:

  • 一名学生可以选修多门课程,一门课程也可以被多名学生选修,所以课程实体与学生实体之间的选课关系是一个m:n的联系;
  • 一个系别可以拥有多名学生,而一个学生只能属于一个系别,所以学生实体和系别实体之间的属于关系是一个n:1的联系;
  • 一个系别可以开设多门课程,而一门课程只能由一个系别开设,所以系别实体和课程实体之间的开设关系是一个1:n的联系;
  • 一名教师可以教授多门课程,一门课程也可以由多名教师合作教授,所以课程实体与教师实体之间的任课关系是一个m:n的联系;
  • 一个系别可以聘请多名教师,而一个教师却只能被一个系别所聘请,所以系别实体和教师实体之间的聘请关系是一个1:n的联系;

将上述合乎常理的语义约定中,涉及的数据结构转化为E-R图中的实体,涉及的联系转化为E-R图中的联系,得到的部分E-R图如下所示:
在这里插入图片描述
在这里插入图片描述

E-R图冲突.

1.属性冲突.

  • 值域冲突】属性的类型、取值范围或取值集合不同,以学号为例,可以将其定义为数值型,也可以将其定义为字符型;再比如年龄,既可以用出生年月暗示,也可以之间使用数值表示的年龄;
  • 取值单位冲突】例如学生体重,可使用Kg为单位衡量,又可以使用g为单位衡量。

属性冲突属于用户业务上的约定,与用户进行协商后具体解决即可,例如统一学生的学号为字符型,因为可能包括A、B、C,体重统一用T为单位衡量,因为学生不愿意看到自己的体重是一个大数值。

2.命名冲突.

有关命名的冲突可能发生在实体名、属性名和联系名之间,最为常见的属性名之间的冲突,大多表现为同名异义或异名同义的语义歧义问题,也不知道语文是怎么学的。

  • 同名异义】源于中华文化的博大精深,例如“单位”这个属性,在某些情况下代表一个人工作的组织;另外的应用环境中又表示衡量物体某种属性的基准;
  • 异名同义】再一次源于中华文化的博大精深,比如说我的手机号码是12345678999,它可以被称为“联系方式”,也可以被称为“手机号码”,还能被称为“取件凭证”。

命名冲突和属性冲突类似,需要与用户协商后具体解决。

3.结构冲突.

  • 同一个对象在不同的应用中有不同的抽象,可能既是实体又是属性,例如系别作为一个表示学校中某个专业的实体,也可以是学生实体的属性之一。
    这类冲突在解决时需要统一对于对象的抽象,或将实体转换为属性,或将属性转换为实体。
  • 同一个实体在不同应用场景下的组成属性不同。
    解决方法是统一属性集为各个局部E-R图中属性集的并集。
  • 同一个联系在不同的应用场景下呈现不同的类型,可能在一个局部E-R图中是1:n的联系,在另外的E-R图中是1:1的联系。
    解决这类冲突时需要根据语义对联系进行调整。

合并局部E-R模型.

首先我们发现,学生选课局部E-R图和教师任课局部E-R图中存在实体的【异名同义】现象,前者的【】实体和后者的【单位】实体实际上代表的都是学院中的某个专业,并且这两个实体还存在属性组成的冲突,其中的属性【名称】和【单位名】还属于属性的异名同义,需要进行统一以及对属性集的求并操作。
再观察发现两个局部图中的【课程】实体存在结构冲突,它们的属性集不一致,需要进行求并操作。
解决上述的冲突之后,得到的初步E-R图如下所示:
在这里插入图片描述

E-R图冗余.

冗余分为数据冗余和实体联系冗余。

  • 数据冗余】可以由基本数据导出的数据,例如学生选修各门课程的单项成绩以及平均成绩,后者就是可以由前者导出的冗余数据。
  • 联系冗余】可以由其他联系导出的联系,例如支付宝提供共享单车、共享单车方便人类以及支付宝服务人类,第三个联系就是可以由前两个联系导出的冗余联系。不是打广告,就是想不出好的例子了。

消除冗余的方法基于分析得出,这就是前面数据库规范化理论的意义所在了。

优化初步E-R图.

上面给出的初步E-R图中存在着冗余数据和冗余联系,例如教师号这一属性,在教师实体中出现了一次,而在课程实体中又出现了一次(仔细思考发现课程实体,和教师号并没什么必然联系,每一年不同的老师教同一门课程,每一个老师也教着不同的课程);学生的平均成绩属性可以由选修关系的成绩属性经过处理得出。【教师教授课程】以及【教师属于系别】两个联系能够推导出【系别开设课程】这一联系,所以第三者属于冗余的联系。
经过优化之后,得到的基本E-R图如下所示,至此可以开始逻辑结构的设计。
在这里插入图片描述

关系模式转换.

前面的得到了教务管理系统的基本E-R图,后续进行关系数据库逻辑设计就是要得到一组关系模式的集合,所以将E-R图转换为关系模型就是将实体、属性以及联系转换成关系模式。转换时的原则如下所示:

  • 实体-关系模式】实体的属性就是关系的属性,实体的主码就是关系的主码。
  • 联系-关系模式】关系的属性是该联系本身的属性以及联系涉及到的那些实体的主码,关系的主码需要根据联系的类型来确定:
    1:1关系的主码可以是涉及到实体中任意一个的主码;
    1:n关系的主码是n那端实体的主码;
    m:n关系的主码是每个实体主码的组合。
  • 特殊情况】三个及以上的实体组成的多元联系,转换的具体方法是将所有实体的主码组合,成为多元关系模式的主码,多元关系模式的属性集即为所有实体的主码集合并上关系本身的属性集合。

在这里插入图片描述
回顾前面得到的基本E-R图,我们对于其中的实体进行转化:

  • 学生(学号、姓名、性别、年龄)
  • 课程(课程号、课程名)
  • 系(系编号、系名、电话)
  • 教师(教师号、姓名、性别、职称)

后续对于其中的联系进行转化:

  • 选修(学号、课程号、成绩)
  • 讲授(教师号、课程号)
  • 属于(教师号、系编号)
  • 拥有(学号、系编号)

上述关系模式的转化是基于全局E-R模型得到的,因此上述关系模型满足3NF,后续如果有更严格的要求,可以继续向BCNF以及4NF规范化。

合并关系模式.

上面依据全局E-R图转化得到的关系模式集合中,存在一些能够合并的关系模式。原则是合并那些具有相同主码的关系模式,例如【学生】与【拥有】、【教师】与【属于】,合并之后的关系模式如下所示:

  • 学生(学号、姓名、性别、年龄、系编号)
  • 教师(教师号、姓名、性别、职称、系编号)

最后整个教务管理系统的关系模式集合如下:

  • 教师(教师号、姓名、性别、职称、系编号)
  • 学生(学号、姓名、性别、年龄、系编号)
  • 课程(课程号、课程名)
  • 系(系编号、系名、电话)
  • 选修(学号、课程号、成绩)
  • 讲授(教师号、课程号)

Some Examples.

E1.

一个图书管理系统中有如下信息。
图书:书号、书名、数量、位置
借书人:借书证号、姓名、单位
出版社:出版社名、邮编、地址、电话、E-mail
其中约定:
任何人可以借多种书,任何一种书可以被多个人借,借书和还书时,要登记相应的借书日期和还书日期;一个出版社可以出版多种书籍,同一本书仅为一个出版社所出版,出版社名具有唯一性。
根据以上情况,完成如下设计。
(1)设计该系统的E-R图。
(2)将E-R图转换为关系模式。
(3)指出转换后的每个关系模式的主码。

解题思路

  • 首先画出代表每一个实体的E-R表示,实体用矩形表示,属性用椭圆表示。
  • 然后根据题中的语义约定,画出联系的E-R表示,任何人可以借多种书,任何一种书可以被多个人借,所以涉及到图书和借书人实体的借阅联系是一个n:m的联系,并且根据语义约定,它拥有自己的属性借书日期和还书日期。出版社和图书之间的出版联系是1:n的联系,并且不具有属性。

所以得到的E-R图如下所示:
在这里插入图片描述
根据得到的E-R进行关系模式的构造。

  • 首先是三个实体对应的关系模式:
    图书(书号、书名、数量、位置)
    出版社(出版社名、邮编、电话、地址、E-Mail)
    借书人(借书证号、姓名、单位)
  • 而后是联系对应的关系模式:
    借阅(借书证号、书号、借书日期、还书日期)
    出版(书号、出版社名)

具体的转换规则,见【关系模式转换】,后续对于得到的关系模式集合进行合并优化,发现【图书】与【出版】两个关系模式存在相同的主码,所以进行合并,最终得到的关系模式集合如下所示:

  • 图书(书号、书名、数量、位置、出版社名)
  • 出版社(出版社名、邮编、电话、地址、E-Mail)
  • 借书人(借书证号、姓名、单位)
  • 借阅(借书证号、书号、借书日期、还书日期)

E2.

排课是教学环节中的重要过程,该过程包括以下实体。
课程实体:course(cid,cname,chour,ctype)。其中,cid唯一标识每一个课程,cname为课程名,chour为课程学时,ctype为课程类别(0表示选修课,1表示必修课)。
教室实体:classroom(crid,crname,crbuilding)。其中,crid用于标识每一个教室,crbuilding为教室的楼宇,crname为教室的名称。
教师实体:teacher(tid,tname)。其中,tid唯一标识每一名教师,tname为教师姓名。
各实体的关系是:每一个教师可以教授多门课程,一门课程可以被多个教师教授,一个教室可以承载多门课程,一个课程可以被安排在多个教室中。当课程安排在指定教室的时候,需指明安排的日期(cdata)以及当天的第几节课程(carrange)。
请根据上述需求,回答以下问题。
(1)设计该系统的E-R图。
(2)将E-R图转换成关系模式,并指出主码。
(3)根据关系模式,使用SQL创建课程实体,要求SQL语句中包含主码约束和非空约束,各属性的类型及长度自选。

题解
在这里插入图片描述

  • 关系模式
    course(cid,cname,chour,ctype)
    classroom(crid,crname,crbuilding)
    teacher(tid,tname)
    teach(tid,cid)
    arrangement(cid,crid,cdate,carrage)
  • 创建课程实体
CREATE TABLE course
(cid	CHAR(8) PRIMARY KEY,
cname	VARCHAR(20) NOT NULL,
chour	INT NOT NULL,
ctype	INT NOT NULL)

E3.

图书管理系统是一类常见的信息管理系统。分析图书管理系统后,初步获得的实体信息如下。
图书:book(bookid,bookname,num)。其中,bookid用于标识每一本图书,bookname为图书名称,num为图书数量。
借阅用户:bookuser(tid,username,age)。其中,tid用于标识每一个借书用户,username为借书用户姓名,age为借书用户年龄。
图书实体与借阅用户实体间的关系是:借阅用户可以借阅多本图书,同时,一本图书可以被多个借阅用户借阅。借阅过程产生借书日期(borrow_time)和还书日期(return_time)等属性。
请根据上述需求,回答以下问题。
(1)设计该系统的E-R图。
(2)将E-R图转换成关系模式,并指出主码。
(3)根据关系模式,使用SQL创建借书用户实体,要求SQL语句中包含主码约束和非空约束。

题解
在这里插入图片描述

  • 关系模式
    book(bookid,bookname,num)
    bookuser(tid,username,age)
    borrow(bookid,tid,borrow_time,return_time)
  • 创建用户实体
CREATE TABLE bookuser
(
	tid CHAR(8) PRIMARY KEY,
	username VARCHAR(20) NOT NULL,
	age INT
)
  • 12
    点赞
  • 120
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,这是一个比较复杂的问题,需要一步步来完成。首先,我们需要根据教务系统的需求进行数据库设计。假设教务系统需要存储学生、教师、课程、成绩等信息,我们可以按照如下的设计来进行。 1. 概念结构设计概念结构设计阶段,我们需要确定实体、属性、关系等概念,以及它们之间的联系。根据教务系统的需求,我们可以确定以下实体和属性: - 学生(Student):学号、姓名、性别、年级、专业、班级等; - 教师(Teacher):工号、姓名、性别、职称、所属学院等; - 课程(Course):课程编号、课程名称、学分、授课教师等; - 成绩(Grade):学号、课程编号、成绩等。 2. 逻辑结构设计逻辑结构设计阶段,我们需要根据概念结构设计的结果,转换为数据库中的表结构。根据上面的实体和属性,我们可以设计出以下表结构: - 学生表(student): | 字段名 | 类型 | 描述 | | -------- | -------- | -------- | | sno | char(10) | 学号 | | sname | char(20) | 姓名 | | ssex | char(2) | 性别 | | sgrade | char(4) | 年级 | | smajor | char(20) | 专业 | | sclass | char(10) | 班级 | | spassword| char(20) | 密码 | - 教师表(teacher): | 字段名 | 类型 | 描述 | | -------- | -------- | -------- | | tno | char(10) | 工号 | | tname | char(20) | 姓名 | | tsex | char(2) | 性别 | | ttitle | char(20) | 职称 | | tcollege | char(20) | 所属学院 | | tpassword| char(20) | 密码 | - 课程表(course): | 字段名 | 类型 | 描述 | | -------- | -------- | -------- | | cno | char(10) | 课程编号 | | cname | char(20) | 课程名称 | | ccredit | char(2) | 学分 | | tno | char(10) | 授课教师 | - 成绩表(grade): | 字段名 | 类型 | 描述 | | -------- | -------- | -------- | | sno | char(10) | 学号 | | cno | char(10) | 课程编号 | | grade | char(3) | 成绩 | 3. 物理结构设计 在物理结构设计阶段,我们需要将逻辑结构设计转换为数据库中实际的存储结构。这里我们选择使用MySQL数据库,可以按照以下步骤进行物理结构设计: - 创建数据库: ``` CREATE DATABASE edu_system; ``` - 创建表: ``` CREATE TABLE student ( sno CHAR(10) PRIMARY KEY, sname CHAR(20) NOT NULL, ssex CHAR(2) NOT NULL, sgrade CHAR(4) NOT NULL, smajor CHAR(20) NOT NULL, sclass CHAR(10) NOT NULL, spassword CHAR(20) NOT NULL ); CREATE TABLE teacher ( tno CHAR(10) PRIMARY KEY, tname CHAR(20) NOT NULL, tsex CHAR(2) NOT NULL, ttitle CHAR(20) NOT NULL, tcollege CHAR(20) NOT NULL, tpassword CHAR(20) NOT NULL ); CREATE TABLE course ( cno CHAR(10) PRIMARY KEY, cname CHAR(20) NOT NULL, ccredit CHAR(2) NOT NULL, tno CHAR(10) NOT NULL, FOREIGN KEY (tno) REFERENCES teacher(tno) ); CREATE TABLE grade ( sno CHAR(10) NOT NULL, cno CHAR(10) NOT NULL, grade CHAR(3) NOT NULL, PRIMARY KEY (sno, cno), FOREIGN KEY (sno) REFERENCES student(sno), FOREIGN KEY (cno) REFERENCES course(cno) ); ``` - 添加数据: ``` INSERT INTO student VALUES ('1001', '张三', '男', '2018', '计算机科学与技术', '1801', '123456'); INSERT INTO student VALUES ('1002', '李四', '女', '2018', '软件工程', '1802', '123456'); INSERT INTO student VALUES ('1003', '王五', '男', '2018', '信息安全', '1803', '123456'); INSERT INTO teacher VALUES ('2001', '张老师', '男', '副教授', '计算机科学与技术', '123456'); INSERT INTO teacher VALUES ('2002', '李老师', '女', '讲师', '软件工程', '123456'); INSERT INTO teacher VALUES ('2003', '王老师', '男', '教授', '信息安全', '123456'); INSERT INTO course VALUES ('C001', '数据库原理', '3', '2001'); INSERT INTO course VALUES ('C002', '操作系统', '4', '2002'); INSERT INTO course VALUES ('C003', '网络安全', '2', '2003'); INSERT INTO grade VALUES ('1001', 'C001', '85'); INSERT INTO grade VALUES ('1001', 'C002', '90'); INSERT INTO grade VALUES ('1002', 'C001', '78'); INSERT INTO grade VALUES ('1002', 'C003', '92'); INSERT INTO grade VALUES ('1003', 'C002', '80'); ``` 4. 视图 视图可以简化复杂的查询操作,我们可以根据需要创建以下视图: - 学生信息视图: ``` CREATE VIEW student_info AS SELECT sno, sname, ssex, sgrade, smajor, sclass FROM student; ``` - 教师信息视图: ``` CREATE VIEW teacher_info AS SELECT tno, tname, tsex, ttitle, tcollege FROM teacher; ``` - 课程信息视图: ``` CREATE VIEW course_info AS SELECT cno, cname, ccredit, tname FROM course, teacher WHERE course.tno = teacher.tno; ``` - 成绩信息视图: ``` CREATE VIEW grade_info AS SELECT sno, sname, cno, cname, grade FROM student, course, grade WHERE student.sno = grade.sno AND course.cno = grade.cno; ``` 5. 索引 索引可以加速数据库的查询操作,我们可以根据需要为表中的字段创建索引。比如,为成绩表中的学号和课程编号字段创建联合索引: ``` CREATE INDEX idx_grade_sno_cno ON grade(sno, cno); ``` 6. 存储过程 存储过程可以简化复杂的数据库操作,我们可以根据需要创建以下存储过程: - 查询学生的成绩: ``` CREATE PROCEDURE show_student_grade( IN stu_no CHAR(10) ) BEGIN SELECT student.sno, student.sname, course.cno, course.cname, grade.grade FROM student, course, grade WHERE student.sno = grade.sno AND course.cno = grade.cno AND student.sno = stu_no; END; ``` 7. 存储函数 存储函数可以简化复杂的数据计算操作,我们可以根据需要创建以下存储函数: - 计算学生的平均成绩: ``` CREATE FUNCTION calc_student_avg_grade( stu_no CHAR(10) ) RETURNS DECIMAL(5,2) BEGIN DECLARE grade_sum DECIMAL(5,2); DECLARE grade_count INT; SELECT SUM(grade) INTO grade_sum, COUNT(*) INTO grade_count FROM grade WHERE sno = stu_no; RETURN grade_sum / grade_count; END; ``` 8. 触发器 触发器可以在数据库发生某些操作时自动触发一些操作,我们可以根据需要创建以下触发器: - 插入成绩时更新学生的平均成绩: ``` CREATE TRIGGER update_student_avg_grade AFTER INSERT ON grade FOR EACH ROW BEGIN UPDATE student SET avg_grade = calc_student_avg_grade(NEW.sno) WHERE sno = NEW.sno; END; ``` 9. 事件 事件可以定期执行一些数据库操作,我们可以根据需要创建以下事件: - 每周定期备份数据库: ``` CREATE EVENT backup_database ON SCHEDULE EVERY 1 WEEK STARTS CURRENT_TIMESTAMP DO BEGIN BACKUP DATABASE edu_system TO '/path/to/backup/file'; END; ``` 10. 事务 事务可以保证数据库操作的一致性和完整性,我们可以在需要进行多个操作的时候使用事务来保证操作的一致性和完整性。 11. 数据库用户及权限分配 在生产环境中,我们需要为不同的用户分配不同的权限,以保证数据安全。我们可以根据需要创建以下用户和权限: - 创建管理员用户: ``` CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON edu_system.* TO 'admin'@'localhost'; ``` - 创建普通用户: ``` CREATE USER 'user'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON edu_system.* TO 'user'@'localhost'; ``` 12. 恢复与备份 在生产环境中,我们需要定期备份数据库,并且需要在数据库出现故障时进行恢复。我们可以使用MySQL提供的备份和恢复工具来完成这些操作。 - 备份数据库: ``` mysqldump -u username -p edu_system > /path/to/backup/file ``` - 恢复数据库: ``` mysql -u username -p edu_system < /path/to/backup/file ``` 13. 导出与导入 如果需要将数据库中的数据导出到其他系统中,或者从其他系统中导入数据到数据库中,我们可以使用MySQL提供的导出和导入工具来完成这些操作。 - 导出数据: ``` mysqldump -u username -p edu_system > /path/to/export/file ``` - 导入数据: ``` mysql -u username -p edu_system < /path/to/export/file ``` 以上就是一个简单的教务系统的MySQL数据库设计以及相关操作的详细介绍。当然,根据实际需求,我们可能需要进行更加复杂的设计和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值