餐馆订餐信息管理系统

基本要求:

1、包括五个或五个以上基本表,其中至少有一个是基于实体之间联系的基本表;

2、实现餐馆送餐员基本信息、订餐基本信息、订单等信息的增加、删除、修改、查询(包括五种或五种以上单条件查询和多条件复合查询)、统计功能;

3、设置用户权限管理,不同权限的用户对不同信息操作的权限要区分;

  • 需求分析

本系统的最终用户为送餐员工,订餐用户。根据我们日常生活中的经验,结合对餐馆用户的咨询和对周围市民的调查,得出用户的下列实际要求:

1、订餐的基本情况

一、老板的基本信息

老板可以查看顾客的基本信息。查看员工的基本信息,对员工进行管理,可以进行增、删、查、改。而且对他们的工资进行修改。老板的联系电话进行公开,方便顾客有什么问题可以反馈给自己。

二、送餐员工的基本信息

一个餐馆有多个送餐员,一个送餐员要处理多张订单。每一张订单是一个唯一的送餐员来送餐。他要能够查看用户订单的信息,才能够获取电话和地址等的联系方式去送餐,以及查看顾客的留言。

三、顾客的基本信息

订餐用户是能够注册、修改、查看自己的个人信息。

四、菜单的基本信息

菜单要能够有编号、菜名、价格。

五、订餐管理的基本信息

顾客能够选择要能够浏览菜单点菜,顾客能够看到菜单的价格,菜名。顾客的基本信息生成订单条目。订单包含了订单的菜单信息,订单条目信息。

2、用户对系统的要求

一、老板

a.信息要求:

餐馆老板能够对顾客的信息进行查看,对员工进行管理,对于他们的工资进行调整和发放。

b.处理要求:

对员工的信息可以进行调整,也可以调整他们的工资。

c.安全性与完整性要

餐馆老板只有电话联系方式信息,防止自己的信息泄露。

二、送餐员工

a.信息要求:

送餐员能查询顾客订餐的所有相关信息,包括顾客在订餐的详细信息,顾客的电话号、地址、订单的详细信息、菜品预订的详细信息、留言的信息。以利于对整个订餐过程的全面管理。

b.处理要求:

根据用户的留言对订菜品、时间等等信息进行调整,接收用户发过来的订单信息。

C.安全性与完整性要求:

不能拒绝顾客的订餐要求,对于留言只能查看,防止送餐员工进行对顾客的语言攻击。

三、订餐用户

a.信息要求:

订餐顾客可以对自己的信息进行修改整理,可以在订餐的时候对于送餐地址不固定性选择,联系方式也可以随时更换,一个家庭注册一个用户就可以了。

b.处理要求:

可以更改自己的用户信息。

c.安全性与完整性要

用户注册的敏感信息员工是无法获取的,防止顾客有不便的打扰。

2.1概念设计

根据需求分析的数据项和数据结构以及画出的功能模块图,可以规划出系统的三大类用户:餐馆老板、送餐员、顾客。因为三者在系统中需要分别进行数据记录,所以需要如下三个用户数据实体:

  1. 餐馆:餐馆ID,餐馆名称,地址,电话号码。
  2. 送餐员:送餐员ID,姓名,电话号码。
  3. 顾客:账号,姓名,手机号。

由于操作模块的名称对应权限,在程序初始化时这些数据都应该添加,按照各个用户使用餐馆订餐信息系统的目的进行管理,因此还要包括如下的几个数据实体:

  1. 订单数据实体:订单编号,菜品名称,数量,价格,地址。
  2. 聘用数据实体:送餐员ID,餐馆ID,姓名,电话号码。
  3. 出餐数据实体:餐馆ID,订单编号,出餐时间。
  4. 点单数据实体:账号,日期,订单编号,菜品名称,数量,价格。
  5. 送餐数据实体:送餐员ID,订单编号,菜品名称,数量,价格,送达时间,取餐时间。

2.2 E-R图设计

  • 逻辑结构设计

3.1关系模式中范式的判断:

