组长:洪程岷 组员:李海伦,左一凡
1 系统分析
1.1 项目背景
现代社会对个人知识和技能的要求越来越高,因此人们更倾向于购买书籍来扩展自己的知识和技能。为了提高销售效率、改善库存管理、提升客户服务等。项目的目的可能是建立一个高效的销售管理系统,以便更好地跟踪库存、管理订单和客户信息,并提供更好的服务体验。目标群体可能包括图书店管理人员、销售人员和顾客。这些描述有助于确定项目的范围和功能需求,以及为项目的实施制定合适的计划。
1.2图书销售管理系统需求分析
1.2.1图书销售流程分析:
系统应支持图书零售购买和退货流程,包括结账、销售小票生成以及对销售小票流水号进行查询以办理退货。
1.2.2会员管理分析:
系统需要支持会员管理功能,包括会员添加、查找、删除、信息修改、充值、挂失与特别处理等。
系统还需要支持会员组管理,包括添加、删除、设置折扣和积分换算等功能。
1.2.3图书管理分析:
系统需要支持图书进货和退货功能,同时处理金额差异。
图书的编目和修改功能应该包括使用多种方式进行查找,如书名、作者等。
对于已编目的图书,系统应该提供修改图书的基本信息、零售价和最低折扣价设置的功能。
1.2.4出版社管理分析:
系统应支持对出版社的管理,包括添加、删除、修改出版社信息,并能够查询出版社的资料。
1.2.5系统管理分析:
系统需要提供系统设置功能,包括添加、删除、修改系统操作员,同时设置其控制权限。
还需要支持密码修改功能以及对系统数据库的备份与恢复。
2 系统设计
2.1全局E-R图
+2.2关系模型设计
出版社(出版社ID,出版社名称,地址,联系方式) 主码:出版社ID
图书信息(ISBN,图书名,出版社ID,作者,售价) 主码:ISBN 外码:出版社ID
库存(ISBN,日期,进货数量,退货数量) 主码:(ISBN,日期)
(关系)存储(ISBN,日期,存储数量) 主码(ISBN,日期)
销售员(销售员编号,姓名,性格,登录密码) 主码:销售员编号
(关系)销售(ISBN,销售员编号,销量) 主码:(ISBN,销售员编号) 外码:ISBN,销售员编号
顾客(联系方式,姓名,性别,会员组编号) 主码:联系方式 外码:会员组编号
(关系)买卖(满意度,销售员编号,联系方式) 主码:(销售员编号,联系方式) 外码:销售员编号,联系方式
充值记录(记录编号,充值金额,充值日期,联系方式) 主码:记录编号 外码:联系方式
会员(会员编号,剩余金额,消费次数,累计消费金额,会员组编号) 主码:会员编号 外码:会员组编号
会员组(会员组编号,等级,折扣) 主码:会员组编号
(关系)属于(会员编号,会员组编号,联系方式) 主码:(会员编号,会员组编号,联系方式) 外码:会员编号,会员组编号,联系方式
2.2建表
1出版商表
CREATE TABLE Publishers (
PublisherID VARCHAR(5) NOT NULL,
Name VARCHAR(50) NOT NULL,
Address VARCHAR(30),
ContactInfo VARCHAR(20),
PRIMARY KEY(PublisherID)
);
2图书表
CREATE TABLE Books (
BookID VARCHAR(20) PRIMARY KEY,
Title VARCHAR(50),
PublisherID VARCHAR(5),
Author VARCHAR(20),
Price DECIMAL(5, 2),
FOREIGN KEY (PublisherID) REFERENCES Publishers(PublisherID)
ON DELETE CASCADE
ON UPDATE CASCADE
);
3 库存表
CREATE TABLE Inventory (
BookID VARCHAR(20),
Quantity INT,
recordday DATE,
PurchaseQuantity INT,
ReturnQuantity INT,
PRIMARY KEY (BookID,recordday)
);
4(关系)存储表
CREATE TABLE Storage (
BookID VARCHAR(20),
recordday DATE,
StorageQuantity INT,
PRIMARY KEY (BookID,recordday)
);
5销售员表
CREATE TABLE SalesMan (
SalesManID VARCHAR(20),
SalesManName VARCHAR(5),
SalesManSex char(1),
PassWorld VARCHAR(20),
PRIMARY KEY (SalesManID)
);
6销售表
CREATE TABLE Sales (
BookID VARCHAR(20),
SalesManID VARCHAR(20),
SalesQuantity INT,
PRIMARY KEY (BookID,SalesManID),
FOREIGN KEY (BookID) REFERENCES Books(BookID),
FOREIGN KEY (SalesManID) REFERENCES SalesMan(SalesManID)
);
7顾客表
CREATE TABLE Customers (
CustomerName VARCHAR(20),
CustomerSex char(1),
CustomerContactInfo VARCHAR(20),
VIPGroupID VARCHAR(5),
PRIMARY KEY (CustomerContactInfo),
FOREIGN KEY (VIPGroupID) REFERENCES VIPGroups (VIPGroupID)
);
8(关系)买卖表
CREATE TABLE Trade (
SalesManID VARCHAR(20),
CustomerContactInfo VARCHAR(20),
Satisfaction VARCHAR(5),
PRIMARY KEY (SalesManID,CustomerContactInfo),
FOREIGN KEY (SalesManID) REFERENCES SalesMan(SalesManID),
FOREIGN KEY (CustomerContactInfo) REFERENCES Customers(CustomerContactInfo)
);
9会员组表
CREATE TABLE VIPGroups (
VIPGroupID VARCHAR(5) PRIMARY KEY,
Level VARCHAR(5),
Discount DECIMAL(4, 2)
);
10会员表
CREATE TABLE VIP (
VIPID VARCHAR(5) PRIMARY KEY,
RemainMoney DECIMAL(5,2),
consumeTimes INT,
TotalCost DECIMAL(5, 2),
VIPGroupID VARCHAR(5),
FOREIGN KEY (VIPGroupID) REFERENCES VIPGroups (VIPGroupID)
);
11充值记录表
CREATE TABLE RechargeRecords (
RecordID VARCHAR(20) PRIMARY KEY,
CustomerContacInfo VARCHAR(20),
RechargeAmount DECIMAL(5, 2),
RechargeDate DATE,
FOREIGN KEY (CustomerContacInfo) REFERENCES Customers(CustomerContacInfo)
);
12(关系)属于表
CREATE TABLE Customer-VIP-VIPGroup (
CustomerContactInfo VARCHAR(20),
VIPID VARCHAR(5),
VIPGroupID VArCHAR(5),
FOREIGN KEY (CustomerContactInfo) REFERENCES Customers(CustomerContactInfo),
FOREIGN KEY (VIPID) REFERENCES VIP(VIPID),
FOREIGN KEY (VIPGroupID) REFERENCES VIPGroup(VIPGroupID),
);
3 完整性设计
3.1触发器
1进货数量或退货数量增加的时候,存储数量增加对应的数量
CREATE TRIGGER UpdateStorageQuantity
AFTER UPDATE ON Inventory
FOR EACH ROW
BEGIN
DECLARE new_recordday DATE;
SET new_recordday = NEW.recordday;
IF OLD.PurchaseQuantity <> NEW.PurchaseQuantity THEN
UPDATE Storage
SET StorageQuantity = StorageQuantity + (NEW.PurchaseQuantity - OLD.PurchaseQuantity)
WHERE BookID = NEW.BookID AND recordday = new_recordday;
END IF;
IF OLD.ReturnQuantity <> NEW.ReturnQuantity THEN
UPDATE Storage
SET StorageQuantity = StorageQuantity + (NEW.ReturnQuantity - OLD.ReturnQuantity)
WHERE BookID = NEW.BookID AND recordday = new_recordday;
END IF;
END;