1. 首页 > DB2教程 > 正文

DB2教程FG054-DB2电商系统库设计实战

风哥教程参考DB2官方文档E-commerce Solutions、Scalability、Performance等内容,详细介绍电商系统库在DB2上的设计、商品管理、购物车、订单支付。更多视频教程www.fgedu.net.cn

目录大纲

Part01-电商系统特点

1.1 电商业务特点

电商系统具有以下特点:

  • 高并发:大促期间并发量巨大
  • 数据量大:商品、订单、用户数据量巨大
  • 热点商品:爆款商品访问量极高
  • 事务严格:库存扣减、订单创建一致性要求高
  • 读写分离:读多写少,需要读写分离
  • 分库分表:数据量大,需要分库分表

Part02-核心表结构设计

2.1 商品表设计

# 商品表
CREATE TABLE PRODUCT (
PRODUCT_ID VARCHAR(32) NOT NULL,
PRODUCT_CODE VARCHAR(50) NOT NULL,
PRODUCT_NAME VARCHAR(200) NOT NULL,
CATEGORY_ID VARCHAR(20),
BRAND_ID VARCHAR(20),
ORIGIN_PRICE DECIMAL(10, 2),
SALE_PRICE DECIMAL(10, 2) NOT NULL,
STOCK_QUANTITY INTEGER DEFAULT 0,
SALES_COUNT INTEGER DEFAULT 0,
VIEW_COUNT INTEGER DEFAULT 0,
PRODUCT_STATUS VARCHAR(10) NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_PRODUCT PRIMARY KEY (PRODUCT_ID)
) ORGANIZE BY ROW;

# SKU表
CREATE TABLE SKU (
SKU_ID VARCHAR(32) NOT NULL,
PRODUCT_ID VARCHAR(32) NOT NULL,
SKU_CODE VARCHAR(50) NOT NULL,
SKU_ATTRS VARCHAR(500),
SKU_PRICE DECIMAL(10, 2) NOT NULL,
STOCK_QUANTITY INTEGER DEFAULT 0,
SKU_STATUS VARCHAR(10) NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_SKU PRIMARY KEY (SKU_ID)
) ORGANIZE BY ROW;

# 创建索引
CREATE UNIQUE INDEX IDX_PRODUCT_CODE ON PRODUCT(PRODUCT_CODE);
CREATE INDEX IDX_PRODUCT_CATEGORY ON PRODUCT(CATEGORY_ID, PRODUCT_STATUS);
CREATE INDEX IDX_PRODUCT_STATUS ON PRODUCT(PRODUCT_STATUS, SALES_COUNT DESC);
CREATE INDEX IDX_SKU_PRODUCT ON SKU(PRODUCT_ID);

2.2 用户表设计

# 用户表
CREATE TABLE USER (
USER_ID VARCHAR(32) NOT NULL,
USERNAME VARCHAR(50) NOT NULL,
PASSWORD VARCHAR(100) NOT NULL,
NICKNAME VARCHAR(100),
PHONE VARCHAR(20),
EMAIL VARCHAR(100),
AVATAR VARCHAR(500),
GENDER VARCHAR(10),
BIRTH_DATE DATE,
USER_LEVEL VARCHAR(20),
POINTS INTEGER DEFAULT 0,
BALANCE DECIMAL(10, 2) DEFAULT 0,
TOTAL_ORDER_COUNT INTEGER DEFAULT 0,
TOTAL_ORDER_AMOUNT DECIMAL(10, 2) DEFAULT 0,
LAST_LOGIN_TIME TIMESTAMP,
USER_STATUS VARCHAR(10) NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_USER PRIMARY KEY (USER_ID)
) ORGANIZE BY ROW;

# 用户地址表
CREATE TABLE USER_ADDRESS (
ADDRESS_ID VARCHAR(32) NOT NULL,
USER_ID VARCHAR(32) NOT NULL,
RECEIVER_NAME VARCHAR(100) NOT NULL,
RECEIVER_PHONE VARCHAR(20) NOT NULL,
PROVINCE VARCHAR(50),
CITY VARCHAR(50),
DISTRICT VARCHAR(50),
DETAIL_ADDRESS VARCHAR(500),
POSTAL_CODE VARCHAR(10),
IS_DEFAULT CHAR(1) DEFAULT ‘N’,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_USER_ADDRESS PRIMARY KEY (ADDRESS_ID)
) ORGANIZE BY ROW;

# 创建索引
CREATE UNIQUE INDEX IDX_USER_USERNAME ON USER(USERNAME);
CREATE INDEX IDX_USER_PHONE ON USER(PHONE);
CREATE INDEX IDX_USER_ADDRESS_USER ON USER_ADDRESS(USER_ID);

Part03-购物车与订单

3.1 购物车

# 购物车表
CREATE TABLE CART (
CART_ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
USER_ID VARCHAR(32) NOT NULL,
SKU_ID VARCHAR(32) NOT NULL,
PRODUCT_ID VARCHAR(32) NOT NULL,
QUANTITY INTEGER NOT NULL DEFAULT 1,
SELECTED CHAR(1) DEFAULT ‘Y’,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_CART PRIMARY KEY (CART_ID)
) ORGANIZE BY ROW;

