数据库应用技术 期末项目 高校餐厅管理系统 MYSQL(98分)

目录

1 项目需求分析

1.1 项目名称

1.2 项目功能

1.3 项目系统结构图

2 数据库的设计

2.1 概念结构设计

 2.2 逻辑结构设计

2.3 物理结构设计

3 数据库的实现

3.1 数据库

扫描二维码关注公众号,回复: 17218233 查看本文章

3.2 表

3.3 数据操纵

3.4 视图

3.5 索引

3.6 存储过程

3.7 存储函数

3.8 触发器

3.9 事件

3.10 事务(在存储过程中使用事务)

3.11 数据库用户及权限分配

3.12 备份与恢复

4 项目总结及心得

1 项目需求分析

1.1 项目名称

高校餐厅管理系统

1.2 项目功能

设计管理系统可以减少管理工作方面的工作量,减少工作人员的高负荷工作量,降低餐厅管理人员在信息管理精力上的投入,也有效减少费用算错等一系列措施,使餐厅获得更大的利润。同时,给各大高校学生用户带来方便,他们可以通过在网上预定自己喜欢的饭菜,不必再为吃饭拥挤而苦恼,节省了很多的等待时间。设计该系统目的在于高效、便捷、快速的管理餐厅。

学生信息功能模块:每位学生都有唯一的学号并被分配到指定的宿舍楼和宿舍,有姓名、年龄、联系方式等。学生首先查看餐厅的基本信息,比如是否营业,客流量,好评度,哪些窗口和出售的菜名等,然后选择合适的餐厅进行就餐,在选择窗口和菜时,可以根据自己的喜好选择,也可以根据好评度选择。学生也可通过外卖系统来订外卖,订完时,系统会生成订单信息。学生也可对餐厅,窗口和菜的质量进行打分。

餐厅工作人员功能模块:餐厅工作人员分为餐厅管理员、窗口管理员和一般员工。餐厅的工作人员能查询自己工作的餐厅和窗口的相关信息,包括餐厅拥有的窗口,该窗口所有菜的信息,正在出售的菜的信息,该窗口的外卖单的信息,销售状况,好评度等,有利于对餐厅和窗口更好的管理,对好评度低的餐厅进行整改。当窗口的菜单信息发生变化时,工作人员对其进行整改,比如,某些菜销售完毕,或者某些菜的价格改变,记录中价格的信息也要做相应的改变等。当有学生在该窗口点餐时,工作人员可以统计销售额,合计总额。当有学生订外卖时,可以及时生成订单的详细信息,确保准确无误的送到指定地点。

窗口信息功能模块:每个窗口都有编号和所属食堂编号,并对此窗口出售的菜进行编号,另外还有此窗口的营业状况,以及学生对其的评价。

菜单信息功能模块:每道菜都有自己的编号、菜名和价钱、所属餐厅的编号和窗口编号,同时有此时的销售状况,以及学生对其的评价。

就餐信息功能模块:主要是记录学生在餐厅的就餐情况,统计使用某道菜的人数、时间,统计某人食用的菜名。可查询餐厅就餐的同学的信息,如查询同学的姓名、住址、学号、性别等。

外卖信息功能模块:每个外卖都有订单号以及订此外卖的学生的学号。可查询外卖号,订外卖的同学的相关信息,送餐的员工的相关信息,是否送餐以及送餐时间。

收入信息功能模块:每道菜会有对应的销售总量和总价,可定期查看收入信息。

评价信息功能模块:该功能主要是学生可对某个餐厅、某个窗口、某道菜进行评价。将评价记录在系统中,并为评价的学生生成一个编号。评价的内容可供其他学生参考。

1.3 项目系统结构图

2 数据库的设计

2.1 概念结构设计

1.实体属性

餐厅信息:餐厅编号、营业状况、好评度、客流量、员工号

窗口信息:窗口编号、餐厅编号、好评度、营业状况、工作人员

