【Mysql】——进销存系统,创建各张表、索引、视图

💻博主现有专栏:

                C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,设计模式、Python机器学习等
🥏主页链接:

                Y小夜-优快云博客

目录

🎯实现功能

🎯概念设计

🎯逻辑结构设计

💻顾客user(顾客id,姓名、性别、会员卡号、手机号、卡内余额、可用积分、上次消费时间)

💻货品名称表goods(货品id,货品名称,计量单位,货品条码,零售价,促销价,名称缩写(由触发器自行维护),货品状态)

💻供应商信息表supplier(供应商id,供应商名称,联系人,联系电话,供应商状态)

💻收银员(收银员id、收银员姓名、收银员手机号)

💻收银记录表cashaccount(收银id,收银员id,顾客id,扎帐id,收银时间,支付方式,应收金额,实收金额,优惠金额,销售状态(正常 ,已退货))

💻收银明细表cashaccount_detil(收货明细id,收银id,货物id,销售数量,零售价、促销价)

💻货品库存表stock(库存id,货品id,(当前)库存数量,昨日库存(用于日清),月初库存(用于月结))

💻扎帐记录表Settle_accounts(扎帐id,收银员id,扎帐时间,应收金额(由系统计算),实收金额(由收银员输入),差错原因)

🎯插入记录

🎯思考

🎯建立视图


🎯实现功能

超市购物业务处理:选取货品、收银台结账(收银员扫码,系统计算金额,顾客支付)

🎯概念设计

  • 分析上述业务中出现了哪些对象?
  1. 顾客
  2. 货品
  3. 收银(结账)(哪个收银员、在什么时间、收了哪个顾客,多少钱)?(卖给了这个顾客哪些货品)(要账实相符)
  4. 库存
  • 分析每个对象有哪些特征?
  1. 顾客(姓名、性别、手机号、会员卡号、卡内余额、可用积分、上次消费时间)
  2. 货品(名称、规格、条码、计量单位、名称缩写(由触发器自行维护)、零售价、促销价)
  3. 收银(收银员,顾客,收银时间,应收金额、实收金额、支付方式)
  4. 收银明细(货物,销售数量,零售价、促销价)
  5. 库存(名称、库存数量、昨日库存、月初库存)
  6. 供应商(供应商名称、联系电话、联系人、供应商状态)
  • 根据表述绘制系统ER图

  • 利用ER图转换为关系模型的规则,设计关系模式

将实体型、实体的属性和实体型之间的联系转化为关系模式

转换为则:

一个实体型转换为一个关系模式

一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并(加入对应关系的码和联系本身的属性)

一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并(合并后关系的属性:在n端关系中加入1端关系的码和联系本身的属性)

一个m:n联系转换为一个关系模式(关系的属性:与该联系相连的各实体的码以及联系本身的属性,各实体码的组合)

注意:数据库中要求每个表都要有一个标识列(整型,自增),作为主码,表中的外码是为了表达实体之间的联系。

顾客(顾客id,姓名、性别、手机号、会员卡号、卡内余额、可用积分、上次消费时间)

货品(货品id,名称、规格、条码、计量单位、零售价、促销价)

供应商表(供应商id,供应商名称,联系人,联系电话,供应商状态)

收银员(收银员id、收银员姓名、收银员手机号)

收银(收银id收银员id顾客id,收银时间,应收金额、实收金额、支付方式,销售状态)

收银明细(收货明细id收银id货物id,销售数量,零售价、促销价)

库存(库存id货品id,库存数量、昨日库存、月初库存)

扎帐(扎帐id,收银员id,收银id扎帐时间,应收金额,实收金额,差错原因)

后面根据也可以加入支付方式表、销售状态、供应商状态表等。

🎯逻辑结构设计

💻顾客user(顾客id,姓名、性别、会员卡号、手机号、卡内余额、可用积分、上次消费时间)

Field

Type

Comment

uid

int

