openGauss支撑零售关键业务视图的效率优化与最佳实践

文章目录

1.背景

最近身边一位小伙伴在大环境的压力下回老家打算自己创业开个小零食店,但是在准备的过程中发现,这个库存管理实在是头大啊,现在这个年代了,也不可能手动去记账,用数据库又不知道该选哪个,正好我也是干数据库的,也了解到openGauss这个数据库,正好借此机会来测试一下。
小伙伴说,做线下零售行业,库存与销售管理是业务运营的核心环节,涉及商品信息、库存变动、销售数据、门店信息等多维度数据的联动处理,所以一定要慎重选择,否则不仅不会事半功倍,反而帮倒忙了。
我通过官网查阅了一下openGauss的一些相关信息,他作为一款开源的企业级关系型数据库,其视图功能能够简化复杂查询、屏蔽数据细节、保障数据安全,在零售场景中具有较高的应用价值。
所以本次测评针对线下零售门店库存与销售管理的全新业务场景,从测试表创建、视图设计、功能验证、性能测试等方面,深度验证openGauss视图的实用性、稳定性与高效性,希望能帮到我的小伙伴和各位有需要的读者。


2.目标

🚀🚀 验证openGauss在零售库存与销售场景下,视图创建、查询、修改、删除等基础功能的完整性与正确性。
🚀🚀 测试视图在多表关联、复杂条件过滤、聚合计算等场景下的查询性能,评估其在业务高频访问场景的适用性。
🚀🚀 验证视图在权限控制、数据隔离方面的能力,确保符合零售场景下不同角色的数据访问需求。
🚀🚀 测试视图对底层表数据变动的响应及时性与准确性,保障业务数据的一致性。


3.业务场景模拟与数据设计

3.1.场景设计

本次聚焦线下零售门店的核心业务场景,包括:
1)门店商品库存实时查询(含库存预警);
2)商品销售明细与汇总分析(按门店、按时间、按商品类别);
3)热销商品与滞销商品识别(结合库存与销售数据);
4)门店销售业绩统计(含销售额、利润、客单价等指标)

3.2.数据设计

基于业务场景设计核心数据表,涵盖商品、门店、库存、销售四大核心实体,各表字段及关系如下:
1)商品表(product):存储商品基础信息,主键为product_id;
2)门店表(store):存储门店基础信息,主键为store_id;
3)库存表(inventory):存储各门店商品的库存信息,主键为inventory_id,外键关联product_id和store_id;
4)销售表(sales):存储商品销售明细,主键为sales_id,外键关联product_id、store_id;
5)商品类别表(product_category):存储商品类别信息,主键为category_id,外键关联product表的category_id


4.测试表与测试数据设计

4.1.测试表

sql 复制代码
--商品类别表
CREATE TABLE product_category ( category_id INT PRIMARY KEY, category_name VARCHAR(50) NOT NULL, remark VARCHAR(200) );
--商品表
CREATE TABLE product ( product_id INT PRIMARY KEY, product_name VARCHAR(100) NOT NULL, category_id INT NOT NULL, unit_price DECIMAL(10,2) NOT NULL, cost_price DECIMAL(10,2) NOT NULL, spec VARCHAR(50), FOREIGN KEY (category_id) REFERENCES product_category(category_id) );
--门店表
CREATE TABLE store ( store_id INT PRIMARY KEY, store_name VARCHAR(100) NOT NULL, area VARCHAR(50) NOT NULL, manager VARCHAR(50), contact_phone VARCHAR(20), open_time DATE NOT NULL );
--库存表
CREATE TABLE inventory ( inventory_id INT PRIMARY KEY, product_id INT NOT NULL, store_id INT NOT NULL, current_stock INT NOT NULL DEFAULT 0, safety_stock INT NOT NULL DEFAULT 10, last_update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (product_id) REFERENCES product(product_id), FOREIGN KEY (store_id) REFERENCES store(store_id), UNIQUE (product_id, store_id) );
--销售表
CREATE TABLE sales ( sales_id BIGINT PRIMARY KEY, product_id INT NOT NULL, store_id INT NOT NULL, sales_quantity INT NOT NULL, sales_price DECIMAL(10,2) NOT NULL, sales_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, customer_id VARCHAR(50), FOREIGN KEY (product_id) REFERENCES product(product_id), FOREIGN KEY (store_id) REFERENCES store(store_id) );
--索引
CREATE INDEX idx_sales_product_id ON sales(product_id);
CREATE INDEX idx_sales_store_id ON sales(store_id);
CREATE INDEX idx_sales_sales_time ON sales(sales_time);
CREATE INDEX idx_inventory_product_store ON inventory(product_id, store_id);
CREATE INDEX idx_product_category_id ON product(category_id);

