一、系统简介
1.1设计背景
受到科学技术的推动,全球计算机的软硬件技术迅速发展,以计算机为基础支撑的信息化如今已成为现代企业的一个重要标志与衡量企业综合实力的重要标准,并且正在悄无声息的影响与改变着国内外广泛的中小型企业的运营模式。针对于居民日常生活无法离开的超市,卖家市场蓬勃快速发展且竞争激烈,各个商家不断推陈出新各种活动,力求争取更多的忠实用户,而会员管理系统正是商家留得客户的首选,并且正在被越来越多的企业应用于消费管理领域。随着众多企业管理者对管理信息系统的重视程度的提高,超市会员管理系统的管理功能也在不断的增强,发挥着越来越重要的作用,从简单的数据浏览、添加、修改到超大数量的数据存储、数据的精确计算、积分换礼、报表的自动化生成、人性化的友好界面操作,大大提高了企业员工的工作效率以及规范企业的多层次全方位管理,帮助拓宽企业与外界之间的交流范围,缩短交流的时间,丰富交流方式,并且协助维护企业与社会之间的良好关系。
1.2开发意义
随着我国经济的高速发展,人民生活水平的不断提高,线上与线下购物已经成为居民生活中不可或缺的一部分。超市会员管理系统的诞生,使管理员可以借助网络管理轻松实现信息资源的集中统一处理与有效资源共享用以提高管理水平与经济效益。通过此项目的研究与实践,超市会员可以在网络上查询自己实时的会员积分与商家发布更新的各类积分有礼兑换活动,使网络管理为会员提供了一个方便快捷的自我管理环境。而商家可以利用系统对会员信息进行更有效,更规范的管理,例如对会员信息的添加、修改。超市会员管理系统的使用商家不受时间与地理位置的限制,一方面管理上更加规范,而且很大程度上提高了超市会员管理的效率,不再像过去的手工操作浪费时间、人力以及物力,另一方面增强了居民的购物意愿,提高了消费内需,促进了经济的持续稳定发展,实现了经济效益与社会服务的共同发展。
1.3系统开发及运行环境
系统开发平台:Microsoft Visual Studio 2008
系统开发语言:SQL语言
数据库与管理系统软件:SQL Server 2008 R2
运行平台:Windows 8及以上
二、需求分析
2.1超市会员管理系统需求分析
超市会员管理系统的开发主要目的是为了方便管理员对顾客消费的所有信息的管理,同时可以提供给顾客更多的优惠信息,提高顾客的购物热情,因此我们的超市会员管理系统主要实现以下四个功能:会员基本信息的查询功能、会员基本信息的管理功能、会员消费信息的管理功能、超市货物库存的统计功能。
(1)会员基本信息的查询功能:主要包括为管理员对会员各类信息的查询以及会员本身对会员信息的查询,管理员与顾客都可以通过线上网络的不同界面查询会员的相关信息,用以了解会员的等级、消费情况与优惠力度等;
(2)会员基本信息的管理功能:主要包括为管理员对会员各类信息的管理,详细包括会员的编号、姓名、性别、联系方式、会员等级等,可以做到对会员信息进行修改、删除、更新、添加等操作;
(3) 会员消费信息的管理功能:主要包括为超市会员在超市中的消费记录,详细包括会员购买的商品及其相关信息,购买时间、商品编号、购买数量、商品单价、商品金额等等,管理员可以对会员消费信息进行添加、更新、删除等操作;
(4)超市商品库存的统计功能:主要包括为超市商品的库存的基本信息,详细包括商品的商品编号、商品名称、库存量、商品价格等信息,同时管理员可根据市场情况随时调整我们的商品价格。
2.2超市会员管理系统可行性分析
受基本条件与系统面向群体所限制,学生无法获得非常深入的需求信息,也缺少直截了当的与客户沟通交流的机会,因此本人在已知需求的基础上,结合周边调研访问结果进行适当的推理延伸。针对本超市会员管理系统,从技术可行性来看,本系统对硬件、软件的性能要求、环境条件以及技术人员的水平都在目前平均水平可以接受的范围之内;从经济可行性来看,本系统数据库的设计无需消耗大量资源且无需昂贵的软硬件设施,并且市场前景良好,具有可预见的经济价值;从社会可行性来看,本系统数据库无冲突社会道德以及国家法律等问题,且符合人民日益增长的美好需要的要求,对于提高消费内需,促进经济的持续稳定发展发挥着明显的正向作用。综上,该数据库系统项目在各个方面均满足可行性条件。
2.3用例图
管理员用例图:
会员用例图:
2.4系统功能结构图
三、概念结构设计
3.1 E-R图
3.2 数据字典
1)数据项
数据项名称 | 数据类型 | 数据长度 | 取值范围 | 取值含义 |
NUMBER | CHAR | 10 | 会员编号 | |
NAME | CHAR | 10 | 姓名 | |
SEX | NCHAR | 10 | 男/女,默认值为男 | 性别 |
TEL | CHAR | 10 | 电话号码 | |
GRADE | CHAR | 10 | 会员等级 | |
GNUM | CHAR | 10 | 商品编号 | |
GNAME | CHAR | 10 | 商品名称 | |
UP | FLOAT | UP>=0 | 商品单价 | |
GS | CHAR | 10 | 商品库存 | |
ONUM | CHAR | 10 | 购物单编号 | |
DATE | DATE | 消费日期 | ||
QTY | INT | 数量 | ||
UNDIS | FLOAT | 10 | UNDIS>=0 | 折扣前金额 |
DIS | FLOAT | 10 | DIS>=0 | 折扣后金额 |
DISCOUNT | CHAR | 10 | 会员折扣 |
2)数据结构
数据结构名 | 组成 | 说明 |
会员表 | NUMBER,NAME,SEX,TEL,GRADE | 会员基本信息 |
商品表 | GNUM,GNAME,UP,GS | 商品基本信息 |
购物单表 | ONUM,GNUM,DATE,QTY,UP, UNDIS | 超市购物单信息 |
会员购物表 | NUMERB,ONUM,GNUM,DIS | 会员消费信息 |
会员优惠表 | GRADE,DISCOUNT | 会员优惠信息 |
四、逻辑结构设计
会员(会员编号,姓名,性别,电话号码,会员等级)
商品(商品编号,商品名称,商品单价,商品库存)
购物单(购物单编号,商品编号,消费日期,数量,商品单价,折扣前金额)
会员购物(会员编号,购物单编号,商品编号,折扣后金额)
会员优惠(会员等级,会员折扣)
!注:下划线的为主键
五、物理设计
5.1基本表
1)会员表【MEMBER】:NUMBER(会员编号),NAME(姓名),SEX(性别),
TEL(电话号码),GRADE(会员等级)
2)商品表【GOODS】: GNUM(商品编号),GNAME(商品名称),UP(商品单价),
GS(商品库存)
3)购物单表【LIST】 :ONUM(购物单编号),GNUM(商品编号),
DATE(消费日期),QTY(数量),UP(商品单价),
UNDIS(折扣前金额)
4)会员购物表【MLIST】: NUMERB(会员编号),ONUM(购物单编号),
GNUM(商品编号),DIS(折扣后金额)
5)会员优惠表【DISCOUNT】:GRADE(会员等级),DISCOUNT(会员折扣)
5.2完整性约束
5.2.1实体完整性约束
1)将MEMBER表的NUMBER设置为主键:
ALTER TABLE MEMBER
ADD CONSTRAINT PK_M PRIMARY KEY(NUMBER)
GO
2)将GOODS表的GNUM设置为主键:
ALTER TABLE GOODS
ADD CONSTRAINT PK_G PRIMARY KEY(GNUM)
GO
3)将LIST表的ONUM与GNUM设置为主键:
ALTER TABLE LIST
ADD CONSTRAINT PK_L PRIMARY KEY(ONUM,GNUM)
GO
4)将MLIST表的NUMERB、ONUM与GNUM设置为主键:
ALTER TABLE MLIST
ADD CONSTRAINT PK_ML PRIMARY KEY(ONUM,GNUM,NUMBER)
GO
5)将DISCOUNT表中的GRADE设置为主键:
ALTER TABLE DISCOUNT
ADD CONSTRAINT PK_D PRIMARY KEY(GRADE)
GO
5.2.2参照完整性
1)创建表MEMBER和表MLIST之间的参照关系
AlTER TABLE MLIST WITH NOCHECK
ADD CONSTRAINT FK_M_ML FOREIGN KEY(NUMBER)REFERENCES MEMBER(NUMBER)
ON UPDATE CASCADE
GO
2)创建表GOODS和表MLIST之间的参照关系
AlTER TABLE MLIST WITH NOCHECK
ADD CONSTRAINT FK_G_ML FOREIGN KEY(GNUM)REFERENCES GOODS(GNUM)
ON UPDATE CASCADE
GO
3)创建表GOODS和表LIST之间的参照关系
AlTER TABLE LIST WITH NOCHECK
ADD CONSTRAINT FK_G_L FOREIGN KEY(GNUM)REFERENCES GOODS(GNUM)
ON UPDATE CASCADE
GO
4)创建表LIST和表MLIST之间的参照关系
AlTER TABLE MLIST WITH NOCHECK
ADD CONSTRAINT FK_L_ML FOREIGN KEY(ONUM) REFERENCES LIST(ONUM)
ON UPDATE CASCADE
GO
5.2.3用户自定义完整性
1)为表MEMBER中的SEX设置DEFAULT约束,并利用CHECK约束将SEX限定取值:
ALTER TABLE MEMBER
ADD CONSTRAINT DEFAULT_SEX DEFAULT '男' FOR SEX
GO
ALTER TABLE MEMBER
ADD CONSTRAINT CHECK_SEX CHECK(SEX='男' OR SEX='女')
GO
2)检查商品表GOODS,商品单价是否符合要求:
ALTER TABLE GOODS WITH CHECK
ADD CONSTRAINT CHECK_UP CHECK(UP>=0)
GO
3)检查购物单表LIST,商品单价是否符合要求:
ALTER TABLE LIST WITH CHECK
ADD CONSTRAINT CHECK_LIST CHECK(UP>=0)
GO
4)检查购物单表LIST,折扣前金额是否符合要求:
ALTER TABLE LIST WITH CHECK
ADD CONSTRAINT CHECK_LIST2 CHECK(UNDIS>=0)
GO
5)检查购物单表MLIST,折扣后金额是否符合要求:
ALTER TABLE MLIST WITH CHECK
ADD CONSTRAINT CHECK_MLIST CHECK(DIS>=0)
GO
5.3数据库视图
六、功能实现
6.1 系统的主要查询功能
1)查询系统中姓名为“赵钱”的会员的基本信息:
USE MARKET
GO
SELECT * FROM MEMBER WHERE NAME='赵钱'
GO
2)查询系统中会员等级为VIP2的折扣信息:
USE MARKET
GO
SELECT * FROM DISCOUNT WHERE GRADE='VIP2'
GO
3)查询系统中商品编号为003的商品的单价:
USE MARKET
GO
SELECT UP FROM GOODS WHERE GNUM='003'
GO
4)查询系统中会员编号为M4的会员的购买记录:
USE MARKET
GO
SELECT * FROM MLIST WHERE NUMBER='M4'
GO
5)查询系统中购物单号为V4购买的商品信息:
USE MARKET
GO
SELECT * FROM GOODS WHERE GNUM IN
(SELECT GNUM FROM LIST WHERE ONUM='V4')
GO
6)查询系统中会员编号为M3的详细购物信息:
USE MARKET
GO
SELECT * FROM LIST WHERE ONUM IN
(SELECT ONUM FROM MLIST WHERE NUMBER='M3')
GO
6.2 系统的主要插入、更新、删除功能
1)在表MEMBER中增加一条会员记录(会员编号:M5;姓名:付琪;性别:女;电话:137;会员等级:VIP5)
USE MARKET
GO
INSERT INTO MEMBER(NUMBER,NAME,SEX,TEL,GRADE)
VALUES('M5','付琪', '女','137','VIP5')
2)在表MEMBER中更新会员编号,表MLIST与中的会员编号也会级联更新,将会员编号为M1的会员编号改为M6:
USE MARKET
UPDATE MEMBER
SET NUMBER='M6' WHERE NUMBER='M1'
GO
6.3 创建触发器、存储过程
1)创建触发器:当会员编号被删除时,该会员的消费记录与消费明细也会级联删除:
CREATE TRIGGER TRIGGER_NUMBER
ON MEMBER FOR DELETE
AS
DECLARE @NUM_DEL CHAR(10)
SELECT @NUM_DEL=NUMBER FROM DELETED
DELETE FROM MLIST WHERE NUMBER=@NUM_DEL
DELETE FROM LIST
WHERE ONUM IN (SELECT ONUM FROM MLIST WHERE NUMBER=@NUM_DEL)
GO
2)创建触发器:当商品编号被删除时,该商品的相关消费记录也会级联删除:
CREATE TRIGGER TRIGGER_GNUM
ON GOODS FOR DELETE
AS
DECLARE @GNUM_DEL CHAR(10)
SELECT @GUNM_DEL=GNUM FROM DELETED
DELETE FROM MLIST WHERE GNUM=@GNUM_DEL
DELETE FROM LIST
WHERE GNUM IN (SELECT GNUM FROM MLIST WHERE GNUM=@GNUM_DEL)
GO
3)创建触发器:当修改GOODS表的商品编号时,要检查GOODS表中是否存在与该编号相同的记录,若存在则不允许修改,若不存在则可修改:
CREATE TRIGGER TRIGGER_GOODS
ON GOODS FOR UPDATE AS IF UPDATE(GNUM)
BEGIN
DECLARE @GNUM_NEW CHAR(10),@GNUM_OLD CHAR(10),@GNUM_CNT INT
SELECT @GNUM_OLD=GNUM FROM DELETED
SELECT @GNUM_CNT=COUNT(*) FROM GOODS WHERE GNUM=@GNUM_OLD
IF @GNUM_CNT<>0
ROLLBACK TRANSACTION
END
4)创建存储过程:根据会员姓名查询会员编号:
CREATE PROCEDURE Pro_MEM
@NAME_IN CHAR(10),
@NUM_OUT CHAR(10) OUTPUT
AS SELECT @NUM_OUT=NUMBER FROM MEMBER
WHERE @NAME_IN=NAME
GO
DECLARE @NAME_IN CHAR(10),
@NUM_OUT CHAR(10)
SELECT @NAME_IN='孙李'
EXEC Pro_MEM @NAME_IN,@NUM_OUT OUTPUT
PRINT '会员编号为:'+CONVERT(VARCHAR,@NUM_OUT)
执行结果:M2
5)创建存储过程:根据购物单编号与商品编号查询消费日期:
CREATE PROCEDURE Pro_D
@DATE_OUT DATE OUTPUT,
@ONUM_IN CHAR(10),
@GNUM_IN CHAR(10)
AS SELECT @DATE_OUT=DATE FROM LIST
WHERE @ONUM_IN=ONUM AND @GNUM_IN=GNUM
GO
DECLARE @DATE_OUT DATE ,
@ONUM_IN CHAR(10),
@GNUM_IN CHAR(10)
SELECT @ONUM_IN='V5'
SELECT @GNUM_IN='005'
EXEC Pro_D @DATE_OUT OUTPUT,@ONUM_IN,@GNUM_IN
PRINT '消费日期为:'+CONVERT(VARCHAR,@DATE_OUT)
执行结果:2023-07-07
6)创建存储过程:根据商品名称统计商品售出数量:
CREATE PROCEDURE Pro_GOODS
@GNAME_IN CHAR(10),
@QTY_OUT INT OUTPUT
AS SELECT @QTY_OUT=SUM(QTY) FROM LIST
WHERE GNUM IN (SELECT GNUM FROM GOODS WHERE @GNAME_IN=GNAME)
GO
DECLARE
@GNAME_IN CHAR(10),
@QTY_OUT INT
SELECT @GNAME_IN='卷纸'
EXEC Pro_GOODS @GNAME_IN,@QTY_OUT OUTPUT
PRINT '售出数量为:'+CONVERT(VARCHAR,@QTY_OUT)
执行结果:1
7)创建存储过程:计算某一会员至今所有购物的优惠金额,根据该存储过程的结果,超市管理员可对比商品成本与利润相应调整会员优惠折扣力度:
CREATE PROCEDURE Pro_DIS
@NUM_IN CHAR(10),
@UNDIS_OUT FLOAT OUTPUT,
@DIS_OUT FLOAT OUTPUT
AS
SELECT @UNDIS_OUT=SUM(UNDIS) FROM LIST
WHERE ONUM IN(SELECT ONUM FROM MLIST WHERE @NUM_IN=NUMBER)
SELECT @DIS_OUT=SUM(DIS) FROM MLIST
WHERE @NUM_IN=NUMBER
GO
DECLARE @NUM_IN CHAR(10),
@UNDIS_OUT FLOAT,
@DIS_OUT FLOAT
SELECT @NUM_IN='M1'
EXEC Pro_DIS @NUM_IN,@UNDIS_OUT OUTPUT,@DIS_OUT OUTPUT
PRINT '至今已优惠金额为:'+CONVERT(VARCHAR,@UNDIS_OUT-@DIS_OUT)
执行结果:12.06
七、第七次实验课心得
最后一次实验课的课程中,根据老师要求需要我们重点区分两类空间数据,即SQL SERVER 2008新增的两类空间数据类型:大地向量空间类型(geography)和几何平面向量空间类型(geometry),根据官方定义:geography数据类型为空间数据提供了一个由经度和纬度联合定义的存储结构;geometry数据类型为空间数据提供了一个存储结构,它是由任意平面上的坐标定义的。
因此,由上述定义我们就可以轻松判断出,我们应该根据我们特定的需要来选择使用相应的空间数据类型,例如存储经纬度坐标数据,我们就应该使用geography,而如果是存储任意平面上定义的坐标数据,我们就应该使用geometry。
除此之外,geography作为一个我们未来专业或许需要经常使用但如今我们又相对较为陌生的数据类型来说,拥有更多需要我们注意与了解的特点,通过课堂学习、实际操作与网络搜索可以得到:geography分为Point、LineString与Polygon三种类型的实例,不同的实例的建立具有他们不同的类型、用法与前提条件;空间引用标识符(SRID)同样是geography中非常重要的一个概念,我们可以简单将每个数据的SRID理解为它们特殊的单位,只有拥有相同单位的数据,我们才可以进行代数或其它的操作;最后,是数据类型的方向问题,这也是我们在课堂上重点强调的一个方面,对于geometry数据来说,我们无需考虑某一实例的方向,但对于geography数据,我们不仅要指定环实例的顺逆时针方向,而且必须明确指出其它实例相对于环的具体位置。
以上都是我们在具体使用SQL SERVER 2008新增的两类空间数据类型时需要特别注意的几个方面,我深知自身如今的学习深度与学习时间还远远无法达到完全熟练掌握这两类数据类型,但希望能为今后的学习打下一定的基础并在未来继续更深入的探索。