概述

软件工程定义

关于软件工程的定义,在GB/T11457-2006《消息技术 软件工程术语》中将其定义为"应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品的定义、开发、和维护的工程或进行研究的学科"。

软件工程意义

软件工程与软件开发

软件的开发到底是一门科学还是一门工程,这是一个被争论了很久的问题。实际上,软件开发兼有两者的特点。但是这并不意味着它们可以被互相混淆。很多人认为软件工程基于计算机科学和信息科学就如传统意义上的工程学之于物理和化学一样。在美国,大约40%的软件工程师具有计算机科学的学位。在世界其他地方,这个比例也差不多。他们并不一定会每天使用计算机科学方面的知识,但是他们每天都会使用软件工程方面的知识。

软件工程地位

软件工程学科是计算学科的分支,计算学科中理论、抽象、设计等三个学科形态,绑定、大问题的复杂性、概念和形式模型、一致性和完备性、效率、演化、抽象层次、按空间排序、按时间排序、重用、安全性、折衷与决策等十二个基本概念,数学方法、系统科学方法在软件工程学科中占有重要地位。此外,软件工程还十分重视管理过程,以提高软件产品的质量、降低开发成本、保证工程按时完成。系统性、规范性、可度量性也是软件工程非常关注的。

软件工程学科的理论基础是数学、计算机科学。软件工程的研究和实践涉及人力、技术、资金、进度的综合管理,是开展最优化生产活动的过程;软件工程必须划分系统的边界,给出系统的解决方案。因此,软件工程的相关学科有计算机科学与技术、数学、计算机工程、管理学、系统工程和人类工程学等。


需求分析

信息需求分析

对学校而言,学生成绩管理是管理工作中重要的一环,但是高校学生的成绩管理工作量大、繁杂,人工处理非常困难。因此,借助于强大计算机的处理能力,能够把人从繁重的成绩管理工作中解脱出来,并且更加准确、安全、清晰的管理环境。

该数据库需要记录的数据有学生入学时会记录身份信息,包括姓名、性别、出生日期、民族、身份证号、学号、政治面貌、手机号码等相关信息;学校的多个学院和多个校区信息;每个校区的宿舍楼信息,其中宿舍楼的类别有博士生公寓、硕士生公寓和本科生公寓。

因此系统需要完整记录学生的基本信息、当前所在学院、所在校区、所住宿舍楼寝室,以及其他可能需要的信息。

功能需求分析

能够进行数据库的数据定义、数据操纵、数据控制等处理功能。具体功能应包括:可提供学生基本信息查询、添加、插入、删除、更新,以及调整校区、学院、寝室的功能。

安全性和完整性需求分析

对于学生基本信息数据库来讲,由于其主要数据是学生基本信息,只能由本人以及学校单位知道,因此做好数据安全性是重中之重。另外,要求所有在校学生的信息都要录入其中,并且要设计好个别情况。


系统设计

概念结构设计

概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。

根据学生基本信息管理系统数据库设计需求抽象出学生、学院、校区、宿舍四个实体,对四个实体做简化处理,因简化后关系结构比较简单,故省略了局部E-R图。对4个实体之间的关系进行分析如下:

  • 一位学生位于一个学院,一个学院拥有多名学生,所以学生与学院之间是一对多(1:n)的关系;

  • 一位学生住在一个宿舍,一门课程住着多名学生,所以学生与宿舍之间是一对多(1:n)的关系;

  • 一个校区会有多个寝室和多个学院,而一个寝室和校区仅被一个校区拥有,所以校区与寝室、学院都是一对多(1:n)的关系;

系统实体抽象

  • 学生(学号、姓名、性别、出生日期、民族、身份证号、政治面貌、手机号码、学院、宿舍);
  • 学院(编号、名称、类型);
  • 校区(编号、名称、地址);
  • 宿舍(编号、类型、校区)

全局E-R图

全局E-R模型图

逻辑结构设计

关系模式

E-R图向关系模型转化要解决的问题是如何将实体型和实体间的联系转化为关系模式,如何确定这些关系模式的属性和码。