顾客id,从10000开始

uname

varchar(20)

姓名

sex

varchar(20)

性别

card_number

varchar(20)

会员卡号

phone

varchar(20)

手机号

card_balance

decimal(10, 2)

卡内余额

  points

int

积分

last_purchase_date

date

上次消费时间

自增从10000开始,为什么?如何设置

1.有些情况下,要求ID看起来不要太小,让用户感觉平台已经运营一段时间,给用户一种信任感。

2.避免通过ID暴露信息,比如新平台用户很容易就知道自己是第几个注册用户,这在一定程度上可能暴露平台的新旧或用户量大小。

3.某些ID段可能预留给特定类型的用户或其他用途(比如内部测试账户大客户、会员等),普通用户的ID从更高的值开始。

Sql命令:

CREATE TABLE USER(

uid INT PRIMARY KEY AUTO_INCREMENT NOT NULL COMMENT '顾客id',

uname VARCHAR(20) NOT NULL COMMENT '姓名',

sex VARCHAR(20) COMMENT '性别',

card_number VARCHAR(20) COMMENT '会员卡号',

phone VARCHAR(20) COMMENT '手机号',

card_balance DECIMAL(10, 2) COMMENT '卡内余额',

points INT COMMENT '积分',

last_purchase_date DATE COMMENT'上次消费时间'

)AUTO_INCREMENT=10000;

💻货品名称表goods(货品id,货品名称,计量单位,货品条码,零售价,促销价,名称缩写(由触发器自行维护),货品状态)

Field

Type

Comment

gid

int

货品id

gname

varchar(20)

货品名称

unit

varchar(20)

计量单位

barcode

varchar(20)

货品条码

retail_Price

decimal(10, 2)

零售价

promotional_Price

decimal(10, 2)

促销价

abbreviations

varchar(20)

名称缩写(由触发器自行维护)

Status

tinyint

货品状态

(0正常,1暂停进货(不能购进,但可以销售),2不再进货(不能购进,也不能销售))

Sql命令代码:

CREATE TABLE goods(

gid INT PRIMARY KEY NOT NULL COMMENT'货品id',

gname VARCHAR(20) COMMENT'货品名称' NOT NULL,

unit VARCHAR(20) COMMENT'计量单位' NOT NULL,

barcode VARCHAR(20) COMMENT'货品条码' NOT NULL,

retail_Price DECIMAL(10, 2) COMMENT'零售价',

promotional_Price DECIMAL(10, 2) COMMENT'促销价' ,

abbreviations INT COMMENT'名称缩写' NOT NULL,

`Status`  TINYINT COMMENT'货品状态(0正常,1暂停进货(不能购进,但可以销售),2不再进货(不能购进,也不能销售))'

);

💻供应商信息表supplier(供应商id,供应商名称,联系人,联系电话,供应商状态)

Field

Type

Comment

supplierID

int

供应商id

supplier_Name

varchar(50)

供应商名称

contact_Person

varchar(20)

联系人

contact_Number

varchar(20)

联系电话

supplier_Status

tinyint

供应商状态

(0正常往来,1暂停来往,2,不再来往)

Sql命令:

CREATE TABLE supplier(

supplierID INT PRIMARY KEY NOT NULL COMMENT '供应商id',

supplier_Name VARCHAR(50) NOT NULL COMMENT '供应商名称',

contact_Person VARCHAR(20) NOT NULL COMMENT '联系人',

contact_Number VARCHAR(20) NOT NULL COMMENT '联系电话',

supplier_Status TINYINT COMMENT '供应商状态(0正常往来,1暂停来往,2,不再来往)'

);

💻收银员(收银员id、收银员姓名、收银员手机号)

Field

Type

Comment

cashierid

int

收银员id

cashier_Name

varchar(20)

收银员姓名

phone

varchar(20)

收银员手机号

Sql命令:

