目录
前言
针对于连锁超市信息管理系统系统进行需求分析,并在需求分析的基础上进行数据库的概念结构设计、逻辑结构设计和物理结构设计。建立实施数据库,并完成存储过程和触发器的设计。编写应用程序,能够正确连接和访问数据库。
一、需求分析
1.1功能需求分析
(1)员工
员工信息的增删改;进行商品采购;查询、添加和修改商品和商品类别;查看购物详细清单、统计每日、每月的销售额;办理会员卡业务;
(2)会员
会员信息的增删改;购买商品、查询商品及会员积分;进行商品结算,打印小票。
(3)连锁超市
超市信息的增删改;统计商品的库存情况;雇佣员工;销售商品,生成销售报告。
(4)供货商
供货商信息的增删改;供应商品,生成供货商报告。
1.2数据需求分析
(1)员工:员工编号,姓名,性别,年龄,职位。
(2)会员:会员编号,会员名字,性别,电话号码,积分。
(3)商品:商品编号,商品名称,单价。
(4)小票:小票编号。
(5)连锁超市:超市编号,地址,店长。
(6)供货商:供货商编号,供货商名称,地址,电话号码。
二、概念结构设计
2.1 总体E-R图
图2-1 总体E-R图
2.2实体属性图
图2-2 员工属性图
图2-3 会员属性图
图2-4商品属性图
图2-5 小票属性图
图2-6 连锁超市属性图
图2-7供货商属性图
2.3总体E-R图解释说明
(1)实体
员工:表示连锁超市中的工作人员,具有属性员工编号、姓名、性别、年龄和职位。
会员:表示在连锁超市中购买商品的人员,具有属性会员编号、会员名字、性别、电话号码和积分。
商品:表示连锁超市中售卖的商品,具有属性商品编号、商品名称和单价。
小票:表示会员在连锁超市中购买商品的订单,具有属性小票编号。
连锁超市:表示一个连锁超市,具有属性超市编号、超市名称、超市地址和店长。
供货商:表示供应商品的厂家,具有属性供货商编号、供货商名称、电话号码和地址。
(2)关系
采购:表示员工和商品之间的关系,一个员工可以采购多种商品,一种商品也可以被多个员工采购,采购时有采购日期和采购数量。
雇佣:表示连锁超市和员工之间的关系,一个连锁超市可以雇佣多个员工,一个员工只能被一个连锁超市雇佣,雇佣时有雇佣日期。
销售:表示连锁超市和商品之间的关系,一个连锁超市可以销售多种商品,一种商品也可以被多个连锁超市销售,销售时有销售日期和库存量。
购买:表示商品和会员之间的关系,一个会员可以购买多种商品,一种商品也可以被多个会员购买,购买时有购买数量和购买日期。
供货:表示供货商和商品之间的关系,一个供货商可以供供货多种商品,一种商品也可以被多个供货商供货,供货时有供货数量和供货日期。
打印:表示会员和小票之间的关系,一个会员可以打印多张小票,一张小票只能被一个会员打印打,印时有打印日期。
三、逻辑结构设计
3.1关系模型
(1) 员工(员工编号,姓名,性别,年龄,职位,超市编号,雇佣日期)
主码:员工编号 外码:超市编号
(2) 商品(商品编号,商品名称,单价)
主码:商品编号 外码:无
(3) 会员(会员编号,会员名字,性别,电话号码,积分)
主码:会员编号 外码:无
(4) 小票(小票编号,会员编号,打印日期)
主码:小票编号 外码:会员编号
(5) 购买(商品编号,会员编号,购买数量,购买日期)
主码:(商品编号,会员编号) 外码:商品编号,会员编号
(6) 供货商(供货商编号,供货商名称,地址,电话号码)
主码:供货商编号 外码:无
(7) 采购(商品编号,员工编号,采购数量,采购日期)
主码:(商品编号,员工编号) 外码:商品编号,员工编号
(8) 连锁超市(超市编号,超市地址,超市名称,店长)
主码:超市编号 外码:无
(9) 销售:(超市编号,商品编号,库存量,销售日期)
主码:(超市编号、商品编号) 外码:超市编号,商品编号
(10)供货:(供货商编号,商品编号,供货数量,供货日期)
主码:(供货商编号,商品编号) 外码: 供货商编号,商品编号
3.2关系模式的优化
(1)对以上所有实体的函数依赖列举如下:
员工编号 → 姓名,性别,年龄,职位,雇佣日期
商品编号 → 商品名称,单价
会员编号 → 会员名字,性别,电话号码,积分
小票编号 → 打印日期
供货商编号 → 供货商名称,供货商地址,电话号码
超市编号 → 超市地址、超市名称,店
(商品编号,会员编号) → 购买数量,购买日期
(商品编号,员工编号) → 采购数量,采购日期
(超市编号,商品编号) → 库存量,销售日期
(供货商编号,商品编号) → 供货数量,供货日期
(2) 以上关系模式既没有非主属性对码的部分函数依赖也没有非主属性对码的传递函数依赖,所以均达到3NF.
四、物理结构设计
4.1创建数据库
数据库名为supermarket,数据库文件名及位置C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\supermarket。
4.2数据库表设计
(1)员工表的创建,如表4-1
表4-1 员工表
名称 | 类型 | 长度 | 约束 |
员工编号 | varchar | 10 | 主键,非空 |
姓名 | varchar | 20 | 缺省为空 |
年龄 | int | 10 | 缺省为空 |
职位 | varchar | 20 | 缺省为空 |
性别 | varchar | 2 | 缺省为空 |
超市编号 | varchar | 10 | 外键 |
雇佣日期 | varchar | 20 | 缺省为空 |
(2)会员表的创建,如表4-2
表4-2 会员表
名称 | 类型 | 长度 | 约束 |
会员编号 | varchar | 10 | 主键,非空 |
会员名字 | varchar | 20 | 缺省为空 |
性别 | varchar | 2 | 缺省为空 |
电话号码 | int | 20 | 缺省为空 |
积分 | int | 10 | 缺省为0 |
(3)商品表的创建,如表4-3
表4-3 商品表
名称 | 类型 | 长度 | 约束 |
商品编号 | varchar | 10 | 主键,非空 |
商品名称 | varchar | 20 | 缺省为空 |
单价 | int | 10 | 缺省为空 |
(4)小票表的创建,如表4-4
表4-4 小票表
名称 | 类型 | 长度 | 约束 |
小票编号 | varchar | 10 | 主键,非空 |
会员编号 | varchar | 20 | 外键 |
打印日期 | varchar | 10 | 缺省为空 |
(5)购买表的创建,如表4-5
表4-5 购买表
名称 | 类型 | 长度 | 约束 | |
商品编号 | varchar | 10 | 主键 非空 | 外键 |
会员编号 | varchar | 10 | 外键 | |
购买日期 | varchar | 20 | 缺省为空 | |
购买数量 | int | 20 | 缺省为空 |
(6)供货商表的创建,如表4-6
表4-6 供货商表
名称 | 类型 | 长度 | 约束 |
供货商编号 | varchar | 10 | 主键 |
供货商名称 | varchar | 20 | 缺省为空 |
地址 | varchar | 20 | 缺省为空 |
电话号码 | int | 20 | 缺省为空 |
(7)采购表的创建,如表4-7
表4-7 采购表
名称 | 类型 | 长度 | 约束 | |
商品编号 | varchar | 10 | 主键 非空 | 外键 |
员工编号 | varchar | 10 | 外键 | |
采购日期 | varchar | 20 | 缺省为空 | |
采购数量 | int | 20 | 缺省为空 |
(8)连锁超市表的创建,如表4-8
表4-8 连锁超市表
名称 | 类型 | 长度 | 约束 |
超市编号 | varchar | 10 | 主键 |
超市名称 | varchar | 20 | 缺省为空 |
超市地址 | varchar | 20 | 缺省为空 |
店长 | varchar | 20 | 缺省为空 |
(9)销售表的创建,如表4-9
表4-9 销售表
名称 | 类型 | 长度 | 约束 | |
商品编号 | varchar | 10 | 主键 非空 | 外键 |
超市编号 | varchar | 10 | 外键 | |
销售日期 | varchar | 20 | 缺省为空 | |
销售数量 | int | 20 | 缺省为空 |
(10)供货表的创建,如表4-10
表4-10 供货表
名称 | 类型 | 长度 | 约束 | |
商品编号 | varchar | 10 | 主键 非空 | 外键 |
供货商编号 | varchar | 10 | 外键 | |
供货日期 | varchar | 20 | 缺省为空 | |
供货数量 | int | 20 | 缺省为空 |
4.3索引的设计
在商品表中建立一个关于商品编号的索引,在员工表中建立一个关于员工编号的索引,在会员表中建立一个关于会员编号的索引,在供货商表中建立一个关于供货商编号的索引,在连锁超市表中建立一个关于超市编号的索引。
五、数据库建立实施
5.1数据库表的实施
(1)连锁超市表的实施:
create table 连锁超市
( cSno varchar(10) primary key,
cName varchar(20),
cAddress varchar(20),
cManger varchar(20)
)
(2)员工表的实施:
create table 员工
( ySno varchar(10) primary key,
yName varchar(20),
yAge int,
yPost varchar(20),
ySex char(2),
cSno varchar(10) not null foreign key references 连锁超市(cSno),
yDate varchar(20)
)
(3)会员表的实施:
create table 会员
( hSno varchar(10) primary key,
hName varchar(20),
hSex varchar(2),
hNum int, hCard int
)
(4)供货商表的实施:
create table 供货商
( gSno varchar(10) primary key,
gName varchar(20),
gAddress varchar(20),
gNum int,
)
(5)商品表的实施:
create table 商品
( sSno varchar(10) primary key,
sName varchar(20),
sPrice int
)
(6)小票表的实施:
create table 小票
( xSno varchar(10) primary key,
xDate varchar(20),
hSno varchar(10) not null foreign key references 会员(hSno)
)
(7)采购表的实施:
create table 采购
( sSno varchar(10) not null foreign key references 商品(sSno),
ySno varchar(10) not null foreign key references 员工(ySno),
varchar(20),
cNum int
primary key(sSno,ySno))
(8)销售表的实施:
create table 销售
( sSno varchar(10) not null foreign key references 商品(sSno),
cSno varchar(10) not null foreign key references 连锁超市(cSno),
sDate varchar(20),
sNum int
primary key(sSno,cSno)
)
(9)购买表的实施:
create table 购买
( sSno varchar(10) not null foreign key references 商品(sSno),
hSno varchar(10) not null foreign key references 会员(hSno),
gDate varchar(20), gNum int
primary key(sSno,hSno)
)
(10)供货表的实施:
create table 供货
( sSno varchar(10) not null foreign key references 商品(sSno),
gSno varchar(10) not null foreign key references 供货商(gSno),
gDate varchar(20),
gNum int
primary key(sSno,gSno)
)
5.2索引的实施
(1)商品编号索引的实施:
create index sni on 商品(sSno,sName)
(2)员工编号索引的实施:
create index sni on 员工(ySno,yName)
(3)会员编号索引的实施:
create index sni on 会员(hSno,hName)
(4)供货商编号索引的实施:
create index sni on 供货商(gSno,gName)
(5)超市编号索引的实施:
create index sni on 连锁超市(cSno,cName)
5.3视图的实施
(1)小票信息查询:
create view 小票信息(小票编号,会员编号,小票日期,商品编号,商品名称,购买数量,购买日期)
as
select xSno,小票.hSno,xDate,商品.sSno,sName,gNum,gDate
from 小票,购买,商品
where (小票.hSno=购买.hSno) and (购买.sSno=商品.sSno)
(2)采购单查询:
create view 采购单(员工编号,员工姓名,商品编号,商品名称,采购数量,购日期)
as
select 员工.ySno,yName,商品.sSno,sName,cNum,cDate
from 员工,商品,采购
where (员工.ySno=采购.ySno) and (采购.sSno=商品.sSno)
(3)供货单查询:
create view 供货单(供货商编号,供货商名称,商品编号,商品名称,供货数量,供货日期)
as
select 供货商.gSno,gName,商品.sSno,sName,供货.gNum,gDate
from 供货商,商品,供货
where (供货商.gSno=供货.gSno) and (供货.sSno=商品.sSno)
(4)销售单查询:
create view 销售单(超市编号,超市名称,商品编号,商品名称,销售数量,销售日期)
as
select 连锁超市.cSno,cName,商品.sSno,sName,sNum,sDate
from 连锁超市,商品,销售
where (连锁超市.cSno=销售.cSno) and (销售.sSno=商品.sSno)
5.4数据录入
(1)商品数据录入,如表5-1
表5-1 商品数据表
sSno | sName | sPrice |
001 | 娃哈哈 | 3 |
0010 | 芬达 | 2 |
002 | 农夫山泉 | 2 |
003 | 可乐 | 3 |
004 | 雪碧 | 3 |
005 | 面包 | 1 |
006 | 泡面 | 5 |
007 | 绿茶 | 3 |
008 | 辣条 |
|
(2)连锁超市数据录入,如表5-2
表5-2 连锁超市数据表
cSno | cName | cAddress | cManger |
01 | 大张超市总店 | 涧西区 | 朱星宇 |
02 | 大张洛龙分店 | 洛龙区 | 狄小龙 |
03 | 大张老城分店 | 老城区 | 苏连印 |
04 | 家辉超市 | 洛龙区 | 李毅 |
05 | 快乐超市 | 涧西区 | 赵书豪 |
06 | 生鲜超市 | 老城区 | 马登鑫 |
07 | 佳佳乐超市 | 涧西区 | 张佳佳 |
08 | 万象超市 | 伊滨区 | 王博 |
09 | 瑞华超市 | 洛龙区 | 赵俊 |
(3)供货商数据录入,如表5-3
表5-3 供货商数据表
gSno | gName | gNum | gAddress |
1 | 好运来批发 | 167167 | 涧西区 |
10 | 小小批发 | 317801 | 涧西区 |
2 | 大张批发 | 168168 | 洛龙区 |
3 | 朱朱批发 | 110110 | 伊滨区 |
4 | 龙龙批发 | 120130 | 洛龙区 |
5 | 狄狄批发 | 321321 | 涧西区 |
6 | 佳乐批发 | 234213 | 老城区 |
7 | 舒浩批发 | 234412 | 涧西区 |
8 | 星宇批发 | 332541 | 洛龙区 |
(4)员工数据录入,如表5-4
表5-4 员工数据表
ySno | yName | yAge | yPost | ySex | cSno | yDate |
1001 | 狄小龙 | 20 | 店长 | 男 | 02 | 2023-05 |
1002 | 朱星宇 | 21 | 店长 | 男 | 01 | 2024-05 |
1003 | 李毅 | 32 | 经理 | 男 | 02 | 2020-01 |
1004 | 刘金龙 | 26 | 员工 | 男 | 03 | 2021-04 |
1008 | 张弛 | 25 | 经理 | 女 | 04 | 2018-03 |
1011 | 陈子昂 | 34 | 员工 | 男 | 08 | 2019-02 |
1023 | 苏连印 | 28 | 店长 | 男 | 03 | 2018-01 |
1024 | 章子怡 | 23 | 经理 | 女 | 05 | 2019-09 |
1025 | 田文静 | 25 | 员工 | 女 | 09 | 2018-1 |
(5)会员数据录入,如表5-5
表5-5 会员数据表
hSno | hName | hSex | hNum | hCard |
2001 | 杨成毅 | 男 | 444562 | 100 |
2002 | 程诗涵 | 女 | 323131 | 50 |
2004 | 田馨蕊 | 女 | 324244 | 80 |
2005 | 陈怡丹 | 男 | 264765 | 0 |
2006 | 丁桂含 | 男 | 443523 | 200 |
2007 | 云翳 | 女 | 344541 | 20 |
2008 | 罗级 | 男 | 434547 | 10 |
2009 | 杨子荣 | 男 | 975634 | 100 |
2010 | 周思雨 | 女 | 366588 | 0 |
(6)小票数据录入,如表5-6
表5-6 小票数据表
xSno | hSno | xDate |
900101 | 2002 | 2024-04 |
900102 | 2001 | 2024-04 |
900105 | 2002 | 2024-05 |
900106 | 2002 | 2024-05 |
900107 | 2002 | 2024-05 |
900120 | 2004 | 2024-01 |
900121 | 2004 | 2024-01 |
900122 | 2004 | 2024-01 |
900133 | 2005 | 2024--01 |
(7)采购数据录入,如表5-7
表5-7 采购数据表
sSno | ySno | cNum | cDate |
001 | 1004 | 50 | 2024-06 |
001 | 1011 | 100 | 2024-05 |
0010 | 1025 | 100 | 2024-06 |
002 | 1004 | 100 | 2024-06 |
003 | 1004 | 200 | 2024-06 |
004 | 1004 | 50 | 2024-06 |
005 | 1004 | 100 | 2024-06 |
006 | 1011 | 50 | 2024-05 |
007 | 1011 | 150 | 2024-05 |
(8)销售数据录入,如表5-8
表5-8 销售数据表
sSno | cSno | sNum | sDate |
001 | 01 | 100 | 2024-04 |
001 | 02 | 150 | 2024-05 |
002 | 01 | 200 | 2024-04 |
002 | 02 | 100 | 2024-05 |
003 | 01 | 150 | 2024-04 |
003 | 02 | 100 | 2024-05 |
004 | 01 | 200 | 2024-04 |
005 | 01 | 200 | 2024-04 |
(9)购买数据录入,如表5-9
表5-9 购买数据表
sSno | hSno | gNum | gDate |
001 | 2001 | 1 | 2024-04 |
001 | 2004 | 2 | 2024-05 |
001 | 2011 | 2 | 2024-02 |
002 | 2004 | 1 | 2024-05 |
003 | 2001 | 2 | 2024-04 |
003 | 2005 | 1 | 2024-05 |
003 | 2011 | 1 | 2024-02 |
008 | 2005 | 1 | 2024-05 |
009 | 2001 | 1 | 2024-04 |
(10)供货数据录入,如表5-10
表5-10 供货数据表
sSno | gSno | gNum | gDate |
001 | 1 | 100 | 2024-04 |
001 | 3 | 200 | 2024-05 |
001 | 3 | 100 | 2024-04 |
002 | 2 | 200 | 2024-04 |
003 | 2 | 100 | 2024-04 |
003 | 4 | 200 | 2024-04 |
004 | 2 | 100 | 2024-04 |
004 | 3 | 150 | 2024-05 |
006 | 2 | 150 | 2024-04 |
5.5存储过程设计
创建一个名称为InsertRecord的存储过程,该存储过程的功能是向销售表
中插入一条新纪录,新纪录的值有参数提供,如图5-1和5-2所示:
create procedure InsertRecord
( @sSno varchar(20),
@cSno varchar(20),
@sNum int,
@sDate varchar(20)
)
as
insert into 销售 values(@sSno,@cSno,@sNum,@sDate)
调用过程:
exec InsertRecord
@sSno='001', @cSno='05',@sNum='100',@sDate='2024-04'
5.6触发器设计
创建一个名称为inset_供应的触发器,该触发器的功能是能够保证在供应
表中添加新的纪录时,新记录的供应商编号必须以及存在于供应商表中,
如图5-3、和5-4所示
create trigger insert_供货 on 供货
after insert
as
if exists (select * from inserted
where gSno in (select gSno from 供货商))
print '添加成功!'
else
begin
print '供应商表中没有该供应商信息。拒绝插入!'
rollback transaction
end
激活触发器
insert into 供货(sSno,gSno,gNum,gDate)
values ('001','5','100','2024-04')
六、应用程序设计
6.1查询员工表
public class Main {
public static void main(String[] args) {
String url = "jdbc:sqlserver://127.0.0.1:1433;
databaseName=supermarket;
integratedSecurity=false;encrypt=true;
trustServerCertificate=true;";
Connection conn;
try {
conn = DriverManager.getConnection(url, "sa", "123456");
System.out.println("数据库连接成功");
Statement stat = conn.createStatement();
ResultSet rs1 = stat.executeQuery("select * from 员工");
while (rs1.next()) {
String ySno = rs1.getString("ySno");
String yName = rs1.getString("yName");
int yAge = rs1.getInt("yAge");
String yPost = rs1.getString("yPost");
String ySex = rs1.getString("ySex");
String cSno = rs1.getString("cSno");
String yDate = rs1.getString("yDate");
System.out.println("员工编号=" + ySno + ",员工姓名=" +yName + ",年龄=" + yAge + ",职位=" + yPost + ",性别=" + ySex + ",超市编号=" + cSno + ",雇佣日期=" + yDate);
}
} catch (SQLException e) {
e.printStackTrace()
}
}
}
6.2更新小票表
public class Main {
public static void main(String[] args) {
String url = "jdbc:sqlserver://127.0.0.1:1433;
databaseName=supermarket;
integratedSecurity=false;
encrypt=true;trustServerCertificate=true;";
Connection conn;
try {
conn=DriverManager.getConnection(url,"sa", "123456");
System.out.println("数据库连接成功");
Statement stat = conn.createStatement();
int num=0;
String sql="UPDATE 小票 SET hSno='2002' where xSno='900101'";
num = stat.executeUpdate(sql);
if(num>0){
System.out.println("更新成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
总结
在这次课程设计中,我设计的是一个连锁超市信息管理系统,通过这个系统,可以更加方便地实现信息的查询、删除、修改等功能,从开始的功能需求和数据需求分析,然后根据功能和数据需求来设计整个数据库,最后编写代码进行运行和调试。在需求分析时,我通过上网查资料,依据生活经验和用户的需要,剖析现有状况及问题得到功能和数据需求结果。在设计整个数据库时,我设计了小票信息、采购单、供货单和销售单四个视图、五个索引来方便信息的查询以及一个存储过程和触发器方便操作。
该连锁超市信息管理系统还有很多不完善的地方,例如对存储过程、触发器理解不够深刻,设计的存储过程和触发器功能比较简单,后续可以设计功能比较复杂的触发器和存储过程;系统的功能较少,界面不够美化,后续可以增加一些实用的功能,美化界面,以满足超市管理更多的需求。
在这数据库课设中,我学到了很多,从选题到设计,从设计到运行,从运行到提交,使我对数据库的构成,运行更加清晰,对所学的理论知识也是一个很好的复习和精进,在课设之前,我对很多知识的理解不是很深,例如关系模式的优化中第三范式和函数依赖,存储过程和触发器的基本知识掌握的也不够熟练,课设中需要用到的理论知识的量非常大,为了能够成功做好,我仔细的翻阅了教材,并上网查了一些资料,这无疑使我的理论知识加深了不少。在前半部分的设计中相对计较顺利,没有出现什么问题,但在Java中调用数据库时出现了问题,经过查资料询问同学找到了错误原因,由于粗心少些了一条语句,在经过修改后,数据库的设计才基本完善成型,这使我认识到了考虑事情必须要彻底,要全面,做事情也要认真,不能草率。
标签:20,10,varchar,课设,数据库,超市,2024,编号,信息管理系统 From: https://blog.csdn.net/2401_87160780/article/details/144592698