超市销售系统——数据库系统设计_数据库实例超市销售管理系统关系模式及属性描述-程序员宅基地

技术标签: java  计算机核心课  mysql  数据库  sql  nosql  

【需求描述】:

(1)超市业务按部门开展,目前该超市有采购部、销售部、运营部等,每个员工只能在一个部门;员工在入职时需要登记员工姓名、性别、出生日期、身份证、联系电话等信息。
(2)超市销售的商品由超市运营部门决定,运营部门在确定销售的商品后,录入商品的详细信息,包含:商品编码、商品名称、条形码、产地、生产厂家、规格型号、商品进价、商品销售价、当前库存数量、库存下限数量等信息。其中,规格型号直接用文本表示;商品编码自行设计编码规则,系统自动生成商品编码。当前库存数量、库存下限数量均要大于等于0。商品营运部每天结束后需要统计商品的库存情况,若商品的当前库存数量小于等于库存下限时,这些商品不再放入货架进行销售,当补充了货源后再行销售。
(3)销售部的收银员通过商场POS机完成销售,收银员通过扫描商品完成销售并记录销售流水相关信息,包含销售时间、销售商品、销售商品单价、销售商品数量、销售商品金额、销售总金额、收银员等信息。在收银员完成销售收款后,根据销售的商品数量更新销售商品的库存数量,更新算法为:该商品的当前库存数量 – 销售数量;更新后若该商品的当前库存数量小于等于该商品的库存下限数量,系统自动生成需要采购的商品信息,包含商品编码、当前库存量、生成时间等。
(4)采购部门的采购员每天统计销售后生成的采购商品信息并进行货源组织,完成商品的采购;当采购商品到货后,采购员根据到货情况完成商品的入库,在入库时需要录入商品的进货数量,更新商品的当前库存数量,更新算法为:该商品的当前库存数量 + 进货数量。

数据模型设计

1 根据需求描述,设计该系统的概念数据模型,可以用E-R图,也可以用PowerDesigner工具;(10分)
在这里插入图片描述
2 将设计的概念数据模型转换为关系数据库的逻辑数据模型(即转换成关系数据库的关系)。(10分)
在这里插入图片描述在这里插入图片描述在这里插入图片描述

完整性设计

在这里插入图片描述
在这里插入图片描述

数据定义操作

1 采用SQL语言完成部门、员工和商品的关系模式定义,并完成相关的完整性定义;(5分)
CREATE TABLE dept(
did INT NOT NULL  PRIMARY KEY AUTO_INCREMENT,/*部门id 不空且自增长*/
dname varchar(10) UNIQUE /*部门名 唯一*/
);
CREATE TABLE emp(
eid INT NOT NULL  PRIMARY KEY AUTO_INCREMENT,/*员工id 不空且自增长*/
ename varchar(10),
sex varchar(2),
birthday DATE,
sfz varchar(20) UNIQUE,/*身份证 唯一*/
phone varchar(15), 
did int,
FOREIGN KEY(did) REFERENCES dept(did)
);

)
CREATE TABLE goods(
gid int NOT NULL  PRIMARY KEY AUTO_INCREMENT, /*商品id 不空且自增长*/
gname varchar(10),/*商品名称*/
txm varchar(10),/*条形码*/
cd varchar(30),/*产地*/
sccj varchar(20),/*生产厂家*/
ggxh varchar(5),/*规格型号*/
cpjj double,/*商品进价*/
cpssj double,/*商品销售价*/
curnum int,/*当前存库数量*/
xynum int/*存库下限数量*/
)

插入的时候要求随机生成编码的sql
insert into goods VALUES(uuid(),””,””...);

/*销售流水*/
CREATE TABLE xsls(
gid int, /*商品id*/
FOREIGN KEY(gid) REFERENCES goods(gid),/*商品外键*/
xssj DATE,/*销售时间*/
xsspdj double,/*销售商品单价*/
xsspsl int,/*销售商品数量*/
xsspje double,/*销售商品金额*/
xsspzje double,/*销售商品总金额*/
xszje double,/*销售总金额*/
xsyid int,/*销售员编号*/
FOREIGN KEY(xsyid) REFERENCES emp(eid)/*销售员外键*/
)
2 因销售流水数据量很大,现需要根据销售商品查询商品的销售流水,请叙述如何提高按商品查询销售流水的速度,并根据你设计的数据模型,使用SQL语言完成定义;(3分)
方法一通过商品的编号创建存储过程,下次直接调用存储过程
方法二给销售流水表建立索引,可以提升查询速度
方法三关联了太多的表,要实现ssql优化

CREATE PROCEDURE findsslsbygid(IN in_gid int)
BEGIN
SELECT * from xsls where gid = in_gid
END$$
3 收银员在收银时只关心商品的销售价格,不能让销售员看到商品的进价信息,请叙述如何限制收银员查看数据的范围,并根据你设计的数据模型,试用SQL语句完成定义。(4分)
定义一个给收银员看的视图(商品编号,商品名称,商品销售价)。
CREATE VIEW 收银员
AS
SELECT gid 商品编号,gname 商品名称, cpssj 商品销售价
FROM goods

