实验3 数据库系统设计综合实验
通过实验,使学生掌握数据库系统设计和开发的一般方法,能够设计并实现简单的数据库系统。
本实验的任务是设计并实现一个数据库系统。数据库设计的一般步骤包括:需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、数据库运行和维护。 (1) 概念结构设计 了解概念结构设计的基本方法,根据需求分析的结果或实验题目给出的要求,能够准确地用实体联系图来描述实体和实体之间的联系。 (2) 逻辑结构设计 理解逻辑结构设计的基本方法,根据实体联系图的设计,转换成合理的关系模式,每个关系模式至少应该满足第三范式的要求。 (3) 物理结构设计 理解物理结构设计的基本方法,选择合理的索引结构和存储结构,优化数据库的存取。 (4) 数据库实施 选择一门熟悉的面向对象程序设计语言,完成应用程序的开发。
Oracle 11g,windows10;
假设有“教师”、“学生”、“课程”三个实体,教师的基本信息包括:工号、姓名、职称、工资,课程的基本信息包括:课程号、课程名、学分数,学生的基本信息包括:学号、姓名、性别、年龄。系统必须满足以下要求: (1) 一门课程只能有一个教师任课,一个教师可以上多门课程; (2) 一个学生可以选修多门课程,一门课程可以由多个学生来选修,记录不同学生选修不同课程的成绩; (3) 设置一个管理员,用于维护(添加、删除和修改等基本任务)学生基本信息、教师基本信息和教师所授课程等工作,此外,管理员添加学生时,为其设置初始密码;当学生选修了某门课程,课程成绩由管理员录入; (4) 学生可以利用学号和密码登录系统,登陆系统后,可以进行选课、修改密码和个人基本信息、查询自己的选课及总学分等操作; (5) 能够统计不同职称的教师的数量、不同职称的教师的平均工资,可以统计每门课程的平均成绩、最高分、最低分,统计每个学生选修课程的总学分; 根据上述描述,解答下列问题: (1) 设计并画出E-R 图,要求标注连通词(即联系类型); (2) 将E-R 图转化为关系模型,并指出各关系的主码和外码; (3) 在MySql、SQL Server、Oracle 中选择一个数据库管理系统,并完成数据库的逻辑设计;
(1)E-R图如下:
(2)关系模型如下: teacher(tno,tname,tposition,tsalary,pwd),其中,tno为teacher表的主码 course(cno,cname,ccredit,tno),其中,cno为course表的主码,tno为外码 student(sno,sname,ssex,sage,sdept,pwd),其中,sno为student表的主码 sc(sno,con,grade),其中,(sno,cno)为sc表的主码,sno为外码,参照student(sno),cno为外码,参照course(cno) (3)选择Oracle数据库管理系统,并设计数据库的物理结构; 1.创建用户muzi,密码为muzi create user aaa identified by aaa; grant connect,resource,UNLIMITED TABLESPACE to aaa; grant create view to aaa;
create table student ( Sno VARCHAR(9) PRIMARY KEY,/*列级完整性约束条件*/ Sname VARCHAR(20) UNIQUE, Ssex VARCHAR(3), Sage SMALLINT, Sdept VARCHAR(20) ); select* from student; insert into student(sname,ssex,sno,sage,sdept)VALUES('一一','男','20211224',18,'CS'); insert into student(sname,ssex,sno,sage,sdept)VALUES('二二','女','20211225',19,'CS'); insert into student(sname,ssex,sno,sage,sdept)VALUES('三三','男','20211226',20,'MA'); insert into student(sname,ssex,sno,sage,sdept)VALUES('四四','女','20211227',19,'IS'); insert into student(sname,ssex,sno,sage,sdept,pwd)VALUES('五五','男','20211228',19,'IS','123456'); create table course ( Cno VARCHAR(4) PRIMARY KEY, Cname VARCHAR(40), Cpno VARCHAR(4), Ccredit SMALLINT, FOREIGN KEY(Cpno) REFERENCES Course(Cno), tno varchar(7) not null, foreign key (tno) references teacher(tno) ); insert into course values('6','数据处理',null,2,'t001'); insert into course values('2','数学',null,2,'t002'); insert into course values('7','PASCAL语言','6',4,'t003'); insert into course values('5','数据结构','7',4,'t002'); insert into course values('1','数据库','5',4,'t003'); insert into course values('3','信息系统','1',4,'t004'); insert into course values('4','操作系统','6',3,'t005'); select* from course order by Cno; create TABLE SC ( Sno VARCHAR(9), Cno VARCHAR(4), Grade SMALLINT, FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) ); insert into sc values('20211224','1',92); insert into sc values('20211224','2',85); insert into sc values('20211224','3',88); insert into sc values('20211225','2',90); insert into sc values('20211225','3',80); insert into sc values('20211228','7',80); insert into sc values('20211228','2',80); insert into sc values('20211226','2',80); insert into sc values('20211227','2',50); select* from sc; create table teacher ( tno varchar(7) primary key,/*列级完整性约束条件*/ tname varchar(20) not null unique, tposition varchar(20) not null, tsalary smallint not null, pwd varchar(20) not null ); insert into teacher(tno,tname, tposition, tsalary, pwd) values('t001','张三','教授',30000,'123456'); insert into teacher(tno,tname, tposition, tsalary, pwd) values('t002','李四','副教授',35000,'123456'); insert into teacher(tno,tname, tposition, tsalary, pwd) values('t003','熊猫','教授',45000,'123456'); insert into teacher(tno,tname, tposition, tsalary, pwd) values('t004','王小二','副教授',38000,'123456'); insert into teacher(tno,tname, tposition, tsalary, pwd) values('t005','李小小','副教授',42000,'123456'); insert into teacher(tno,tname, tposition, tsalary, pwd) values('t006','李小龙','教授',60000,'123456'); select *from teacher; 3.创建视图studentinfo、courseinfo、teacherinfo1、teacherinfo2并提交 create view courseinfo as select course.cno 课程编号,course.cname 课程名称,teacher.tname 任课老师,course.ccredit 课程学分,countnum 选修人数,avg_grade 平均分,max_grade 最高分,min_grade 最低分 from teacher,course left outer join (select cname, count(*) countnum,Round(avg(grade),1) avg_grade,max(grade) max_grade,min(grade) min_grade from sc,course where course.cno=sc.cno group by cname)a1 on (course.cname=a1.cname) where teacher.tno=course.tno; select *from courseinfo; create view studentinfo as select student.sno 学号,student.sname 姓名,(select sum(grade) from sc where sno=student.sno) 总分 ,(select sum(ccredit) from course where cno in (select cno from sc where sno=student.sno)) 总学分 ,(select max(grade)from sc where sc.sno in (student.sno)) 最高分,(select min(grade) from sc where sc.sno in (student.sno)) 最低分 from student; select *from studentinfo; create view teacherinfo1 as select tposition 职位,count(tno) 在任人数,Round(avg(tsalary),1) 平均工资 from teacher group by tposition; create view teacherinfo2 as select tno 教师工号,tname 教师名称,(select count(student.sno) from student,sc,course where student.sno=sc.sno and sc.cno=course.cno and course.tno=teacher.tno) 授课学生总人数 from teacher; select * from teacherinfo1; select * from teacherinfo2; commit;
部分c#代码 MainForm.cs namespace DbApp { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void 查询学生ToolStripMenuItem_Click(object sender, EventArgs e) { FormStuQuary frm = new FormStuQuary(); frm.MdiParent = this;//表示是主窗体的一个子窗体 frm.Show(); } private void 添加学生ToolStripMenuItem_Click(object sender, EventArgs e) { FormStuInsert frm = new FormStuInsert(); frm.MdiParent = this; frm.Show(); } private void 查询课程ToolStripMenuItem_Click(object sender, EventArgs e) { FormCourseQuery frm = new FormCourseQuery(); frm.MdiParent = this; frm.Show(); } private void 添加课程ToolStripMenuItem_Click(object sender, EventArgs e) { FormCourseInsert frm= new FormCourseInsert(); frm.MdiParent = this; frm.Show(); } private void 统计ToolStripMenuItem_Click(object sender, EventArgs e) { FormStatistics frm = new FormStatistics(); frm.MdiParent = this; frm.Show(); } private void MainForm_Load(object sender, EventArgs e) { this.Text = "学生信息管理系统, 当前的登录用户名是: " + FormLogin.loginName; if (FormLogin.person == "学生") { 学生管理ToolStripMenuItem.Visible = false; 教师管理ToolStripMenuItem.Visible = false; 添加课程ToolStripMenuItem.Visible = false; 统计信息ToolStripMenuItem.Visible = false; 成绩信息ToolStripMenuItem.Visible = false; } if (FormLogin.person == "教师") { 学生管理ToolStripMenuItem.Visible = false; 教师管理ToolStripMenuItem.Visible = false; 添加课程ToolStripMenuItem.Visible = false; } if (FormLogin.person == "管理员") { 学生管理ToolStripMenuItem.Visible = false; 个人中心ToolStripMenuItem.Visible = false; } } private void 查询教师ToolStripMenuItem_Click(object sender, EventArgs e) { FormTeaQuary frm = new FormTeaQuary(); frm.MdiParent = this; frm.Show(); } private void 添加教师ToolStripMenuItem_Click(object sender, EventArgs e) { FormTeaInsert frm = new FormTeaInsert(); frm.MdiParent = this; frm.Show(); } private void 成绩信息ToolStripMenuItem_Click(object sender, EventArgs e) { FormGradeQuery frm = new FormGradeQuery(); frm.MdiParent = this; frm.Show(); } private void 个人信息ToolStripMenuItem_Click(object sender, EventArgs e) { FormOwn frm = new FormOwn(); frm.MdiParent = this; frm.Show(); } } } Program.cs static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); FormLogin frm = new FormLogin(); if (frm.ShowDialog() == DialogResult.OK) Application.Run(new MainForm()); else Application.Exit(); } FormStuQuery.cs using Oracle.ManagedDataAccess.Client; private void button1_Click(object sender, EventArgs e) { string sql = string.Format("select sno,sname,ssex,sage,sdept,pwd from student where sname like '{0}%'" , textBox1.Text); OracleConnection con = new OracleConnection(Program.strCon); try { con.Open(); OracleCommand cmd = new OracleCommand(sql, con); OracleDataReader odr = cmd.ExecuteReader(); if (odr.HasRows) { BindingSource bs = new BindingSource(); bs.DataSource = odr; dataGridView1.DataSource = bs; } else dataGridView1.DataSource = null; } catch (Exception ex) { MessageBox.Show(ex.Message); } |