设计学生基本信息管理系统数据库,包括学生(student)、学院(school)、校区(campus)、宿舍(dormitory)四个实体,其关系模式中对每个实体定义属性如下:

  • student表: 学号(snum)、姓名(sname)、性别(sgender)、出生日期(sbirthday)、民族(snationality)、身份证号(sid)、政治面貌(spolitical)、手机号码(sphonenum)、学院(schoolid)、宿舍(dormitoryid),此为联系“student表”所对应的关系模式,学号为该关系的候选码,满足第三范式。
  • school表:学院编号(schoolid)、学院名称(schoolname)学院类型(schooltype),此为联系“school表”所对应的关系模式,学院编号为该关系的候选码,满足第三范式。
  • campus表:(校区编号(campusid)、校区名称(campusname)、校区地址(campuaddress),此为联系“campus表”所对应的关系模式,校区编号为该关系的候选码,满足第三范式。
  • dormitory表:(宿舍编号(dormitorysid)、宿舍类型(dormitorytype)、校区编号(campusid),此为联系“dormitory表”所对应的关系模式,宿舍编号为该关系的候选码,满足第三范式。

表结构

学生表结构

学院表结构

校区表结构

宿舍表结构


代码与实现

创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
-- ---------------------------- 
-- 创建学生表
-- ---------------------------
CREATE TABLE student(
STUID NUMBER(13) NOT NULL,--学号
SNUM NUMBER(18)NOT NULL, --身份证号
SNAME VARCHAR(20)NOT NULL, --姓名
SGENDER VARCHAR(20)NOT NULL, --性别
SBIRTHDAY DATE NOT NULL, -- 出生日期
SPOLITICAL VARCHAR(20)NOT NULL, --政治面貌
SNATIONALITY VARCHAR(20)NOT NULL, --民族
SPHONENUM NUMBER(11)NOT NULL, --手机号码
SCHOOLID NUMBER(10)NULL, --学院编号
DORMITORYID VARCHAR(20)NULL --宿舍编号
);
ALTER TABLE student ADD CONSTRAINT PK_student PRIMARY KEY(SNUM); --创建主键约束
ALTER TABLE student ADD CONSTRAINT CK_student_SGENDER
CHECK(SGENDER = '男' OR SGENDER = '女'); --创建性别约束条件
ALTER TABLE student ADD CONSTRAINT CK_student_SPOLITICAL
CHECK(SPOLITICAL = '中共党员' OR SPOLITICAL = '中共预备党员' OR SPOLITICAL = '共青团员' OR SPOLITICAL = '群众' OR SPOLITICAL = '其他' ); --创建政治面貌约束条件

-- ----------------------------
-- 创建校区表
-- ---------------------------
CREATE TABLE campus(
CAMPUSID NUMBER(10)NOT NULL,--校区编号
CAMPUSNAME VARCHAR(30)NOT NULL,--校区名称
CAMPUSADDRESS VARCHAR(30)NOT NULL--校区地址
);
ALTER TABLE campus ADD CONSTRAINT PK_campus PRIMARY KEY(CAMPUSID);--创建主键约束

-- ----------------------------
-- 创建学院表
-- ---------------------------
CREATE TABLE school(
SCHOOLID NUMBER(10)NOT NULL,--学院编号
SCHOOLNAME VARCHAR(20)NOT NULL, --学院名称
SCHOOLTYPE VARCHAR(20)NOT NULL, --学院类型
CAMPUSID NUMBER(10)NOT NULL--校区编号
);
ALTER TABLE school ADD CONSTRAINT PK_school PRIMARY KEY(SCHOOLID);--创建主键约束
ALTER TABLE school ADD CONSTRAINT CK_school_TYPE --创建学院类型约束条件
CHECK(SCHOOLTYPE = '自然科学' OR SCHOOLTYPE = '农业科学' OR SCHOOLTYPE = '医药科学' OR SCHOOLTYPE = '工程与技术科学' OR SCHOOLTYPE = '人文与社会科学' );
-- ----------------------------
-- 创建宿舍表
-- ---------------------------
CREATE TABLE dormitory(
DORMITORYID VARCHAR(20)NOT NULL,--宿舍编号
DORMITORYTYPE VARCHAR(20)NOT NULL,--宿舍类型
CAMPUSID NUMBER(10)NOT NULL--校区编号
);
ALTER TABLE dormitory ADD CONSTRAINT PK_dormitory PRIMARY KEY(DORMITORYID);--创建主键约束
ALTER TABLE dormitory ADD CONSTRAINT CK_dormitory_TYPE
CHECK(DORMITORYTYPE = '本科生公寓' OR DORMITORYTYPE = '硕士生公寓' OR DORMITORYTYPE = '硕士生公寓' ); --创建宿舍类型约束条件
-- ----------------------------
-- 创建外键约束
-- ---------------------------
ALTER TABLE student ADD CONSTRAINT FK_student_school_SCHOOLID
FOREIGN KEY(SCHOOLID) REFERENCES school(SCHOOLID);--创建外键约束
ALTER TABLE student ADD CONSTRAINT FK_student_DORMITORYID
FOREIGN KEY(DORMITORYID) REFERENCES dormitory(DORMITORYID);--创建外键约束
ALTER TABLE school ADD CONSTRAINT FK_school_campus_CAMPUSID FOREIGN
KEY(CAMPUSID) REFERENCES campus(CAMPUSID);--创建外键约束
ALTER TABLE dormitory ADD CONSTRAINT FK_dormitory_campus_CAMPUSID FOREIGN
KEY(CAMPUSID) REFERENCES campus(CAMPUSID);--创建外键约束

插入校区信息

1
2
INSERT INTO campus VALUES (1,'电子科技大学清水河校区','四川省成都市高新区');
INSERT INTO campus VALUES (2,'电子科技大学沙河校区','四川省成都市成华区');

插入校区信息

插入学院信息

1
2
3
4
5
INSERT INTO school VALUES (0001,'信通学院','工程与技术科学',1);
INSERT INTO school VALUES (0002,'电子学院','工程与技术科学',1);
INSERT INTO school VALUES (0003,'微电子学院','工程与技术科学',1);
INSERT INTO school VALUES (0004,'医学院','医药科学',2);
INSERT INTO school VALUES (0005,'软件学院','工程与技术科学',2);

插入学院信息

插入宿舍信息

1
2
3
4
5
6
7
8
9
10
11
12
INSERT INTO dormitory VALUES ('27#211','本科生公寓',1);
INSERT INTO dormitory VALUES ('27#439','本科生公寓',1);
INSERT INTO dormitory VALUES ('27#440','本科生公寓',1);
INSERT INTO dormitory VALUES ('11#440','硕士生公寓',1);
INSERT INTO dormitory VALUES ('12#440','硕士生公寓',1);
INSERT INTO dormitory VALUES ('37#210','博士生公寓',1);
INSERT INTO dormitory VALUES ('27#211','本科生公寓',2);
INSERT INTO dormitory VALUES ('27$439','本科生公寓',2);
INSERT INTO dormitory VALUES ('27$440','本科生公寓',2);
INSERT INTO dormitory VALUES ('11$440','硕士生公寓',2);
INSERT INTO dormitory VALUES ('12$440','硕士生公寓',2);
INSERT INTO dormitory VALUES ('37$210','博士生公寓',2);

插入宿舍信息

插入学生信息

1
2
3
4
INSERT INTO student 
VALUES (2020010902003,123445567,'小明','男',TO_DATE('2000-8-9','yyyy-MM-dd'),'党员','汉',15130796857,1, '27#440');
INSERT INTO student
VALUES (2020010902013,123422567,'小红','女',TO_DATE('2001-2-7','yyyy-MM-dd'),'群众','汉',18330796857,3, '11$440');

插入学生信息


思考

数据库三大范式证明

student表中学号(snum)、姓名(sname)、性别(sgender)、出生日期(sbirthday)、民族(snationality)、身份证号(sid)、政治面貌(spolitical)、手机号码(sphonenum)、学院(schoolid)、宿舍(dormitoryid)字段都是单一属性的,不可再分,因此满足第一范式;

并且姓名(sname)、性别(sgender)、出生日期(sbirthday)、民族(snationality)、身份证号(sid)、政治面貌(spolitical)、手机号码(sphonenum)、学院(schoolid)、宿舍(dormitoryid)都完全依赖于学号(snum)这一个候选关键字,因此满足第二范式;

学号为该关系的候选码,不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式,因此满足第三范式。