超市进销存之openGauss数据库的应用与实践
目錄
一、背景
二、目的
三、什么是“進銷存”,什么是超市進銷存管理系統?
四、什么是openGauss數據庫?
五、應用與實踐(模擬超市進銷存系統)
1、超市進銷存數據庫表設計
2、創建數據庫表
3、手工插入數據
4、添加約束
5、創建視圖
6、創建存儲過程
7、新建用戶并授權訪問
六、總結
一、背景
數字經濟時代,數據處理需求大規模增長,數據庫在充分挖掘數據資產價值、賦能產業數字化轉型、推進數字經濟生態建設過程中發揮著重大作用。經營管理一家超市,無論是商品的管理、商品采購的管理還是商品銷售的管理,如果單純依靠純人工管理,不僅工作量巨大,且容還容易出錯,造成不可預估的損失等。基于此,數據庫的選擇與設計就尤為重要。
?
二、目的
本文以零售行業為場景,設計數據庫模型,并使用openGauss數據庫構建零售業務場景下的超市進銷存數據庫。通過對數據庫中對象(表、數據類型、視圖、約束、存儲過程、用戶等)的創建,掌握openGauss數據庫基礎SQL語法,并通過對表中數據的增刪改查,模擬零售行業下的業務實現。
三、什么是“進銷存”,什么是超市進銷存管理系統?
進銷存軟件概念起源于上世紀80年代,由于電算化的普及,計算機管理的廣泛推廣,不少企業對于倉庫貨品的進貨,存貨,出貨管理,有了強烈的訴求,基于此,進銷存軟件的發展從此便開始了。
進入90年代以后,隨著進銷存軟件的應用面越來越廣,出現了許多從功能上,從用途上,更為全面的進銷存系統,從單純的貨品數量管理,擴展為貨品的流程管理,進銷存軟件對每一批貨品的來源、存放、去向,都作了詳細的記錄,隨后即延伸為財務進銷存一體化的管理模式。
進銷存是指企業管理過程中采購(進)——入庫(存)——銷售(銷)的動態管理過程。主要可以分為如下兩條線:
四、什么是openGauss數據庫?
openGauss是一個數據庫管理系統。數據庫是結構化的數據集合。它可以是任何數據,購物清單、圖片庫或公司網絡中的大量信息。數據庫管理系統可以對數據庫進行統一的管理和控制,以保證數據庫的安全性和完整性。由于計算機非常擅長處理大量數據,因此數據庫管理系統可以作為獨立程序使用,也可以作為其他應用程序的一部分在計算中發揮著核心作用。??
openGauss數據庫是關系型的。關系型數據庫是指采用了關系模型來組織數據的數據庫,其以行和列的形式存儲數據。行和列被稱為表,一組表組成了數據庫。關系模型可以簡單理解為二維表格模型,而一個關系型數據庫就是由二維表及其之間的關系組成的一個數據組織。???
openGauss的SQL部分代表 “結構化查詢語言”。SQL是最常用的用于訪問和處理數據庫的標準計算機語言。根據系統的編程環境,用戶可以直接輸入SQL、將SQL語句嵌入到以另一種語言編寫的代碼中,或者使用包含SQL語法的特定語言 API。openGauss支持標準的SQL92/SQL99/SQL2003/SQL2011規范
五、應用與實踐(模擬超市進銷存系統)
說明:以庫表涉及到的字段類型、sql語句等均是基于openGauss數據庫進行的。
1、超市進銷存數據庫表設計
本次設計僅從最基本的核心表設計出發,完成最基本的進銷存管理任務,具體涉及如下幾張核心表,如遇臨時表或者視圖或者存儲過程,則均以SQL的形式實現:
用戶管理表(User_info)
?
供應商信息表(supplier_info)
?
訂貨單信息表(order_info)
?
進貨信息表(Purchase_goods_info)
?
倉庫信息表(warehouse_info)
?
商品信息表(goods_info)
?
出庫信息表(Outwarehouse_info)
銷售清單信息表(sell_list_info)
?
銷售信息表(sell_info)
?
客戶管理表(customer_info)
2、創建數據庫表
前置條件:已成功安裝openGauss數據庫。
2.1、創建超市(零售行業)數據庫(retail_db)。
1.切換到omm用戶,以操作系統用戶omm登錄數據庫主節點。
2.啟動數據庫。
3.使用gsql工具登陸數據庫。
su - ommgs_om -t startgsql -d postgres -p ?26000 -r4.創建數據庫retail_db。
CREATE DATABASE retail_db ENCODING 'UTF8' template = template0;5.連接retail_db數據庫。
\connect retail_db6.創建名為retail_db的schema,并設置retail_db為當前的schema。
CREATE SCHEMA retail_db;7.將默認搜索路徑設為retail_db。
SET search_path TO retail_db;2.2、創建用戶管理表(User_info)
在SQL編輯框中輸入如下語句,創建用戶管理表user_info。
刪除表 user_infoDROP TABLE IF EXISTS user_info;創建表 user_infoCREATE TABLE user_info(u_id int PRIMARY KEY,u_name char(20) not null,u_mail char(20) unique not null,u_id_card char(20) not null,u_phone char(20) not null,u_password char(20) not null,u_role int not null);2.3、創建供應商信息表(supplier_info)
在SQL編輯框中輸入如下語句,創建表supplier_info
刪除表 supplier_infoDROP TABLE IF EXISTS supplier_info;創建表 supplier_infoCREATE TABLE supplier_info(supplier_id int PRIMARY KEY,supplier_name char(20) not null,supplier_address varchar(100) not null,supplier_phone char(20) not null,supplier_type int not null,remark varchar(100));2.4、創建訂貨單信息表(order_info)
在SQL編輯框中輸入如下語句,創建表order_info
刪除表 order_infoDROP TABLE IF EXISTS order_info;創建表 order_infoCREATE TABLE order_info(order_id int PRIMARY KEY,order_date date not null,supplier_id int not null,goods_id char(20) not null,goods_name char(20) not null,goods_home varchar(100) not null,goods_number int not null,goods_amount int not null,goods_sum_amount int not null,remark varchar(100));2.5、創建進貨信息表(Purchase_goods_info)
在SQL編輯框中輸入如下語句,創建表purchase_goods_info
刪除表 Purchase_goods_infoDROP TABLE IF EXISTS Purchase_goods_info;創建表 Purchase_goods_infoCREATE TABLE Purchase_goods_info(Purchase_goods_id int PRIMARY KEY,goods_id char(30) not null,Purchase_goods_number int not null,Purchase_goods_amount int not null,Purchase_goods_date date not null,supplier_id int not null,operator int not null,remark varchar(100));2.6、創建倉庫信息表(warehouse_info)
在SQL編輯框中輸入如下語句,創建表warehouse_info
刪除表 warehouse_infoDROP TABLE IF EXISTS warehouse_info;創建表 warehouse_infoCREATE TABLE warehouse_info(warehouse_id int PRIMARY KEY,warehouse_address varchar(100) not null,warehouse_name varchar(100) not null,warehouse_operator int not null,remark varchar(100));2.7、創建商品信息表(goods_info)
在SQL編輯框中輸入如下語句,創建表goods_info
刪除表 goods_infoDROP TABLE IF EXISTS goods_info;創建表 goods_infoCREATE TABLE goods_info(goods_id char(20) PRIMARY KEY,goods_code varchar(50) not null,goods_name char(20) not null,goods_home varchar(100) not null,goods_number int not null,Purchase_goods_amount int not null,sell_goods_amount int not null,goods_type char(20) not null,supplier_id int not null,warehouse_id int not null,remark varchar(100));2.8、創建出庫信息表(Outwarehouse_info)
在SQL編輯框中輸入如下語句,創建表outwarehouse_info
刪除表 outwarehouse_infoDROP TABLE IF EXISTS outwarehouse_info;創建表 outwarehouse_infoCREATE TABLE outwarehouse_info(outwarehouse_id int PRIMARY KEY,goods_id char(20) not null,Outwarehouse_number int not null,Outwarehouse_date date not null,operator int not null,remark varchar(100));2.9、創建銷售清單信息表(sell_list_info)
在SQL編輯框中輸入如下語句,創建表sell_list_info
刪除表 sell_list_infoDROP TABLE IF EXISTS sell_list_info;創建表 sell_list_infoCREATE TABLE sell_list_info(sell_id int PRIMARY KEY,sell_date date not null,goods_id char(20) not null,goods_name char(20) not null,goods_number int not null,goods_measurement_unit char(10) not null,sell_goods_amount int not null,remark varchar(100));v2.10、創建銷售信息表(sell_info)
在SQL編輯框中輸入如下語句,創建表sell_info
刪除表 sell_infoDROP TABLE IF EXISTS sell_info;創建表 sell_infoCREATE TABLE sell_info(sell_id int PRIMARY KEY,sell_goods_sum_amount int not null,customer_phone char(20) not null,remark varchar(100));2.11、創建客戶管理表(customer_info)
在SQL編輯框中輸入如下語句,創建表customer_info
刪除表 customer_infoDROP TABLE IF EXISTS customer_info;創建表 customer_infoCREATE TABLE customer_info(customer_id int PRIMARY KEY,customer_name char(20) not null,customer_phone char(20) not null,customer_point int not null,remark varchar(100));v3、手工插入數據
示例(模擬初始化部分表):
3.1對user_info表進行插入數據操作,在SQL編輯框中輸入如下語句:
INSERT INTO user_info (u_id,u_name,u_mail,u_id_card,u_phone,u_password,u_role)VALUES (001,'張一','zhangyi@openGauss.com','2023001','12345678901','openGauss_001',1);INSERT INTO user_info (u_id,u_name,u_mail,u_id_card,u_phone,u_password,u_role)VALUES (002,'張二','zhanger@openGauss.com','2023002','12345678902','openGauss_002',2);INSERT INTO user_info (u_id,u_name,u_mail,u_id_card,u_phone,u_password,u_role)VALUES (003,'張三','zhangsan@openGauss.com','2023003','12345678903','openGauss_003',3);INSERT INTO user_info (u_id,u_name,u_mail,u_id_card,u_phone,u_password,u_role)VALUES (004,'張四','zhangsi@openGauss.com','2023004','12345678904','openGauss_004',4);INSERT INTO user_info (u_id,u_name,u_mail,u_id_card,u_phone,u_password,u_role)VALUES (005,'張五','zhangwu@openGauss.com','2023005','12345678905','openGauss_005',5);3.2對supplier_info表進行插入數據操作,在SQL編輯框中輸入如下語句:
INSERT INTO supplier_info(supplier_id,supplier_name,supplier_address,supplier_phone,supplier_type,remark)VALUES(001,'xxx水果批發商','西安市高陵區xxx','12345678901',1,'');INSERT INTO supplier_info(supplier_id,supplier_name,supplier_address,supplier_phone,supplier_type,remark)VALUES(002,'xxx日用百貨批發商','西安市雁塔區xxx','12345678902',2,'');INSERT INTO supplier_info(supplier_id,supplier_name,supplier_address,supplier_phone,supplier_type,remark)VALUES(003,'xxx煙酒飲料批發商','西安市未央區xxx','12345678903',3,'');INSERT INTO supplier_info(supplier_id,supplier_name,supplier_address,supplier_phone,supplier_type,remark)VALUES(004,'xxx零食批發商','西安市碑林區xxx','12345678904',4,'');INSERT INTO supplier_info(supplier_id,supplier_name,supplier_address,supplier_phone,supplier_type,remark)VALUES(005,'xxx柴米油鹽醬醋批發商','西安市新城區xxx','12345678905',5,'');v3.3
對warehouse _info表進行插入數據操作,在SQL編輯框中輸入如下語句:
INSERT INTO ?warehouse_info (warehouse_id,warehouse_address,warehouse_name,warehouse_operator,remark)VALUES(001,'園區100-1','1號倉庫',4,'');INSERT INTO ?warehouse_info (warehouse_id,warehouse_address,warehouse_name,warehouse_operator,remark)VALUES(002,'園區100-2','2號倉庫',4,'');INSERT INTO ?warehouse_info (warehouse_id,warehouse_address,warehouse_name,warehouse_operator,remark)VALUES(003,'園區100-3','3號倉庫',4,'');3.4對sell_list_info表進行插入數據操作,在SQL編輯框中輸入如下語句:
INSERT INTO sell_list_info(sell_id,sell_date,goods_id,goods_name,goods_number, goods_measurement_unit,sell_goods_amount,remark)VALUES(2023001,'2023-01-16 10:01:00','CS001','食用油',1,'桶',98,'');INSERT INTO sell_list_info(sell_id,sell_date,goods_id,goods_name,goods_number, goods_measurement_unit,sell_goods_amount,remark)VALUES(2023001,'2023-01-16 10:01:00','CS002','豬肉',10,'斤',160,'');INSERT INTO sell_list_info(sell_id,sell_date,goods_id,goods_name,goods_number, goods_measurement_unit,sell_goods_amount,remark)VALUES(2023002,'2023-01-16 11:01:00','CS001','食用油',1,'桶',98,'');INSERT INTO sell_list_info(sell_id,sell_date,goods_id,goods_name,goods_number, goods_measurement_unit,sell_goods_amount,remark)VALUES(2023002,'2023-01-16 11:01:00','CS002','豬肉',10,'斤',160,'');INSERT INTO sell_list_info(sell_id,sell_date,goods_id,goods_name,goods_number, goods_measurement_unit,sell_goods_amount,remark)VALUES(2023003,'2023-01-16 12:01:00','CS001','食用油',1,'桶',98,'');INSERT INTO sell_list_info(sell_id,sell_date,goods_id,goods_name,goods_number, goods_measurement_unit,sell_goods_amount,remark)VALUES(2023003,'2023-01-16 12:01:00','CS002','豬肉',10,'斤',160,'');……
4、添加約束
現實場景中,銷售清單信息表(sell_list_info)中的商品售價不可能為負數,因此針對表中金額的屬性,增加大于0的約束條件。
為銷售清單信息表(sell_list_info)的 sell_goods_amount字段增加大于0的約束條件:
ALTER table sell_list_info ADD CONSTRAINT c_sell_goods_amount CHECK (sell_goods_amount >=0);嘗試手工插入一條金額小于0的記錄:
INSERT INTO sell_list_info(sell_id,sell_date,goods_id,goods_name,goods_number,measurement_unit,sell_goods_amount,remark)
VALUE(2023003,'2023-01-16 12:01:00','CS002','豬肉',10,'斤',-160,'');
執行失敗,失敗原因:new row for relation " sell_list_info" violates check constraint "c_sell_goods_amount "。
5、創建視圖
視圖是一個虛擬表,是sql的查詢結果,其內容由查詢定義。對于來自多張關聯表的復雜查詢,就不得不使用十分復雜的SQL語句進行查詢,造成極差的體驗感。使用視圖之后,可以極大的簡化操作,使用視圖不需要關心相應表的結構、關聯條件等。
場景:創建一視圖,統計2023-01-16這一天所有銷售商品的銷售總數量和總銷售額,以及其對應的倉庫編號和供應商編號(倉庫和供應商可進一步關聯),并按銷售總數量降序排列。
create view v_goods_sell_sum asselect t1.goods_id,t1.goods_name,t1.sum_num,t1.sum_amount,t2.supplier_id,t2.warehouse_idfrom(SELECT goods_id,goods_name,sum(goods_number) as sum_num,sum(sell_goods_amount) as sum_amountfrom sell_list_infowhere SUBSTR(sell_date,1,10) ='2023-01-16'group by goods_id ,goods_name)t1left join goods_info t2on t1.goods_id =t2.goods_idorder by sum_num desc使用視圖進行查詢
select * from v_goods_sell_sum;6、創建存儲過程
存儲過程是能夠完成特定功能的SQL語句集。用戶可以進行反復調用,從而減少SQL語句的重復編寫數量,提高工作效率。
場景:定義一個定時任務,將每天各個收銀臺生成的銷售數據定時同步到生產表。假定超市有5個收銀臺, 對應5個結構完全相同的基礎表和一個生產表(這樣設計的目的之一是防止瓶頸或鎖表),然后在每天銷售工作結束后,啟動定時任務。
基礎表結構(1-5):
CREATE TABLE sell_list_info_tmp1(sell_id int PRIMARY KEY,sell_date date not null,goods_id char(20) not null,goods_name char(20) not null,goods_number int not null,goods_ measurement_unit char(10) not null,sell_goods_amount int not null);……
生產表結構(實際場景可設計成分區表,按天存儲)
CREATE TABLE sell_list_info(sell_id int PRIMARY KEY,sell_date date not null,goods_id char(20) not null,goods_name char(20) not null,goods_number int not null,goods_ measurement_unit char(10) not null,sell_goods_amount int not null);--定義存儲過程(在SQL編輯框中輸入如下語句,最后輸入“/” 執行)
CREATE PROCEDURE insert_data()??ISBEGININSERT INTO sell_list_info select *?from sell_list_info_tmp1; ?INSERT INTO sell_list_info select *?from sell_list_info_tmp2; ?INSERT INTO sell_list_info select *?from sell_list_info_tmp3; ?INSERT INTO sell_list_info select *?from sell_list_info_tmp4; ?INSERT INTO sell_list_info select *?from sell_list_info_tmp5; ?END;/示例截圖:
--調用存儲過程
CALL ?insert_data();
7、新建用戶并授權訪問
假設新增了一個管理用戶,該用戶想訪問零售數據庫(retail_db),則該員工需要向sys申請添加相關權限,具體操作如下:
7.1 連接數據庫后,進入SQL命令界面。創建用戶user002,密碼為openGauss@123。
CREATE USER user002 IDENTIFIED BY 'openGauss@123';7.2?給用戶user002授予retail_db數據庫下的訂貨單信息表(order_info)的查詢和插入權限:
GRANT SELECT,INSERT ON order_info?TO user002;7.3退出數據庫:
postgres=#\q
7.4新用戶連接數據庫
用gsql登錄數據庫,使用新用戶連接。使用操作系統omm用戶在新的窗口登陸并執行以下命令,并輸入對應的密碼:
gsql -d retail_db -U user002 -p 26000 –r7.5訪問order_info數據庫的表order_info:
select * from order_info;六、總結
超市進銷存管理系統是一個龐大復雜的系統,進銷存軟件涉及的模塊也是非常之多,主要包括前端的交互(銷售過程管理)、后端的管理(客戶管理、用戶管理、貨品采購管理、貨品入庫/出庫管理、財務總賬管理、維護管理、優化改進管理等等),甚至可以上升到后臺整個企業的管理(ERP)。 由此可以延伸到整個物理架構設計、邏輯架構設計、數據管理(治理)方案、數據存儲策略等。 ?
本文設計僅從最基本的核心表設計出發,使用openGauss數據庫,完成最基本的超市進銷存管理任務,其他更多細節,歡交流。
總結
以上是生活随笔為你收集整理的超市进销存之openGauss数据库的应用与实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【HTML/CSS】从放弃到入门-笔记1
- 下一篇: 游戏常用名词扫盲