数据操作

根据设计的数据模型,采用关系代数完成以下要求

(1)查询个部门的员工信息,包含部门名称、姓名、性别、出生日期;(2分)
(2)查询姓名为“董庆”的收银员的所有销售明细,包含:姓名、商品名称、销售数量、销售时间,销售金额;(3分)
(3)查询在‘2020-1-1 00:00:00’到‘2020-5-10 23:59:59’期间各种商品销售的总金额;(3分)
(4)查询销售过所有商品的收银员的姓名。(4分)
在这里插入图片描述

根据设计的数据模型,采用SQL语言完成以下要求
1)查询个部门的员工信息,包含部门名称、姓名、性别、出生日期;(2分)
SELECT eid,ename,sex,birthday from emp,dept where emp.did=dept.did
(2)查询姓名为“董庆”的收银员的所有销售明细,包含:姓名、商品名称、销售数量、销售时间,销售金额;(3分)
select gname 商品名称,xsspsl 销售数量,xssj 销售时间,xszje 销售总金额 from xsls,goods where xsyid =(select eid from emp where ename='董庆') and xsls.gid=goods.gid
(3)查询在‘2020-1-1 00:00:00’到‘2020-5-10 23:59:59’期间各种商品销售的总金额;(3分)
select xszje 销售总金额 from xsls where xssj BETWEEN 2020-1-1 00:00:00 and 2020-5-10 23:59:594)查询销售过所有商品的收银员的姓名;(4分)
select ename from xsls,emp where xsls.gid 
in(select gid from goods) and xsls.eid=emp.eid
(5)为了提高当前数据库的查询速度,在数据备份的基础上需要将离职人员的销售记录删除。现需将离职人员“张丽丽”及她所有的销售记录删除,请使用SQL语句完成删除操作。(3分)
delete from xsls where xsyid=(select eid from emp where name='张丽丽')

某同学根据需求描述,设计了商品销售关系模式如下:

商品销售(商品编码,商品名称,条形码,产地,生产厂家,销售时间、销售数量,销售价,收银员)
对关系“商品销售”,请回答以下问题:
1 给出该关系模式的函数依赖集;(4分)
(商品编码,收银员)->(销售时间,销售数量,销售价)
(商品编码)->(商品名称,条形码,产地,生产厂家)
2 给出该关系模式的候选码;(2分)
候选码:商品编码 + 收银员
3 该关系模式存在哪些问题?(3分)
关系模式存在部分依赖,如条形码只依赖于商品编码,而不依赖于该关系模式的候选码
4 判断该关系模式是否达到了3NF,说明理由。若没有达到3NF,请分解使其达到3NF。(4分)
没有到达第三范式,因为关系模式含有部分依赖属于1NF,如条形码只依赖于商品编码,而不依赖于该关系模式的候选码。
R1(商品编码,收银员,销售时间,销售数量,销售价)
R2(商品编码,商品名称,条形码,产地,生产厂家)

根据自己设计的数据模型完成以下要求

1 在收银员完成收银操作写入销售明细更新商品库存时,要检查该商品的当前库存数量,若当前库存数量小于或等于该商品的库存下限数量,系统自动生成需要采购的商品信息,包含商品编码、当前库存量、生成时间等。请使用SQL语言实现触发器完成采购信息的自动生成。(8分)
CREATE TRIGGER sccg 
AFTER UPDATE
ON goods FOR EACH ROW
BEGIN
    SELECT gid,curnum,NOW() from goods where curnum < xynum;
END
2 根据你设计的数据模型,请分析收银员在完成一笔销售的收银事务工作时要实现哪些数据更新操作?为了保证数据的一致性,请使用事务的方法写出数据更新的过程(可以采用伪代码)。(6分)
BEGIN TRANSACTION
UPDATE SET curnum=curnum-购买数量 
from goods 
where gid=购买商品的id
COMMIT
还可以给该事务加锁,利用三级分锁协议,XS锁在事务中全程加锁,保证不丢失,不读脏数据,可重复读

3 假设有两位顾客同时购买同一条码的商品(顾客甲买了2件,顾客乙买了3件),收银员在收银结算事务修改该商品的库存数量(记为数据项X)部分的调度如下表所示。
在这里插入图片描述
X的值是97,属于最终不一致性
(2) 引入独占锁指令Xlock()和解锁指令Unlock(),请重写上述调度,要求满足两段锁协议。
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43206800/article/details/106942149

智能推荐

动态污点分析隐式流--动静结合的解决方法_a dual-state filter for a relative velocity aiding-程序员宅基地

文章浏览阅读4.3k次。我们知道,对于动态污点分析来说,检测所有的信息流动是不可能的。因为污点只沿着实际执行的路径流动,特别地,动态污点分析会漏报一些implicit flows(控制流)。 一个想法是采用动静结合的方法,解决隐式流造成的误报。_a dual-state filter for a relative velocity aiding strapdown in