(1)餐馆(餐馆ID,餐馆名称,地址,电话号码),餐馆ID为主键,没有外键;这里所有属性都是不可再分的基本数据项,所以属于第一范式,各属性完全依赖于主键,所以属于第二范式,没有非主属性对于码的传递函数依赖,是第三范式。

(2)顾客(账号,姓名,手机号),账号为主键,没有外键;这里所有属性都是不可再分的基本数据项,所以属于第一范式,各属性完全依赖于主键,所以属于第二范式,没有非主属性对于码的传递函数依赖,是第三范式。

(3)送餐员(送餐员ID,姓名,电话号码)送餐员ID为主键,没有外键;这里所有属性都是不可再分的基本数据项,所以属于第一范式,各属性完全依赖于主键,所以属于第二范式,没有非主属性对于码的传递函数依赖,是第三范式。

3.2数据库关系模型

实体或联系               属性

顾客

账号,姓名,手机号

餐馆

餐馆ID,餐馆名称,地址,电话号码

送餐员

送餐员ID,姓名,电话号码

订单

订单编号,菜品名称,数量,价格,地址

聘用

送餐员ID,餐馆ID,姓名,电话号码

出餐

餐馆ID,订单编号,出餐时间

点单

账号,日期,订单编号,菜品名称,数量,价格

送餐

送餐员ID,订单编号,菜品名称,数量,价格,送达时间,取餐时间

顾客表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

账号

顾客的账号

VARCHAR

20

N

Y

-

-

-

-

姓名

顾客的姓名

VARCHAR

50

N

-

-

-

-

-

手机号

顾客的手机号

VARCHAR

15

N

-

-

-

-

-

餐馆表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

餐馆ID

餐馆的ID

INT

-

N

Y

-

-

-

-

餐馆名称

餐馆的名称

VARCHAR

50

N

-

-

-

-

-

地址

餐馆的地址

VARCHAR

100

N

-

-

-

-

-

电话号码

餐馆的电话号码

VARCHAR

15

N

-

-

-

-

-

送餐员表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

送餐员ID

送餐员的ID

INT

-

N

Y

-

-

-

-

姓名

送餐员的姓名

VARCHAR

50

N

-

-

-

-

-

电话号码

送餐员的电话号码

VARCHAR

15

N

-

-

-

-

-

订单表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

订单编号

订单的编号

INT

-

N

Y

-

-

-

-

菜品名称

订单中的菜品名称

VARCHAR

50

N

-

-

-

-

-

数量

订单中的菜品数量

INT

-

N

-

-

-

-

-

价格

订单的价格

DECIMAL

10,2

N

-

-

-

-

-

地址

顾客的地址

VARCHAR

100

N

-

-

-

-

-

聘用表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

送餐员ID

送餐员的ID

INT

-

N

Y

Y

-

送餐员表

-

餐馆ID

餐馆的ID

INT

-

N

Y

Y

-

餐馆表

-

姓名

送餐员的姓名

VARCHAR

50

N

-

-

-

-

-

电话号码

送餐员的电话号码

VARCHAR

15

N

-

-

-

-

-

出餐表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

餐馆ID

餐馆的ID

INT

-

N

Y

Y

-

餐馆表

-

订单编号

订单的编号

INT

-

N

Y

Y

-

订单表

-

出餐时间

出餐的时间

DATETIME

-

N

-

-

-

-

-

点单表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

账号

顾客的账号

VARCHAR

20

N

Y

Y

-

顾客表

-

日期

点单的日期

DATE

-

N

Y

-

-

-

-

订单编号

订单的编号

INT

-

N

Y

Y

-

订单表

-

菜品名称

订单中的菜品名称

VARCHAR

50

N

-

-

-

-

-

数量

订单中的菜品数量

INT

-

N

-

-

-

-

-

价格

订单的价格

DECIMAL

10,2

N

-

-

-

-

-

送餐表:

字段名

描述

类型

宽度

可空

主键

外键

默认值

依赖关系

备注

送餐员ID

送餐员的ID

INT