CREATE TABLE cashier(

cashierid INT PRIMARY KEY NOT NULL COMMENT'收银员id',

cashier_Name VARCHAR(20) NOT NULL COMMENT'收银员姓名',

phone VARCHAR(20) NOT NULL COMMENT'收银员手机号'

);

💻收银记录表cashaccount(收银id,收银员id,顾客id,扎帐id,收银时间,支付方式,应收金额,实收金额,优惠金额,销售状态(正常 ,已退货))

Field

Type

Comment

cashaccountid

int

收银id

cashierid

Int

收银员id,外键

uid

int

顾客id(0 普通顾客,1-9999大客户,>=10000会员 外键

settle_accountstid

Int

扎帐id 外键

cashier_time

datetime

收银时间,默认为当前时间

payment

tinyint

支付方式 0现金,1储值卡,2支付宝,3微信支付

amount_money

decimal(18,3)

应收金额

actual_money

decimal(18,3)

实收金额

discount _money

decimal(18,3)

优惠金额

sales_status

tinyint

销售状态(0正常 ,1已退货)

注意:CURRENT_TIMESTAMP的含义?

答:当前时间的时间戳

Sql命令:

CREATE TABLE cashaccount(

cashaccountid INT PRIMARY KEY NOT NULL AUTO_INCREMENT COMMENT '收银id',

cashierid INT COMMENT '收银员id',

uid INT COMMENT '顾客id(0 普通顾客,1-9999大客户,>=10000会员',

settle_accountstid INT COMMENT '扎帐id',

cashier_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '收银时间',

payment TINYINT COMMENT '支付方式 0现金,1储值卡,2支付宝,3微信支付',

amount_money DECIMAL(18,3) COMMENT '应收金额',

actual_money DECIMAL(18,3) COMMENT '实收金额',

discount_money DECIMAL(18,3) COMMENT '优惠金额',

sales_status TINYINT COMMENT '销售状态(0正常 ,1已退货)',

FOREIGN KEY (cashierid)REFERENCES cashier(cashierid),

FOREIGN KEY (uid)REFERENCES USER(uid),

FOREIGN KEY (settle_accountstid)REFERENCES Settle_accounts(settle_accountsid)

);

💻收银明细表cashaccount_detil(收货明细id收银id货物id,销售数量,零售价、促销价)

Field

Type

Comment

cashaccountdetailid

int

收货明细id

cashaccountid

Int

收银id,外键

gid

int

货物id,外键

salesquantity

DECIMAL(18,3)

销售数量

retailprice

DECIMAL(18,3)

零售价

promotionalprice

DECIMAL(18,3)

促销价

Sql命令:

CREATE TABLE cashaccount_detil(

cashaccountdetailid INT PRIMARY KEY NOT NULL COMMENT '收货明细id',

cashaccountid INT COMMENT '收银id',

gid INT COMMENT '货物id',

salesquantity DECIMAL(18,3) COMMENT '销售数量',

retailprice DECIMAL(18,3) COMMENT '零售价',

promotionalprice DECIMAL(18,3) COMMENT '促销价',

FOREIGN KEY (cashaccountid)REFERENCES cashaccount(cashaccountid),

FOREIGN KEY (gid)REFERENCES goods(gid)

);

💻货品库存表stock(库存id,货品id,(当前)库存数量,昨日库存(用于日清),月初库存(用于月结))

Field

Type

Comment

stockid

int

库存id

gid

Int

货品id,外键

quantity

decimal(18, 3)

(当前)库存数量

yesterday_quantity

decimal(18, 3)

昨日库存(用于日清),系统自动维护

month_quantity

decimal(18, 3)

昨日库存(用于日清),系统自动维护

Sql命令:

CREATE TABLE stock(

stockid INT PRIMARY KEY NOT NULL COMMENT '库存id',

gid INT COMMENT '货品id',

quantity DECIMAL(18, 3) COMMENT '(当前)库存数量',

yesterday_quantity DECIMAL(18, 3) COMMENT '昨日库存(用于日清),系统自动维护',

month_quantity DECIMAL(18, 3) COMMENT '昨日库存(用于日清),系统自动维护',

FOREIGN KEY (gid)REFERENCES goods(gid)

);

💻扎帐记录表Settle_accounts(扎帐id,收银员id,扎帐时间,应收金额(由系统计算),实收金额(由收银员输入),差错原因)

Field

Type

Comment

settle_accountsid

int

扎帐id

cashierid

Int

收银员id

settle_accounts_time

decimal(18, 3)

扎帐时间,默认值为系统当前时间

amount_money

decimal(18, 3)

应收金额(由系统计算)

actual_money

decimal(18, 3)

实收金额(由收银员输入)

errorReason

varchar(100)

差错原因

Sql命令:

CREATE TABLE Settle_accounts(

settle_accountsid INT PRIMARY KEY NOT NULL COMMENT '扎帐id',

cashierid INT COMMENT '收银员id',

settle_accounts_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '扎帐时间,默认值为系统当前时间',

amount_money DECIMAL(18, 3) COMMENT '应收金额(由系统计算)',

actual_money DECIMAL(18, 3) COMMENT '实收金额(由收银员输入)',

errorReason VARCHAR(100) COMMENT '差错原因'

);

🎯插入记录

  1. 货品名称表goods

Sql命令:

INSERT INTO goods (gid, gname, unit, barcode, retail_Price, promotional_Price, abbreviations, `Status`)

VALUES

(1, '可口可乐', '瓶', '101', 3.00, 2.50, 'kkkl', 0),

(2, '百事可乐', '瓶', '102', 3.00, 2.50, 'bskl', 0),

(3, '伊利牛奶', '盒', '103', 5.00, 4.50, 'ylnn', 0),

(4, '农夫山泉', '瓶', '105', 2.00, 1.50, 'nfsq', 0),

(5, '涪陵榨菜', '袋', '106', 1.00, 0.80, 'flzc', 0),

(6, '青岛啤酒', '听', '107', 5.0, 4, 'qdpj', 0);

  1. 收银员表cashier

Sql命令:

INSERT INTO cashier(cashierid,cashier_Name,phone) VALUES(1,'王小小','13683868928');

  1. 收银记录表cashaccount
Sql命令:

INSERT

INTO cashaccount(cashaccountid,cashierid,uid ,settle_accountstid,cashier_time,payment,amount_money,actual_money,discount_money,sales_status)

values

(1,1,0,1,'2024-03-01',0,6.000,5.000,1.000,0),

(2,1,0,1,'2024-03-11',0,12.000,10.600,1.400,0);

3、收银明细表symxb

Sql命令:

INSERT

INTO cashaccount_detil(`cashaccountid`,`gid`,`salesquantity`,`retailprice`,`promotionalprice`)

VALUES(1,1,1.000,3.000,2.500),

(1,2,1.000,3.000,2.500),

(2,5,2.000,1.000,0.800),

(2,3,2.000,5.000,4.500);

4、扎帐记录表zzjlb

Sql命令:

INSERT

INTO `settle_accounts`(settle_accountsid,`cashierid`,`settle_accounts_time`,`amount_money`,`actual_money`,`errorReason`)

VALUES(1,1,'2024-03-11',15.600,15.600,'无差错');

5.汉字拼音表Hzpyb

根据发的脚本文件导入数据

其他表数据自行插入。

🎯思考

        以上几个表中的数据是人工输入的测试数据,他们之间有什么关系,我们应该如何操作才能保证他们之间的关系是正确的。需要用到哪些数据库技术。

答:

货品名称表 和 收银明细表 之间有关系,因为收银明细需要引用具体的货品。

收银员表 和 收银记录表 之间有关系,收银记录需要标明是哪位收银员完成的交易。

收银记录表 和 扎帐记录表 之间有关系,每一次的收银记录可能需要对应到特定的扎帐记录上。

收银记录表 和 收银明细表 之间有关系,每一条收银记录可能包含多个收银明细。

汉字拼音表 用于货品名称表abbreviation列的辅助修正。

需要用到的数据库技术:

外键约束触发器事务控制约束数据验证索引等。

🎯建立视图

  • 货品库存数量v_goods_stock

   包括货品id,货品名称、计量单位、库存数量

CREATE VIEW v_goods_stock AS

SELECT

    g.gid AS '货品ID',

    g.gname AS '货品名称',

    g.unit AS '计量单位',

    s.quantity AS '库存数量'

FROM

    goods g,stock s

where

    g.gid = s.gid;

收银明细视图

包括:明细id,收银id,货品名称、计量单位、销售数量、单价、零售价等

CREATE VIEW v_cashier_details AS

SELECT

    cd.cashaccountdetailid AS '明细ID',

    cd.cashaccountid AS '收银ID',

    g.gname AS '货品名称',

    g.unit AS '计量单位',

    cd.salesquantity AS '销售数量',

    cd.promotionalprice AS '单价',

    g.retail_Price AS '零售价'

FROM

    cashaccount_detil cd, goods g

where

    cd.gid = g.gid;

还需要建立那些视图?

1.顾客消费视图v_customer_purchases

CREATE VIEW v_customer_purchases AS

SELECT

    u.uid AS '顾客ID',

    u.uname AS '姓名',

    ca.cashaccountid AS '收银ID',

    ca.cashier_time AS '购买日期',

    SUM(cd.salesquantity * cd.promotionalprice) AS '总金额'

FROM

    user u

JOIN

    cashaccount ca ON u.uid = ca.uid

JOIN

    cashaccount_detil cd ON ca.cashaccountid = cd.cashaccountid

GROUP BY

    ca.cashaccountid;

日销售汇总视图v_daily_sales_summary

CREATE VIEW v_daily_sales_summary AS

SELECT

    DATE(ca.cashier_time) AS '销售日期',

    COUNT(DISTINCT ca.cashaccountid) AS '交易次数',

    SUM(cd.salesquantity) AS '销售总量',

    SUM(cd.salesquantity * cd.promotionalprice) AS '销售总额'

FROM

    cashaccount ca

JOIN

    cashaccount_detil cd ON ca.cashaccountid = cd.cashaccountid

GROUP BY

    DATE(ca.cashier_time);

库存紧缺视图v_stock_short

CREATE VIEW v_stock_short AS

SELECT

    g.gid AS '货品ID',

    g.gname AS '货品名称',

    s.quantity AS '当前库存'

FROM

    stock s, goods g

WHERE

   s.gid = g.gid and s.quantity < 100;

商品进、销、存系 统 背景说明 待开发的软件系统的名称:商品进、销、存管理系统 软件项目的用途:用于数据库课程设计及商业用途 软件项目的范围:系统涉及企业的库存,销售与进货提供了管理 功能,为库存,销售,进货等管理数据提供了分析功能 开发小组:我们小组 小组成员: 组长:曾 炫 组员:冶福磊 陈 光 钟浩杰 李钦铭 指导老师:姚全珠 在信息技术的催化之下,世界经济的变革已经进入了加速状态。世界经济一体化,企 业经营全球化,以及高度竞争造成的高度个性化与迅速改变的客户需求,令企业与顾客 、企业与供方的关系变得更加密切和复杂。强化管理,规范业务流程,提高透明度,加 快商品资金周转,以及为流通领域信息管理全面网络化打下基础,是商品销售公司乃至 众多商业企业梦寐以求的愿望。 随着技术发展,电脑操作及管理日趋简化,电脑知识日趋普及,同时市场经济快速多 变,竞争激烈,因此企业采用电脑管理进货、库存、销售等诸多环节也已成为趋势及必 然。 系统规划 1.1 可行性分析 经济上可行性分析 现在,计算机的价格已经十分低廉,性能却有了长足的进步。而本系统的开发,为企 业的工作效率带来了一个质的飞跃,为此主要现有以下几个方面: 第一,本系统的运行可以代替人工进行许多繁杂的劳动; 第二,本系统的运行可以节省许多资源; 第三,本系统的运行可以大大的提高企业的工作效率; 第四,本系统可以使敏感文档更加安全,等等。 本产品的开发所需的设备在现有条件下,只需要少量的投入资金就可以实现。因此在 经济上是可行的。 技术上可行性分析 a. 软件可行性 C#具有丰富的数据库功能,可以直接建立和编辑数据库,使用结构化查询语言直 接访问SQL Sever上的数据库,并提供简单的面向对象的库操作命令、多用户数据库的加锁机制 和网络数据库的编程技术。 SQL Sever2000是由微软公司推出的,能提供超大型系统所需的数据库服务,并对数据库 提供全面的保护,具有防止问题发生的安全措施,他是一个采用SQL语言的关系型数 据库管理系统。作为客户机/服务器的后端数据库,他是所有数据的汇总和管理中心 。 b. 硬件可行性 CPU:奔腾三代以上。 OS(操作系统):Windows2000/windows98以上。 内存:64MB以上。 硬盘:30G以上。 本系统的开发利用Microsoft SQL Server2000作为本系统的数据库,它是一个支持多用户的新型数据库,适用于大中 规模的数据量需求。 使用C#作为系统开发的开发环境,此开发工具开发数据库管理系统,采用面向 对象的方式,方便、简捷、功能强大。 管理上可行性分析 课设指导老师给与了精心的讲解和大力的支持。 综上所述,系统在技术上、经济上、管理上都是可行的。 1.2 划分子系统 各个模块的划分 1.3 制定信息系统开发方案及日程安排 1.3.1 任务分配 陈 光:商品入库(输入) 李钦铭:信息查询(查询) 冶福磊:信息修改(修改) 钟浩杰:信息统计(统计) 曾 炫:商品销售(输出) 1.3.2 计划 需求分析阶段:用时一天。需求分析,业务逻辑,模块化分,详细分工 编码阶段:用时两天。根据需求分析进行编码 整合:待续 系统分析 2.1系统流程图 业务流程图 2.2 数据字典 重要数据及其简要描述如下所示: 1) 数据元素: 3.1 商品编号 3.2 员工编号 3.3 销售编号 3.4 库存盘点票号 2) 数据结构: 3.6 商品卡片 3) 数据流: 3.7 操作信息 3.9 管理信息 4) 数据存储: 3.10 进货一览 3.11 销售一览 3.12 库存一览 5) 处理过程: 3.12 销售信息单 3.13 进货信息单 .3.14 库存信息单 系统设计 3.1 代码设计 编码设计使数据库系统开发的前提条件,使系统不可缺少的重要内容。编码是指与原 来名称对应的符号和记号。它是进行信息交换、处理、传输和实现信息共享的关键。本 系统内部信息编码采用顺序码和区间码混合使用: 顺序码是用一串连续的数字来代系统中的客观实体或实体属性。其优点是简单,容 易处理,但是不能反映编码对象的特征。所以用区间码来弥补这个缺点。区间码是按编 码的特点把代码分为若干个区段,每一个区段示编码对象的一个类别。 合理的编码结构是信息处理系统是否具有生命力的一个重要因素,在本系统的代码设 计时,遵循以下几个原则: a. 惟一性。每个代码只能惟一地代系统中的 一个实体或实体属性。 b. 标准性。代码设计时采用国际或国家的标准代码。 c. 合理性。代码设计应该与编码对象的分类体系相适应,使代码对编码对象的分类有 标识作用。 d. 可扩充性。编码时留有足够的备用代码。 e. 简单性。方便输入,提高处理效率。 f. 适用性。便于识
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y小夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值