零售是整个供应链中的最后一环,也是十分关键的一环。
商品的供应链是一个包含多个步骤的完整链路,从商品的设想到销售,基本上可以归纳为设计→制造→供应链→商家→消费者。如图1-1:
在这个完整链路中,有很多需要关注的地方。
比如,商品制造出来,正在到消费者手中,可以有不同的路径。商家可以大型的商超,也可以是地摊形式的小商贩。某天,你下班的路上,便可以随手购买一束鲜花;也可以在休息日,专门去花店购买一捧精心包装的花束;甚至可以在线上鲜花店铺,订购鲜花,可能不用出门,隔天鲜花就送到了你的手上。
在比如,商场进购货物,可以找经销商进货;也可以反过来,经销商找商场租柜台卖货物。
无论何种形式,商品想要到达消费者的手中,都需要经过“零售”的场。
零售作为链路的末端,势必要经过“场”,而新零售中“场”也不再是传统中所见的实体或地摊,互联网技术的支持逐渐成为一种新的常见的“场”。
线上商场,可以缩短消费者到“场”的距离,也可以缩短人到货的距离,不但可以很方便的找到自己需要的商品,同时可以查看到商品的各种信息,比如是否有存货、是否有促销活动、商品评价等等。
在说明“我为何钟意GaussDB”之前,先来简单介绍一下我们目前的业务场景。
链接场与货的基础是数据,主要为商场的货物信息。
每日的商场货物信息是实时更新的,所以有一套业务数据的维护规则。这是一个较为复杂的工程,我们今天只探讨部分功能:按照日期生成业务数据。
我们的业务数据的建库、建表以及数据生成,主要是通过导入脚本完成的。具体步骤如下:
首先修改我们application.properties的相关配置,通过修改业务日期的配置进而生成不同日期的业务数据。
#业务日期
mock.creat-at=2023-12-19
#是否重置
mock.clear=1
#生成商品个数
mock.good.count=500
#生成商品的大类数量
mock.good.large-category-type=20
#生成商品的中类数量
mock.good.middle-category-type=48
#生成商品的小类数量
mock.good.small-category-type=200
#是否有促销活动
mock.activity.promo-flag=1
#每件商品最多可购数量
mock.cart.good-max-count=99
#今日发放优惠券数量
mock.order.coupon-count=5
执行以下命令生成2023-12-19的数据:
java -jar good-mock-db-SNAPSHOT.jar
以上是业务数据生成的局部功能,实际的操作会更复杂,数据量会更加庞大。我需要更加稳定的技术能力。
为了满足在数据查询、数据管理方面等方面的高要求,我们一直在寻找更佳方案。
在计算机科学中,有一种很重要的算法叫做“分治法”。它的实现原理是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。
于是乎,采用“将庞大的数据整体进行了切分”的方式,十分利于数据的管理、查找和维护。
GaussDB的“分区表”特性,正是在“分治法”的基础上,提供了更高效的数据运维管理方式。
华为云的官网,详细介绍了表分区技术最主要的三个方面的能力:
GaussDB的分区策略主要有:范围分区、哈希分区、列表分区。
其中范围分区是根据为每个分区建立的分区键的值范围将数据映射到分区。通常在以时间维度(Date、Time Stamp)描述数据场景中使用。也正好符合我们的业务场景需要。
范围分区有两种语法格式:VALUES LESS THAN的语法格式和START END语法格式。其中VALUES LESS THAN的语法格式,范围分区策略的分区键最多支持16列。
来看一个我们单列分区键示例:
CREATE TABLE range_sales
(
good_id INT4 NOT NULL,
large_categor_type INT4,
middle_categor_type INT4,
small_categor_type INT4,
creat_at DATE,
good_max_count INT4,
good_count INT4,
order_coupon_count INT4
)
PARTITION BY RANGE (time)
(
PARTITION date_202301 VALUES LESS THAN ('2023-01-01'),
PARTITION date_202302 VALUES LESS THAN ('2023-02-01'),
…
PARTITION date_202311 VALUES LESS THAN ('2023-11-01'),
PARTITION date_202312 VALUES LESS THAN ('2023-12-01'),
);
其中date_202301表示2023年1月的分区,将包含分区键值从2023年1月1日到2020年1月31日的数据。
除了分区策略,GaussDB的分区表特性还提供了其他优秀功能。
1、分区表查询优化
包括分区剪枝和分区索引。
分区表静态剪枝,可在优化器阶段将对indexscan、bitmap indexscan、indexonlyscan等算子中包含的检索条件作为剪枝条件,完成分区的筛选。
2、分区表相关内置工具函数
包括前置建表相关信息和工具函数。节省了开发者的工作量。
3、分区表运维管理
包括新增分区、删除分区、交换分区、清空分区、分割分区、合并分区、移动分区、重命名分区、分区表行迁移、分区表索引重建/不可用等功能,基本上包含了所有可进行操,十分齐全详尽。
对于数据库的容量庞大、数据多样化的场景,GaussDB给予了很好的支持。
通过分区表对分区键进行谓词查询的方式,对数据查找方面的提供了极大的帮助;此外数据生命周期管理(DLM)提供了灵活性的支持,基本上完成了确定在数据生命周期的任何时间点存储数据的最合适和最经济高效的介质,最大限度在确保易用性的同时,实现了有效的数据生命周期的成本优化。
以上特点,十分贴合我们新零售供应链中,对于场与货链接中,大容量数据库需要的业务场景。
未来我会继续摸索华为云GaussDB的功能。
作者:非职业「传道授业解惑」的开发者叶一一
简介:「趣学前端」、「CSS畅想」系列作者,华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞 | 收藏⭐️ | 留言。