-

N

Y

Y

-

送餐员表

-

订单编号

订单的编号

INT

-

N

Y

Y

-

订单表

-

菜品名称

订单中的菜品名称

VARCHAR

50

N

-

-

-

-

-

数量

订单中的菜品数量

INT

-

N

-

-

-

-

-

价格

订单的价格

DECIMAL

10,2

N

-

-

-

-

-

送达时间

送餐的时间

DATETIME

-

N

-

-

-

-

-

取餐时间

取餐的时间

DATETIME

-

N

-

-

-

-

-

以上是各个表的数据字典,包含了每个表的字段名称、描述、数据类型、宽度、是否可空、是否为主键、是否为外键、默认值、依赖关系和备注。

创建关系图

(略)(自己弄吧)

创建数据库和使用

create restaurant 餐馆订餐信息管理系统

  create database restaurant on primary
(
	name='restaurant',
	filename='D:\database\restaurant.mdf',
	size=5MB,
	maxsize=100MB,
	filegrowth=15%
)
Log on
(
	name='restaurant_log',
	filename='D:\database\restaurant.ldf',
	size=5MB,
	maxsize=100MB,
	filegrowth=15%
)

GO

创建数据表

CREATE DATABASE ORD;

USE restaurant;
/*创建顾客表*/
CREATE TABLE 顾客(
    账号 VARCHAR(20) NOT NULL PRIMARY KEY,
    姓名 VARCHAR(50) NOT NULL,
    手机号 VARCHAR(15) NOT NULL,
);
/*创建餐馆表*/
CREATE TABLE 餐馆(
    餐馆ID INT NOT NULL PRIMARY KEY,
    餐馆名称 VARCHAR(50) NOT NULL,
    地址 VARCHAR(100) NOT NULL,
    电话号码 VARCHAR(15) NOT NULL
);
/*创建送餐员表*/
CREATE TABLE 送餐员(
    送餐员ID INT NOT NULL PRIMARY KEY,
    姓名 VARCHAR(50) NOT NULL,
    电话号码 VARCHAR(15) NOT NULL
);
/*创建订单表*/
CREATE TABLE 订单(
    订单编号 INT NOT NULL PRIMARY KEY,
    菜品名称 VARCHAR(50) NOT NULL,
    数量 INT NOT NULL,
价格 DECIMAL(10,2) NOT NULL
地址 VARCHAR(100) NOT NULL
);
/*创建聘用表*/
CREATE TABLE 聘用(
    送餐员ID INT NOT NULL,
    餐馆ID INT NOT NULL,
    姓名 VARCHAR(50) NOT NULL,
    电话号码 VARCHAR(15) NOT NULL,
    PRIMARY KEY (送餐员ID, 餐馆ID),
    FOREIGN KEY (送餐员ID) REFERENCES 送餐员(送餐员ID),
    FOREIGN KEY (餐馆ID) REFERENCES 餐馆(餐馆ID)
);
/*创建出餐表*/
CREATE TABLE 出餐(
    餐馆ID INT NOT NULL,
    订单编号 INT NOT NULL,
    出餐时间 DATETIME NOT NULL,
    PRIMARY KEY (餐馆ID, 订单编号),
    FOREIGN KEY (餐馆ID) REFERENCES 餐馆(餐馆ID),
    FOREIGN KEY (订单编号) REFERENCES 订单(订单编号)
);
/*创建点单表*/
CREATE TABLE 点单(
    账号 VARCHAR(20) NOT NULL,
    日期 DATE NOT NULL,
    订单编号 INT NOT NULL,
    菜品名称 VARCHAR(50) NOT NULL,
    数量 INT NOT NULL,
    价格 DECIMAL(10,2) NOT NULL,
    PRIMARY KEY (账号, 日期, 订单编号),
    FOREIGN KEY (账号) REFERENCES 顾客(账号),
    FOREIGN KEY (订单编号) REFERENCES 订单(订单编号)
);
/*创建送餐表*/
CREATE TABLE 送餐(
    送餐员ID INT NOT NULL,
    订单编号 INT NOT NULL,
    菜品名称 VARCHAR(50) NOT NULL,
    数量 INT NOT NULL,
    价格 DECIMAL(10,2) NOT NULL,
    送达时间 DATETIME NOT NULL,
    取餐时间 DATETIME NOT NULL,
    PRIMARY KEY (送餐员ID, 订单编号),
    FOREIGN KEY (送餐员ID) REFERENCES 送餐员(送餐员ID),
    FOREIGN KEY (订单编号) REFERENCES 订单(订单编号)
);