菜单信息:菜编号、窗口编号、餐厅编号、菜名、好评度、状况、价钱

评价信息:评价编号、学号、餐厅编号、窗口编号、菜编号、餐厅分数、窗口分数、菜分数

学生信息:学号、姓名、性别、年龄、住址、联系方式

就餐信息:学号、菜编号、就餐时间

菜收入信息:销售编号、菜编号、数量、收入

员工信息:员工号、姓名、性别、年龄、职位、联系方式

外卖信息:学号、订餐号

订餐信息:订餐号、餐厅编号、窗口编号、菜编号、数量、总价

送餐信息:订餐号、员工号、状况、送餐时间

2.实体联系

一个餐厅有多个窗口,每个窗口属于一个餐厅。一个窗口有多道菜,一道菜只在一个窗口销售。销售收入和菜是一对一关系。一个餐厅有多个员工,一个员工在一个餐厅工作。一个窗口可有多个员工,一个员工工作在一个窗口。一个学生可以选多道菜,一道菜可被多个学生选择。学生和订餐是多对多关系,员工和订餐是多对多关系,学生和评价是一对一关系。

3.实体图

局部E-R见文档。

 2.2 逻辑结构设计

将E-R图转换为关系模型。并进行优化,最终达到第三范式。

餐厅(餐厅编号,营业状况,好评度,客流量,员工号)

窗口(窗口编号,餐厅编号,好评度,营业状况,员工号)

菜(菜编号,窗口编号,餐厅编号,状况,价钱,好评度)

学生评价(评价编号,餐厅编号,餐厅分数,窗口编号,窗口分数,菜编号,菜分数,学号)

销售收入(销售编号,菜编号,收入)

员工(员工号,姓名,年龄,性别,职位,联系方式)

学生(学号,姓名,性别,年龄,住址,联系方式)

就餐(菜编号,学号,就餐时间)