4.2.测试数据

sql 复制代码
--插入商品类别
INSERT INTO product_category (category_id, category_name, remark) VALUES (1, '食品饮料', '各类零食、饮料'),(2, '日用百货', '洗漱用品、家居用品'),(3, '生鲜果蔬', '新鲜水果、蔬菜'),(4, '家用电器', '冰箱、洗衣机、空调等'),(5, '服装鞋帽', '男女服装、鞋帽配饰'),(6, '数码产品', '手机、电脑、相机等'),(7, '美妆护肤', '化妆品、护肤品'),(8, '图书文具', '书籍、办公文具'),(9, '运动户外', '运动器材、户外装备'),(10, '家居厨具', '厨房用具、家居装饰');
--插入门店数据
INSERT INTO store (store_id, store_name, area, manager, contact_phone, open_time) VALUES (1, '豫园门店', '上海黄浦', '张三', '13800138001', '2025-01-15'),(2, '徐家汇门店', '上海徐汇', '李四', '13800138002', '2025-02-20'),(3, '嘉里中心门店', '上海静安', '王五', '13800138003', '2025-03-10'),(4, '世纪汇门店', '上海浦东', '赵六', '13800138004', '2025-04-15'),(5, '荟聚门店', '上海长宁', '钱七', '13800138005', '2025-05-20');

插入商品类别和门店信息后,可以select看一下我们插入的数据

由于要插入100个商品名称(product表),所以这里没有贴出代码,大家可以自行生成,如果不插入商品名称,后续插入sales数据会报错,如下图

插入库存表的数据

sql 复制代码
INSERT INTO inventory (inventory_id, product_id, store_id, current_stock, safety_stock, last_update_time) SELECT generate_series(1, 500) AS inventory_id, (generate_series(1, 500) - 1) % 100 + 1 AS product_id, floor((generate_series(1, 500) - 1) / 100) + 1 AS store_id, floor((10 + random() * 20) * (0.5 + random() * 1.5))::INT AS current_stock, floor(10 + random() * 20)::INT AS safety_stock, CURRENT_TIMESTAMP - (random() * 7)::INTERVAL AS last_update_time;

接下来下来插入10万条销售数据

sql 复制代码
--插入销售数据
INSERT INTO sales (sales_id, product_id, store_id, sales_quantity, sales_price, sales_time, customer_id) SELECT generate_series(1, 100000) AS sales_id, floor(random()*100 + 1)::INT AS product_id, floor(random()*5 + 1)::INT AS store_id, floor(random()*10 + 1)::INT AS sales_quantity, (floor(random()*100 + 10)::DECIMAL(10,2)) AS sales_price, CURRENT_TIMESTAMP - (random()*30)::INTERVAL AS sales_time, 'CUST_' || floor(random()*10000 + 1)::VARCHAR AS customer_id;

5.视图设计

结合核心业务场景,设计5类核心视图,涵盖库存查询、销售分析、商品洞察、门店业绩等维度,视图类型包括普通视图、聚合视图、关联视图等,全面覆盖OpenGauss视图的核心应用场景

5.1.普通关联视图

5.1.1.关联表

store、product、inventory

5.1.2.功能

1)整合门店、商品、库存及商品类别多维数据,呈现各门店每款商品的完整库存信息
2)核心展示门店ID与名称、商品ID与名称、所属类别、当前库存数量、安全库存阈值等基础字段
3)通过条件判断生成库存预警标识,直观区分正常库存与预警库存商品;
4)支持按门店、商品维度快速筛选,为门店理货员提供实时库存查询依据,助力及时补货决策

5.1.3.具体代码

sql 复制代码
CREATE OR REPLACE VIEW v_store_product_inventory AS SELECT s.store_id, s.store_name, p.product_id, p.product_name, p.category_id, pc.category_name, i.current_stock, i.safety_stock, CASE WHEN i.current_stock < i.safety_stock THEN 1 ELSE 0 END AS inventory_warning, i.last_update_time FROM store s JOIN inventory i ON s.store_id = i.store_id JOIN product p ON i.product_id = p.product_id JOIN product_category pc ON p.category_id = pc.category_id ORDER BY s.store_id, p.product_id;