创建索引

-- 为顾客表的手机号创建索引
CREATE INDEX idx_顾客_手机号 ON 顾客 (手机号);

-- 为餐馆表的地址创建索引
CREATE INDEX idx_餐馆_地址 ON 餐馆 (地址);

-- 为送餐员表的电话号码创建索引
CREATE INDEX idx_送餐员_电话号码 ON 送餐员 (电话号码);

-- 为订单表的菜品名称创建索引
CREATE INDEX idx_订单_菜品名称 ON 订单 (菜品名称);

-- 为聘用表的送餐员ID和餐馆ID创建索引
CREATE INDEX idx_聘用_送餐员ID ON 聘用 (送餐员ID);
CREATE INDEX idx_聘用_餐馆ID ON 聘用 (餐馆ID);

-- 为出餐表的餐馆ID和订单编号创建索引
CREATE INDEX idx_出餐_餐馆ID ON 出餐 (餐馆ID);
CREATE INDEX idx_出餐_订单编号 ON 出餐 (订单编号);

-- 为点单表的账号和订单编号创建索引
CREATE INDEX idx_点单_账号 ON 点单 (账号);
CREATE INDEX idx_点单_订单编号 ON 点单 (订单编号);

-- 为送餐表的送餐员ID和订单编号创建索引
CREATE INDEX idx_送餐_送餐员ID ON 送餐 (送餐员ID);
CREATE INDEX idx_送餐_订单编号 ON 送餐 (订单编号);

创建用户操作

创建顾客和送餐员、餐馆老板的登录用户、数据库用户,密码默认123456

-- 创建一个名为'顾客'的登录名,密码为'123456'
CREATE LOGIN 顾客 WITH PASSWORD = '123456';
-- 在restaurant数据库中为'顾客'创建一个用户
USE restaurant;
CREATE USER 顾客 FOR LOGIN 顾客;

-- 创建一个名为'送餐员'的登录名,密码为'123456'
CREATE LOGIN 送餐员 WITH PASSWORD = '123456';
-- 在restaurant数据库中为'送餐员'创建一个用户
CREATE USER 送餐员 FOR LOGIN 送餐员;

-- 创建一个名为'餐馆老板'的登录名,密码为'123456'
CREATE LOGIN 餐馆老板 WITH PASSWORD = '123456';
-- 在restaurant数据库中为'餐馆老板'创建一个用户
CREATE USER 餐馆老板 FOR LOGIN 餐馆老板;

分配权限操作

顾客用户权限

-- 为顾客角色分配查询和修改顾客表的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON 顾客 TO 顾客;
GRANT SELECT, INSERT, UPDATE, DELETE ON 点单 TO 顾客;

-- 为顾客角色分配查询送餐表、出餐表、送餐员表、餐馆表的权限
GRANT SELECT ON 送餐 TO 顾客;
GRANT SELECT ON 出餐 TO 顾客;
GRANT SELECT ON 送餐员 TO 顾客;
GRANT SELECT ON 餐馆 TO 顾客;

送餐员用户权限

-- 为送餐员角色分配查询和修改送餐员表、聘用表、送餐表的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON 送餐员 TO 送餐员;
GRANT SELECT, INSERT, UPDATE, DELETE ON 聘用 TO 送餐员;
GRANT SELECT, INSERT, UPDATE, DELETE ON 送餐 TO 送餐员;