外卖(学号,订餐号

订餐(订餐号,餐厅编号,窗口编号,菜编号,数量,总价)

送餐(员工号,订餐号,状况,送餐时间)

2.3 物理结构设计

部分表如下:

(1)餐厅信息表

列名

数据类型

长度

约束

说明

Cno

varchar

10

Primary key 

餐厅编号

Ccondition

char

1

是否营业

Cevaluation

tinyint

CHECK

好评度

Ccustomer

smallint

客流量

Eno

varchar

10

NOT NULL  Foreign key

员工号

(2)窗口信息表

(3)菜单信息表

(4)学生评价表

(5)菜收入信息表

(6)员工数据信息表

(7)学生信息表

(8)学生就餐信息表

(9)外卖信息表

(10)订餐信息表

(11)送餐信息表

3 数据库的实现

3.1 数据库

数据库名

定义数据库语句

说明

Ctsystem

create database if not exists Ctsystem;

创建餐厅数据库Ctsystem

3.2 表

表名

定义表语句

说明

Canting

create table Canting

(Cno varchar(10) not null primary key,

Ccondition char(1),

Cevaluation tinyint check(Cevaluation between 0 and 100),

Ccustomer smallint,

Eno varchar(10) not null,

foreign key(Eno) references Employee(Eno)

);

餐厅信息表

Chuangkou

create table Chuangkou

(Wno varchar(10) not null primary key,

Wcondition char(1),

Eno varchar(10) not null,

Cno varchar(10) not null,

Wevaluation  tinyint  check(Wevaluation between 0 and 100),

foreign  key(Eno) references Employee(Eno),

 foreign key(Cno) references Canting(Cno)

);

窗口信息表

Caidan

create table Caidan

(Dno varchar(10) not null primary key,

Dcondition char(1),

Devaluation tinyint  check(Devaluation between 0 and 100),

price float,

Dname  varchar(30) not null  unique,

Wno varchar(10) not null,

Cno varchar(10) not null,

foreign key(Wno) references Chuangkou(Wno),

foreign key(Cno) references Canting(Cno)

);

菜单信息表

Pingjia

create table Pingjia

(Pno varchar(10) not null primary key,

Cno   varchar(10)  not null,

Cpoint tinyint check(Cpoint between 0 and 100),

Wno varchar(10)  not null,

Wpoint  tinyint check(Wpoint between 0 and 100),

Dno varchar(10)  not null,

Dpoint  tinyint check(Dpoint between 0 and 100),

Sno varchar(20)  not null,

foreign key(Wno) references Chuangkou(Wno),

foreign key(Cno) references Canting(Cno),

foreign key(Dno) references Caidan(Dno),

foreign key(Sno) references Student(Sno)

);

学生评价表

Income

create table Income

(Ino  varchar(10) not null primary key,

Dno varchar(10) not null ,

Income float,

foreign key(Dno) references Caidan(Dno)

);

菜收入信息表

Employee

create table Employee

(Eno varchar(10) not null primary key,

Ename varchar(20) not null,

sex char(2) not null,

age tinyint not null,

Epos  varchar(20) not null ,

Ephone  varchar(20) not null

);

员工数据信息表

Student

create table Student

(Sno  varchar(20) not null primary key,

Sname   varchar(20) not null,

sex  char(2) not null,

age tinyint not null,

Sadd  varchar(20) not null,

Sphone  char(11) not null

);

学生信息表

Jiucan

create table Jiucan

(Sno varchar(20) not null ,

Dno varchar(10) not null ,

Sdate datetime not null,

foreign key(Dno) references Caidan(Dno),

foreign key(Sno) references Student(Sno),

primary key(Sno,Dno)

);

学生就餐信息表

Waimai

create table Waimai

(Tno varchar(10) not null,

Sno varchar(20) not null,

primary key(Sno,Tno)

);

外卖信息表

Dingcan

create table Dingcan

(Tno varchar(10) not null primary key,

Cno varchar(10) not null,

Wno varchar(10) not null,

Dno varchar(10) not null,

Tcount int not null,

sum float not null,

foreign key(Wno) references Chuangkou(Wno),

foreign key(Cno) references Canting(Cno),

foreign key(Dno) references Caidan(Dno)

);

订餐信息表

Songcan

create table Songcan

(Tno varchar(10) not null ,

Eno varchar(10) not null,

Tcondition varchar(10) not null,

Jdate datetime not null,

foreign key(Tno) references Dingcan(Tno),

foreign key(Eno) references Employee(Eno),

primary key(Tno,Eno)

);

送餐信息表

3.3 数据操纵

内容太多,见文档

3.4 视图

视图名

定义视图和查询视图语句

说明

view_waimai

create view view_waimai

as select  Sname,Cno,Wno,Dno,Tcount,sum

from Student,Waimai,Dingcan

Where Student.Sno=Waimai.Sno

and Waimai.Tno=Dingcan.Tno;

select * from view_waimai;

建立视图查询学生信息表、外卖信息表、订餐信息表中的学生姓名、餐厅号、窗口号、菜单号,订餐的数量、总价

view_employee

create view view_employee(员工号,姓名,性别,年龄,职位,联系方式)

as select Eno,Ename,sex,age,Epos,Ephone

from Employee where sex='男';

select * from view_employee;

创建视图view_employee,包含所有男员工的编号、姓名、密码、性别、年龄、电话和职位,字段名用中文表示,并查询。

view_student

create view view_student(学号,姓名,性别,年龄,住址,联系方式)

as

select  * from Student

with check option;

select * from view_student;

便于查询学生信息

view_canting

create view view_canting(餐厅编号,是否营业,好评度,客流量,员工号)

as

select  * from Canting

with check option;

select * from view_canting;

查询餐厅信息

view_caidan

create view view_caidan(菜编号,是否供应,好评度,价钱,菜名,窗口编号,餐厅编号)

as

select  * from Caidan

with check option;

select * from view_caidan;

查询菜单信息

view_income

create view view_income(销售编号,菜编号,收入)

as

select  * from Income

with check option;

select * from view_income;

查询收入信息

view_songcan

create view view_songcan(订餐号,员工号,状况,送餐时间)

as

select  * from Songcan

with check option;

select * from view_songcan;

查询送餐信息

view_dingcan

create view view_dingcan(订餐号,餐厅编号,窗口编号,菜编号,数量,总价)

as

select  * from Dingcan

with check option;

select * from view_dingcan;

查询订餐信息

view_chuangkou

create view view_chuangkou(窗口编号,是否营业,员工编号,餐厅编号,好评度)

as

select  * from Chuangkou

with check option;

select * from view_chuangkou ;

查询窗口信息

view_pingjia

create view view_pingjia(评价编号,餐厅编号,餐厅分数,窗口编号,窗口分数,菜单编号,菜单分数,学号)

as

select  * from Pingjia

with check option;

select * from view_pingjia ;

查询评价信息

view_jiucan

create view view_jiucan(学号,菜编号,就餐时间)

as

select  * from Jiucan

with check option;

select * from view_jiucan;

查询就餐信息

3.5 索引

索引名

定义索引语句

说明

index_chuangkou

create unique index index_chuangkou

on Chuangou(Wevaluation);

建立窗口评价的唯一索引

index_canting

create index index_canting on Canting(Cno);

建立餐厅信息表的索引

index_caidan

create  index index_caidan on Caidan(Dno);

建立菜单信息表的索引

index_pingjia

create  index index_pingjia on Pingjia(Pno);

建立学生评价信息表的索引

index_income

create index index_income on Income(Ino);

建立菜收入信息表的索引

index_employee

create index index_employee on Employee(Eno);

建立员工信息表的索引

index_student

create index index_student on Student(Sno);

建立学生信息表的索引

index_jiucan

create unique index index_jiucan

on Jiucan(Sno,Dno);

在学号和菜编号上建立学生就餐信息表的唯一索引

index_waimai

create unique index index_waimai

on Waimai(Sno,Tno);

在学号和订餐号上建立学生就餐信息表的唯一索引

index_dingcan

create index index_dingcan on Dingcan(Tno);

建立订餐信息表的索引

index_songcan

create unique index index_songcan

on Songcan(Tno,Eno);

在订餐号和员工号上建立学生就餐信息表的唯一索引

3.6 存储过程

存储过程名

定义及调用存储过程语句

说明

pro_income

delimiter //

create procedure pro_income()

begin

declare inos varchar(10);

declare incomes float;

declare cursor_text CURSOR FOR select Ino,Income from Income;

declare continue handler for not found set @cur=0;

set @cur=1;

open cursor_text;

fetch cursor_text into inos,incomes;

while @cur do

select inos,incomes;

fetch cursor_text into inos,incomes;

end while;

close cursor_text;

end //

delimiter ;

call pro_income();

创建存储过程pro_income,利用循环语句控制fetch语句来检索菜收入表中的销售编号和收入。

查询结果为编号为1,收入为12。

cai_price

delimiter //

create procedure cai_price(in dno1 varchar(10), in dno2 varchar(10),p varchar(20))

begin

declare  price1,price2 float;

select price into price1 from Caidan where Dno=dno1;

select price into price2 from Caidan where Dno=dno2;

if price1>price2

then

set p=’菜太贵';

else

set p=’菜比较便宜’;

end if;

end //

delimiter ;

call cai_price('2号菜','3号菜',@p);

select @p;

drop procedure cai_price;

创建一个存储过程cai_price,输入两个菜编号,获取菜价进行比较,如果大则输出菜太贵,如果小则输出菜比较便宜,并输出菜价。

输出结果为菜太贵。

pro_stu

delimiter //

create procedure pro_stu(in sex1 char(2) )

begin

select

Sno as '学号',Sname as '姓名',sex as '性别',age as '年龄',

Sadd as '住址',Sphone as '联系方式'

from Student where sex=sex1;

 end //

delimiter ;

call pro_stu('女');

drop procedure pro_stu;

输入性别,可查询对应性别的所有学生信息。

pro_employee

delimiter //

create procedure pro_employee(in i int,in eno varchar(10),in ename varchar(20),in ssex char(2),in aage tinyint, in epos varchar(20),in pho varchar(20))

begin

  if i = 1 then

select * from Employee;

  else

insert into Employee values(eno,ename,ssex,aage,epos,pho);

end if;

end //

delimiter ;

call pro_employee(1,null,null,null,null,null,null);

call pro_employee(3,'127','张一','男',18,'员工','22345678910');

drop procedure pro_employee;

如果i为1为查询所有员工信息,否则插入员工信息

3.7 存储函数

存储函数名

定义及调用存储函数语句

说明

f_date

delimiter //

create function f_date(sno varchar(20) ,dname varchar(30))

returns datetime

DETERMINISTIC

begin

return (  

select  Sdate  

from Jiucan,Student,Caidan  

where  Student.Sno=Jiucan.Sno

and Caidan.Dno=Jiucan.Dno

and  Student.Sno=sno

and Dname=dname   );

end //

delimiter ;

select f_date('20201415120','馒头');

创建存储函数f_date,返回给定学生,给定菜名。调用存储函数,返回学号为20201415120的学生就餐时间。

输出结果为:2022-11-18 00:00:00

f_no

delimiter //

create function f_no()

returns float

DETERMINISTIC

begin

declare s float;

select sum(Income) into s from Income,Dingcan

 where Income.Dno=Dingcan.Dno and Tcount>=10;

return  s;

end //

delimiter ;

select f_no();

drop function f_no;

创建一个存储函数f_no,在查询Dingcan表数量大于等于10的菜的总收入。

经查询Tount>=10的菜编号为3、4号菜,总收入为320+500=820

f_cai

delimiter //

create function f_cai()

returns int

DETERMINISTIC

begin

declare count1 int ;

select count(*) into count1 from Caidan;

return count1;

end //

delimiter ;

select f_cai();

drop function f_cai;

调用存储函数可以返回菜的个数

3.8 触发器

触发器名

定义及使用触发器语句

说明

dc_wm

delimiter //

create trigger dc_wm after delete on Dingcan for each row

begin

delete  from Waimai where Tno=old.Tno;

delete  from Dingcan where Tno='59';

end //

delimiter ;

select * from Waimai  where Tno='59';

drop trigger dc_wm;

创建触发器dc_wm,在Dingcan表中当删除客户信息时将Waimai表中与该客户有关的数据同时全部删除。

查询订餐号Tno为59的客户为空。

cd_in

delimiter //

create trigger cd_in after update on Caidan for each row

begin

update Dingcan set sum=new.price*Tcount

where Dno=old.Dno;

end //

delimiter ;

触发:

update Caidan set price=20 where Dno='3号菜';

select * from Dingcan where Dno='3号菜';

当Caidan表中的菜价发生改变时,相应Income表中的收入也会发生改变。

3.9 事件

事件名

定义事件语句

说明

event_waimai

set @@global.event_scheduler=true;

delimiter //

create event event_waimai on schedule every 1 month

starts curdate()+interval 1 day

ends '2023-01-01'

do begin

truncate table Waimai;

end //

delimiter ;

drop event event_waimai ;

创建事件event_waimai,要求从明天开始,每月都清空Waimai表,并且在2023年1月1日结束。

event_dingcan

set @@global.event_scheduler=true;

create event event_dingcan on schedule every 7 day

do truncate table Waimai;

alter event event_dingcan enable;

alter event event_dingcan on schedule every 1 day;

alter event event_dingcan rename to event_dingcan11;

show create event event_dingcan\G

1.

创建event_dingcan事件并开启event_dingcan事件,将每周清空Dingcan表。

2.改为每天清空一次,并重命名event_dingcan事件为event_dingcan11。

event_jc

set @@global.event_scheduler=true;

delimiter //

create  event event_jc on schedule every 1 year

do

begin

delete  Jiucan,Student  from  Jiucan,Student

where Jiucan.Sno=Student.Sno

and (datediff(now(),Jiucan.Sdate)/365)>1;

end //

delimiter ;

将就餐信息表中就餐时间超过一年的学生信息删掉。

3.10 事务(在存储过程中使用事务)

存储过程名

定义及调用存储过程语句

说明

 p_jw

delimiter //

create procedure p_jw(in no varchar(20))

begin

 declare exit handler for sqlexception rollback;

 start transaction;

 delete from Jiucan where Sno=no;

 delete from Waimai where Sno=no;

 commit;

end //

delimiter ;

call p_jw('20201415124');

select * from Jiucan where Sno=’20201415124’;

Select * from Waimai where  Sno=’20201415124’;

创建存储过程p_jw,在存储过程中使用事务,实现同时删除给定学生在Jiucan表和Waimai表中的数据。Sno作为输入参数。

p_sj

delimiter //

create procedure p_sj(in sno varchar(20))

begin

declare exit handler for sqlexception rollback;

start transaction;

delete from Student where Sno=sno;

delete from Jiucan where Sno=sno;

commit;

end //

delimiter ;

call p_sj('20201415124');

当删除学生信息时,同时删除对应就餐信息。

3.11 数据库用户及权限分配

用户名

定义用户语句

权限分配与回收语句

说明

admin

select user from mysql.user;

create user

'admin'@'localhost' identified by 'qqq';

Show grants

for  admin@localhost;

grant all on Ctsystem.*

to admin@localhost;

revoke delete

on Ctsystem.Student

from admin@localhost;

创建管理用户admin,密码为qqq。授予用户admin对Ctsystem库的所有表具有所有权限。

收回对Student表的delete操作权限。

com

create user

'com'@'localhost' identified by '123';

Show grants

for  com@localhost;

grant select,update,delete

on Ctsystem.*

to com@localhost  

with grant option;

grant insert(Eno,Ename,sex,age,Epos,Ephone) on Ctsystem.Employee to com@localhost;

创建普通用户com,密码为123。

授予用户com对Ctsystem库中所有表有select操作权限,并允许其将该权限授予其他用户。

授予用户com对库中Employee表的所有列有insert权限。

3.12 备份与恢复

操作类型

对应操作的SQL语句

说明

备份

mysqldump -u root  -p  Ctsystem >D:/Ctsystem_b.sql;

使用mysqldump命令备份数据库Ctsystem中的所有表,将其备份到D:\,备份文件名为Ctsystem_b.sql

恢复

Drop table Canting;

mysql -u root  -p   Ctsystem < D:/Ctsystem_b.sql;

source D:/D:/Ctsystem_b.sql;

Show tables;

删除Canting表,使用mysql命令将备份文件Ctsystem_b.sql恢复到数据库Ctsystem中。

使用source命令将备份文件Ctsystem_b.sql恢复到数据库Ctsystem中。

导出

 select  * from Student into outfile 'D:/stu/Student.txt'  

fields terminated by '\,'

optionally enclosed by '\"'

lines terminated by '\r\n';

将 Ctsystem 数据库Student表中的数据导出到D盘stu目录中,字段值用双引号标注,字段值之间用逗号隔开,每行以回车换行为结束标志。

导入

select * from Student;

truncate table Student;

load data infile  'D:/stu/Student.txt'  into table Student

fields terminated by '\,'

optionally enclosed by '\"'

lines terminated by '\r\n';

删除Student表中的数据,然后将导出后的数据导入到Student表中。

4 项目总结及心得

见文档。

猜你喜欢

转载自blog.csdn.net/qq_70311894/article/details/131076034
今日推荐