5.2.聚合视图

5.2.1.关联表

store、product、sales

5.2.2.功能

1)按门店、日期、商品类别三级维度聚合每日销售数据,实现销售情况的精细化拆解;
2)核心计算并展示当日总销量、总销售额、订单数量等关键指标;
3)自动按销售日期倒序、销售额降序排列,便于快速定位高销门店与热门品类;
4)为门店店长提供每日销售复盘数据,支撑日销目标达成分析及次日进货计划制定

5.2.3.具体代码

sql 复制代码
CREATE OR REPLACE VIEW v_sales_daily_summary AS SELECT s.store_id, s.store_name, TO_CHAR(sl.sales_time, 'YYYY-MM-DD') AS sales_date, p.category_id, pc.category_name, SUM(sl.sales_quantity) AS total_sales_quantity, SUM(sl.sales_quantity * sl.sales_price) AS total_sales_amount, COUNT(DISTINCT sl.sales_id) AS order_count FROM store s JOIN sales sl ON s.store_id = sl.store_id JOIN product p ON sl.product_id = p.product_id JOIN product_category pc ON p.category_id = pc.category_id GROUP BY s.store_id, s.store_name, TO_CHAR(sl.sales_time, 'YYYY-MM-DD'), p.category_id, pc.category_name ORDER BY sales_date DESC, total_sales_amount DESC;

5.3.复杂关联聚合视图

5.3.1.关联表

product、category、inventory、sales

5.3.2.功能

1)融合近7天商品销售数据与当前库存数据,构建商品动销能力评估模型
2)核心输出商品7天销量、7天销售额、平均库存、库存周转天数等评估指标;
3)基于销量分位数与库存安全阈值,自动将商品划分为热销、滞销、普通三类;
4)为采购人员提供商品生命周期管理依据,辅助热销品补货与滞销品促销决策

5.3.3.具体代码

sql 复制代码
CREATE OR REPLACE VIEW v_hot_slow_product AS WITH product_sales AS ( SELECT p.product_id, p.product_name, pc.category_name, SUM(sl.sales_quantity) AS sales_7d_quantity, SUM(sl.sales_quantity * sl.sales_price) AS sales_7d_amount FROM product p JOIN sales sl ON p.product_id = sl.product_id JOIN product_category pc ON p.category_id = pc.category_id WHERE sl.sales_time >= CURRENT_TIMESTAMP - INTERVAL '7 days' GROUP BY p.product_id, p.product_name, pc.category_name ), product_stock AS ( SELECT i.product_id, AVG(i.current_stock) AS avg_current_stock, AVG(i.safety_stock) AS avg_safety_stock FROM inventory i GROUP BY i.product_id ) SELECT ps.product_id, ps.product_name, ps.category_name, ps.sales_7d_quantity, ps.sales_7d_amount, COALESCE(pst.avg_current_stock, 0) AS avg_current_stock, CASE WHEN ps.sales_7d_quantity = 0 THEN NULL ELSE COALESCE(pst.avg_current_stock / (ps.sales_7d_quantity / 7), 0) END AS stock_turnover_days, CASE WHEN ps.sales_7d_quantity >= (SELECT PERCENTILE_CONT(0.8) WITHIN GROUP (ORDER BY sales_7d_quantity) FROM product_sales) THEN '热销商品' WHEN ps.sales_7d_quantity = 0 AND COALESCE(pst.avg_current_stock, 0) > COALESCE(pst.avg_safety_stock, 10) THEN '滞销商品' ELSE '普通商品' END AS product_type FROM product_sales ps LEFT JOIN product_stock pst ON ps.product_id = pst.product_id ORDER BY ps.sales_7d_amount DESC;

5.4.多维度聚合视图

5.4.1.关联表

store、product、sales

5.4.2.功能

1)按门店、月份维度聚合销售数据,构建多维度业绩评估体系;
2)核心计算总销量、总销售额、总利润、客单价、利润率五大核心业绩指标;
3)关联门店区域信息,支持按区域、门店、月份进行业绩横向对比;
4)为区域经理与门店负责人提供月度业绩复盘数据,支撑绩效核算与经营策略优化

5.4.3.具体代码