-- 为送餐员角色分配查询订单表、出餐表、餐馆表的权限
GRANT SELECT ON 订单 TO 送餐员;
GRANT SELECT ON 出餐 TO 送餐员;
GRANT SELECT ON 餐馆 TO 送餐员;

餐馆老板用户权限

-- 为餐馆老板角色分配查询和修改餐馆表、聘用表、出餐表、订单表的权限
GRANT SELECT, INSERT, UPDATE, DELETE ON 餐馆 TO 餐馆老板;
GRANT SELECT, INSERT, UPDATE, DELETE ON 聘用 TO 餐馆老板;
GRANT SELECT, INSERT, UPDATE, DELETE ON 出餐 TO 餐馆老板;
GRANT SELECT, INSERT, UPDATE, DELETE ON 订单 TO 餐馆老板;

-- 为餐馆老板角色分配查询点单表、送餐员表、送餐表的权限
GRANT SELECT ON 点单 TO 餐馆老板;
GRANT SELECT ON 送餐员 TO 餐馆老板;
GRANT SELECT ON 送餐 TO 餐馆老板;

操作

插入基本数据

/*插入基本数据*/
INSERT INTO 顾客 VALUES ('001', '张三', '13800138000');
INSERT INTO 顾客 VALUES ('002', '李四', '13900139000');

INSERT INTO 餐馆 VALUES (1, '餐馆A', '北京市朝阳区', '010-12345678');
INSERT INTO 餐馆 VALUES (2, '餐馆B', '北京市海淀区', '010-87654321');

INSERT INTO 送餐员 VALUES (100, '王五', '13600136000');
INSERT INTO 送餐员 VALUES (101, '赵六', '13700137000');

INSERT INTO 订单 VALUES (1000, '宫保鸡丁', 2, 32.00, '北京市朝阳区');
INSERT INTO 订单 VALUES (1001, '鱼香肉丝', 1, 28.00, '北京市海淀区');

INSERT INTO 聘用 VALUES (100, 1, '王五', '13600136000');
INSERT INTO 聘用 VALUES (101, 2, '赵六', '13700137000');

INSERT INTO 出餐 VALUES (1, 1000, '2023-11-29 12:00:00');
INSERT INTO 出餐 VALUES (2, 1001, '2023-11-29 12:30:00');

INSERT INTO 点单 VALUES ('001', '2023-11-29', 1000, '宫保鸡丁', 2, 32.00);
INSERT INTO 点单 VALUES ('002', '2023-11-29', 1001, '鱼香肉丝', 1, 28.00);

INSERT INTO 送餐 VALUES (100, 1000, '宫保鸡丁', 2, 32.00, '2023-11-29 12:30:00', '2023-11-29 12:00:00');
INSERT INTO 送餐 VALUES (101, 1001, '鱼香肉丝', 1, 28.00, '2023-11-29 13:00:00', '2023-11-29 12:30:00');
INSERT INTO 顾客 VALUES ('003', '王二', '13800138001');
INSERT INTO 顾客 VALUES ('004', '尹子', '13900139001');

INSERT INTO 餐馆 VALUES (3, '餐馆C', '北京市东城区', '010-12345679');
INSERT INTO 餐馆 VALUES (4, '餐馆D', '北京市西城区', '010-87654322');

INSERT INTO 送餐员 VALUES (102, '孙七', '13600136001');
INSERT INTO 送餐员 VALUES (103, '周八', '13700137001');

INSERT INTO 订单 VALUES (1002, '红烧肉', 1, 38.00, '北京市东城区');
INSERT INTO 订单 VALUES (1003, '清蒸鱼', 1, 48.00, '长沙理工大学');

INSERT INTO 聘用 VALUES (102, 3, '孙七', '13600136001');
INSERT INTO 聘用 VALUES (103, 4, '周八', '13700137001');

INSERT INTO 出餐 VALUES (3, 1002, '2023-11-29 12:00:00');
INSERT INTO 出餐 VALUES (4, 1003, '2023-11-29 12:30:00');

