💻博主现有专栏:

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

                Y小夜-CSDN博客

目录

🎯实现功能

🎯概念设计

🎯逻辑结构设计

💻顾客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;

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