sql 复制代码
CREATE OR REPLACE VIEW v_store_performance AS SELECT s.store_id, s.store_name, s.area, TO_CHAR(sl.sales_time, 'YYYY-MM') AS sales_month, SUM(sl.sales_quantity) AS total_sales_quantity, SUM(sl.sales_quantity * sl.sales_price) AS total_sales_amount, SUM(sl.sales_quantity * (sl.sales_price - p.cost_price)) AS total_profit, CASE WHEN COUNT(DISTINCT sl.sales_id) = 0 THEN 0 ELSE SUM(sl.sales_quantity * sl.sales_price) / COUNT(DISTINCT sl.sales_id) END AS average_transaction_value, CASE WHEN SUM(sl.sales_quantity * sl.sales_price) = 0 THEN 0 ELSE (SUM(sl.sales_quantity * (sl.sales_price - p.cost_price)) / SUM(sl.sales_quantity * sl.sales_price)) * 100 END AS profit_margin FROM store s JOIN sales sl ON s.store_id = sl.store_id JOIN product p ON sl.product_id = p.product_id GROUP BY s.store_id, s.store_name, s.area, TO_CHAR(sl.sales_time, 'YYYY-MM') ORDER BY sales_month DESC, total_sales_amount DESC;

5.5.条件过滤视图

5.5.1.关联表

store、product、inventory

5.5.2.功能

1)精准筛选出各门店当前库存低于安全库存阈值的商品,形成预警清单;
2)核心展示门店信息、商品详情(ID、名称、规格)、当前库存、安全库存及缺货量;
3)按缺货量升序、库存更新时间倒序排列,优先提示缺货严重且最新更新的商品;
4)为库存管理员提供精准的补货提醒,避免因商品缺货导致的销售损失

sql 复制代码
CREATE OR REPLACE VIEW v_inventory_warning AS SELECT s.store_id, s.store_name, p.product_id, p.product_name, p.spec, i.current_stock, i.safety_stock, i.current_stock - i.safety_stock AS stock_shortage, i.last_update_time FROM store s JOIN inventory i ON s.store_id = i.store_id JOIN product p ON i.product_id = p.product_id WHERE i.current_stock < i.safety_stock ORDER BY stock_shortage ASC, i.last_update_time DESC;

6.视图查询功能

6.1.普通视图查询

我们创建一共普通视图来查询门店1的商品库存,同时对比与表中数据是否一致

sql 复制代码
SELECT * INTO temp_view_result FROM v_store_product_inventory WHERE store_id = 1;SELECT s.store_id, s.store_name, p.product_id, p.product_name, p.category_id, pc.category_name, i.current_stock, i.safety_stock, CASE WHEN i.current_stock < i.safety_stock THEN 1 ELSE 0 END AS inventory_warning, i.last_update_time INTO temp_table_result FROM store s JOIN inventory i ON s.store_id = i.store_id JOIN product p ON i.product_id = p.product_id JOIN product_category pc ON p.category_id = pc.category_id WHERE s.store_id = 1 ORDER BY s.store_id, p.product_id;SELECT COUNT(*) FROM temp_view_result;SELECT COUNT(*) FROM temp_table_result;SELECT * FROM temp_view_result EXCEPT SELECT * FROM temp_table_result;

从查询出来的结果来看,两者的数据量相同,结果集都有100条记录;使用 EXCEPT 比较后返回0行,说明两个结果集完全一致;视图正确地连接了所有相关表并计算了库存预警状态。
这也意味着库存管理视图能够准确反映各门店的商品库存状况,包括库存预警状态,对于店长或者管理人员来说,就可以放心使用这个视图来进行库存监控和预警分析,在实际业务中,能起到很大的帮助。


6.2.聚合视图查询

查询2025-10-15荟聚门店的销售汇总

sql 复制代码
SELECT * INTO temp_sales_view FROM v_sales_daily_summary WHERE store_name = '荟聚门店' AND sales_date = '2025-10-07';SELECT s.store_id, s.store_name, TO_CHAR(sl.sales_time, 'YYYY-MM-DD') AS sales_date, p.category_id, pc.category_name, SUM(sl.sales_quantity) AS total_sales_quantity, SUM(sl.sales_quantity * sl.sales_price) AS total_sales_amount, COUNT(DISTINCT sl.sales_id) AS order_count INTO temp_sales_table FROM store s JOIN sales sl ON s.store_id = sl.store_id JOIN product p ON sl.product_id = p.product_id JOIN product_category pc ON p.category_id = pc.category_id WHERE s.store_name = '荟聚门店' AND TO_CHAR(sl.sales_time, 'YYYY-MM-DD') = '2025-10-07' GROUP BY s.store_id, s.store_name, TO_CHAR(sl.sales_time, 'YYYY-MM-DD'), p.category_id, pc.category_name ORDER BY sales_date DESC, total_sales_amount DESC;SELECT * FROM temp_sales_view EXCEPT SELECT * FROM temp_sales_table;