INSERT INTO 点单 VALUES ('003', '2023-11-29', 1002, '红烧肉', 1, 38.00);
INSERT INTO 点单 VALUES ('004', '2023-11-29', 1003, '清蒸鱼', 1, 48.00);

INSERT INTO 送餐 VALUES (102, 1002, '红烧肉', 1, 38.00, '2023-11-29 12:30:00', '2023-11-29 12:00:00');
INSERT INTO 送餐 VALUES (103, 1003, '清蒸鱼', 1, 48.00, '2023-11-29 13:00:00', '2023-11-29 12:30:00');

增加信息

-- 增加一个新的餐馆
INSERT INTO 餐馆 VALUES (5, '餐馆E', '北京市朝阳区', '010-12345680');

-- 增加一个新的送餐员
INSERT INTO 送餐员 VALUES (104, '吴九', '13600136002');

-- 增加一个新的订单
INSERT INTO 订单 VALUES (1004, '糖醋排骨', 1, 42.00, '长沙理工大学');

删除信息

-- 删除一个餐馆
DELETE FROM 餐馆 WHERE 餐馆ID = 5;

-- 删除一个送餐员
DELETE FROM 送餐员 WHERE 送餐员ID = 104;

-- 删除一个订单
DELETE FROM 订单 WHERE 订单编号 = 1004;

修改信息

-- 修改餐馆的电话号码
UPDATE 餐馆 SET 电话号码 = '010-12345681' WHERE 餐馆ID = 1;

-- 修改送餐员的姓名
UPDATE 送餐员 SET 姓名 = '张十' WHERE 送餐员ID = 100;

-- 修改订单的价格
UPDATE 订单 SET 价格 = 45.00 WHERE 订单编号 = 1000;

查询信息

-- 查询所有餐馆的信息
SELECT * FROM 餐馆;

-- 查询所有送餐员的信息
SELECT * FROM 送餐员;

-- 查询所有订单的信息
SELECT * FROM 订单;

-- 查询某个餐馆的所有订单
SELECT * FROM 订单 WHERE 订单编号 IN (SELECT 订单编号 FROM 出餐 WHERE 餐馆ID = 1);

-- 查询某个送餐员的所有订单
SELECT * FROM 订单 WHERE 订单编号 IN (SELECT 订单编号 FROM 送餐 WHERE 送餐员ID = 100);

-- 查询某个顾客的所有订单
SELECT * FROM 订单 WHERE 订单编号 IN (SELECT 订单编号 FROM 点单 WHERE 账号 = '001');

-- 查询某个餐馆的所有送餐员
SELECT * FROM 送餐员 WHERE 送餐员ID IN (SELECT 送餐员ID FROM 聘用 WHERE 餐馆ID = 1);

-- 查询某个送餐员服务的所有餐馆
SELECT * FROM 餐馆 WHERE 餐馆ID IN (SELECT 餐馆ID FROM 聘用 WHERE 送餐员ID = 100);

-- 查询某个顾客在某个餐馆的所有订单
SELECT * FROM 订单 WHERE 订单编号 IN (SELECT 订单编号 FROM 点单 WHERE 账号 = '001') AND 订单编号 IN (SELECT 订单编号 FROM 出餐 WHERE 餐馆ID = 1);

统计功能

-- 统计餐馆的数量
SELECT COUNT(*) FROM 餐馆;

-- 统计送餐员的数量
SELECT COUNT(*) FROM 送餐员;

-- 统计订单的数量
SELECT COUNT(*) FROM 订单;

-- 统计某个餐馆的订单数量
SELECT COUNT(*) FROM 订单 WHERE 订单编号 IN (SELECT 订单编号 FROM 出餐 WHERE 餐馆ID = 1);

-- 统计某个送餐员的订单数量
SELECT COUNT(*) FROM 订单 WHERE 订单编号 IN (SELECT 订单编号 FROM 送餐 WHERE 送餐员ID = 100);

-- 统计某个顾客的订单数量
SELECT COUNT(*) FROM 订单 WHERE 订单编号 IN (SELECT 订单编号 FROM 点单 WHERE 账号 = '001');

  • 25
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值