快速理解GNN、GCN、R-GCN、GAT_cnr和gcnr-程序员宅基地

文章浏览阅读4k次,点赞7次,收藏45次。写在前面:仅用于记录自己学习快速理解GNN、GCN、R-GCN、GATGNNGCNR-GCNGAT观看视频链接GNN观看视频链接GCN观看视频链接R-GCN观看视频链接GATGNNGNN的流程:聚合、更新、循环a、b、c的常数值可以自己手动定,也可以是模型训练来定。所以,a、b、c的常数值设置经常是文章的改进点。将邻居的信息结合到自己身上来,作为自己信息的补足。GCN与GNN相比,在聚合的过程中有了特殊的变化,GCN解决上面GNN中聚合部分的a、b、c值的设定问题。平均法_cnr和gcnr

最全最详细的Java异常处理机制_1.java异常处理机制 目标:掌握java异常处理机制和常见的java异常处理方法。 (1)-程序员宅基地

文章浏览阅读3.4w次,点赞231次,收藏1.3k次。一、异常概述与异常体系结构异常概述在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等。 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常(开发过程中的语法错误和逻辑错误不是异常)。Java程序在执行过程中所发生的异常事件可分为两类:..._1.java异常处理机制 目标:掌握java异常处理机制和常见的java异常处理方法。 (1)

jQuery之位置坐标图形相关方法(offset\offset\position\scrollTop\scrollLeft\width\height\innerWidth\outerWidth)_jquery offset outeroffset-程序员宅基地

文章浏览阅读220次。文章目录offset取值、offset设值positionoffset取值、offset设值<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, in..._jquery offset outeroffset

undefined reference to `cv::calcOpticalFlowFarnebackcalcOpticalFlowFarneback-程序员宅基地

文章浏览阅读1.2k次。When I want to call calcOpticalFlowFarneback( ) to caculate the dense optical flow, then_undefined reference to `cv::calcopticalflowfarneback

仿真与测试:通过Signal Builder模块生成输入信号-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏30次。本文研究通过Signal Builder模块生成输入信号的方法,这种方式比较适合简单的子系统测试,或者一些实际情况下不容易达到的边界条件输入的测试。目录。_signal builder

随便推点

使用 WebSockets 进行 HTML5 视频直播_ws 能h5播放吗-程序员宅基地

文章浏览阅读3.2w次。使用 WebSockets 进行 HTML5 视频直播_ws 能h5播放吗

mysql之数据库int(10)能输入多少位_mysql int(10)-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏13次。首先来说一下int(10)的含义,拆分int(10),如int(M),int代表整数数据,那么括号中的M是代表多少位,我们常用的可能有int(4),int(10)等等,一开始我认为int(4)比int(10)所占的存储空间要小,实际并不是这样的,原来,在int(M)中,M的值跟int(M)的存储没有半毛钱的关系,并且,int(4)、int(10)哪怕是int(100)等等,它们所在磁盘中都是占用..._mysql int(10)

XMLHTTPRequest使用之 发送请求参数.-程序员宅基地

文章浏览阅读1.7k次。1.客户端部分<script language="javascript" type="text/javascript">var xhr=null;//创建XMLHTTPRequestfunction getXHR(){var _xhr=null; if(window.ActiveXObject) {...

ubuntu下Bugzilla的安装与配置_ubuntu18.04 bugzilla安装配置-程序员宅基地

文章浏览阅读1k次。ubuntu下Bugzilla的安装与配置分类: 开发工具使用2012-01-08 13:35 3576人阅读 评论(1) 收藏 举报ubuntuperlbugsapachemysql数据库Bugzilla简介 Bugzilla是一个共享的免费的产品缺陷记录及跟踪工具(Bug-Tracking System)。由Mozilla公司提供。创_ubuntu18.04 bugzilla安装配置

凹、凸、分离多边形的填充绘制_获取凹多边形内部栅格-程序员宅基地

文章浏览阅读996次。步骤:1.建立多边形:按顺时针顺序逐个提供坐标点。2.绘制。绘制步骤:1.计算外接矩形:就是逐个坐标点比较,最后得到一个刚好框住该多边形的矩形。2.制作bitMap(位图或者说栅格图):根据外接矩形的大小,自行分配内存,制作一个栅格图。3.填写栅格图–画线:在栅格图把各个点坐标和连线先画上(画直线的方法网上很多),别忘了要把坐标偏移一下。4.填写栅格图–递归填充:上面的栅格图在制作时..._获取凹多边形内部栅格

UC伯克利新机器人成果:灵活自由地使用工具-程序员宅基地

文章浏览阅读434次。来源:AI科技评论摘要:前几天我们刚刚介绍了加州大学伯克利分校PieterAbbeel教授领导伯克利机器人学习实验室(UCBerkeley'sRobotLe...

推荐文章

热门文章

相关标签