# 创建索引
CREATE UNIQUE INDEX IDX_CART_USER_SKU ON CART(USER_ID, SKU_ID);

# 订单表
CREATE TABLE ORDER (
ORDER_ID VARCHAR(32) NOT NULL,
ORDER_NO VARCHAR(50) NOT NULL,
USER_ID VARCHAR(32) NOT NULL,
TOTAL_AMOUNT DECIMAL(10, 2) NOT NULL,
DISCOUNT_AMOUNT DECIMAL(10, 2) DEFAULT 0,
FREIGHT_AMOUNT DECIMAL(10, 2) DEFAULT 0,
ACTUAL_AMOUNT DECIMAL(10, 2) NOT NULL,
PAYMENT_STATUS VARCHAR(20) NOT NULL,
ORDER_STATUS VARCHAR(20) NOT NULL,
RECEIVER_NAME VARCHAR(100),
RECEIVER_PHONE VARCHAR(20),
RECEIVER_ADDRESS VARCHAR(500),
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_ORDER PRIMARY KEY (ORDER_ID)
) ORGANIZE BY ROW;

# 订单明细表
CREATE TABLE ORDER_DETAIL (
DETAIL_ID BIGINT NOT NULL GENERATED ALWAYS AS IDENTITY,
ORDER_ID VARCHAR(32) NOT NULL,
SKU_ID VARCHAR(32) NOT NULL,
PRODUCT_ID VARCHAR(32) NOT NULL,
PRODUCT_NAME VARCHAR(200) NOT NULL,
SKU_ATTRS VARCHAR(500),
QUANTITY INTEGER NOT NULL,
UNIT_PRICE DECIMAL(10, 2) NOT NULL,
TOTAL_AMOUNT DECIMAL(10, 2) NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_ORDER_DETAIL PRIMARY KEY (DETAIL_ID)
) ORGANIZE BY ROW;

# 创建索引
CREATE UNIQUE INDEX IDX_ORDER_NO ON ORDER(ORDER_NO);
CREATE INDEX IDX_ORDER_USER ON ORDER(USER_ID, CREATE_TIME DESC);
CREATE INDEX IDX_ORDER_STATUS ON ORDER(ORDER_STATUS, CREATE_TIME DESC);
CREATE INDEX IDX_ORDER_DETAIL_ORDER ON ORDER_DETAIL(ORDER_ID);

Part04-支付与评价

4.1 支付

# 支付记录表
CREATE TABLE PAYMENT (
PAYMENT_ID VARCHAR(32) NOT NULL,
ORDER_ID VARCHAR(32) NOT NULL,
PAYMENT_NO VARCHAR(50) NOT NULL,
PAYMENT_TYPE VARCHAR(20) NOT NULL,
PAYMENT_AMOUNT DECIMAL(10, 2) NOT NULL,
PAYMENT_STATUS VARCHAR(20) NOT NULL,
THIRD_PARTY_NO VARCHAR(100),
PAYMENT_TIME TIMESTAMP,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_PAYMENT PRIMARY KEY (PAYMENT_ID)
) ORGANIZE BY ROW;

# 评价表
CREATE TABLE REVIEW (
REVIEW_ID VARCHAR(32) NOT NULL,
ORDER_ID VARCHAR(32) NOT NULL,
USER_ID VARCHAR(32) NOT NULL,
PRODUCT_ID VARCHAR(32) NOT NULL,
SKU_ID VARCHAR(32),
RATING INTEGER NOT NULL,
CONTENT VARCHAR(2000),
IMAGES VARCHAR(2000),
REVIEW_STATUS VARCHAR(20) NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
UPDATE_TIME TIMESTAMP NOT NULL DEFAULT CURRENT TIMESTAMP,
CONSTRAINT PK_REVIEW PRIMARY KEY (REVIEW_ID)
) ORGANIZE BY ROW;

# 创建索引
CREATE INDEX IDX_PAYMENT_ORDER ON PAYMENT(ORDER_ID);
CREATE INDEX IDX_REVIEW_PRODUCT ON REVIEW(PRODUCT_ID, CREATE_TIME DESC);
CREATE INDEX IDX_REVIEW_USER ON REVIEW(USER_ID, CREATE_TIME DESC);

Part05-风哥经验总结与分享

5.1 电商库设计要点

  • 商品库存要加锁,防止超卖
  • 订单创建要使用事务
  • 热点商品要做缓存
  • 订单表按时间分区
  • 用户和商品表要合理索引
  • 大促前要做性能测试

5.2 性能优化建议

场景 优化方案
库存扣减 行级锁,短事务
商品查询 合理索引,缓存热点数据
订单查询 按时间分区,订单号索引
大促应对 读写分离,分库分表

5.3 运维要点

  • 大促前做好扩容准备
  • 实时监控系统性能
  • 定期RUNSTATS和REORG
  • 完善的备份和恢复方案
  • 监控锁等待和死锁
  • 定期归档历史订单
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
风哥Oracle/MySQL/PostgreSQL/Greenplum/DB2/Redis等数据库培训课程,10年一线实战经验,企业级培训,真正掌握数据库核心技术!

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息