最终查询出来的结果为0,意味着视图数据和表格中查询出来的完全一致,能够确保数据一致性


6.3.复杂视图过滤

查询"食品饮料"类的热销商品

sql 复制代码
SELECT * FROM v_hot_slow_product WHERE category_name = '食品饮料' AND product_type = '热销商品';WITH product_sales AS ( SELECT p.product_id, SUM(sl.sales_quantity) AS sales_7d_quantity FROM product p JOIN sales sl ON p.product_id = sl.product_id WHERE p.category_id = 1 AND sl.sales_time >= CURRENT_TIMESTAMP - INTERVAL '7 days' GROUP BY p.product_id ) SELECT PERCENTILE_CONT(0.8) WITHIN GROUP (ORDER BY sales_7d_quantity) AS hot_threshold FROM product_sales;

从查询出来的结果来看:
类别ID为1的商品在最近7天内没有销售活动,但其他类别的商品有销售活动,因此能够计算出热销阈值1294
热销阈值1294表示:在所有商品中,80%的商品7天销售量低于1294件,只有20%的商品7天销售量高于这个值


6.4.多维度聚合查询

查询豫园门店2025年1月业绩

sql 复制代码
SELECT * FROM v_store_performance WHERE store_name = '豫园门店' AND sales_month = '2025-10';SELECT SUM(sl.sales_quantity * (sl.sales_price - p.cost_price)) AS manual_profit FROM store s JOIN sales sl ON s.store_id = sl.store_id JOIN product p ON sl.product_id = p.product_id WHERE s.store_name = '豫园门店' AND TO_CHAR(sl.sales_time, 'YYYY-MM') = '2025-10';

虽然这个结果看上去很不可思议...可能是自动插入数据导致这个利润为-44%,也就是严重亏损的,但是测试结果显示视图 v_store_performance 和手动计算的利润完全一致
从测试结果来看,视图视图显示了完整的门店业绩信息,包括:
总销售数量:87,667件
总销售额:5,242,315.00
总利润:-2,323,343.00(负利润)
平均交易价值:326.52
利润率:-44.32%
如果这个数据是真实数据的话,这意味着门店出现了严重亏损,经营者需要调整经营策略,对实际业务场景来说有很重大的意义(没有人想一直亏损吧hhh)


7.总结

openGauss 视图在零售场景中可简化复杂查询、降低业务开发成本,同时通过权限控制保障数据安全,适用于门店理货、采购决策、管理层业绩复盘等多角色需求,具备高实用性与稳定性,在零售场景中具有较高的应用价值。

相关推荐
说私域8 小时前
新零售:定义、驱动因素与AI智能名片链动2+1模式S2B2C商城系统的实践探索
人工智能·零售
盖雅工场11 小时前
告别经验主义!AI与数据如何重塑零售门店的排班逻辑?
人工智能·零售
p***h64312 小时前
人工智能零售应用
人工智能·零售
说私域12 小时前
社交新零售与开源链动2+1模式AI智能名片S2B2C商城小程序的关系研究
人工智能·开源·零售
YisquareTech7 天前
如何实现智能补货?EDI与ERP集成打造零售库存的“自动闭环”
大数据·人工智能·零售·伊士格科技·erp集成
观远数据7 天前
数据驱动零售新生态:观远BI打造终端经营“透视镜”
大数据·人工智能·信息可视化·数据分析·零售
思通数科人工智能大模型7 天前
零售场景下的数智店商:解决盗损问题,化解隐性成本痛点
人工智能·目标检测·计算机视觉·数据挖掘·知识图谱·零售
YisquareTech12 天前
集成技术如何支撑“双十一零售高峰”?
零售·数据集成·系统集成·应用集成·伊士格科技
YisquareTech14 天前
从“零”构建零售EDI能力:实施路径与常见陷阱
网络·人工智能·edi·零售·零售edi