基于RDS for PostgreSQL的表设计入门
RDS for PostgreSQL面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore),支持GIS地理信息处理,在可靠性、数据完整性方面有良好声誉,适用于互联网网站、位置应用系统、复杂数据对象处理等应用场景。
本文将以某电商平台为例,介绍如何针对业务场景设计表结构,并在华为云RDS for PostgreSQL中演示相关库表的创建和应用请求处理。
场景说明
某电商平台针对其核心业务场景(用户在线购物、订单管理与商品统计分析)进行数据库表结构设计,以保障关键业务数据的一致性与完整性,同时提升在高并发场景下的事务处理效率。
表设计
- 用户表(t_customers)
该表存储用户信息,每个用户在该表中有一条记录,并且有唯一的用户ID(cust_id)。
表1 用户表 字段名
字段类型
字段说明
cust_id
SERIAL
用户ID,主键。
cust_nickname
VARCHAR(50)
用户昵称,添加非空约束。
cust_gender
VARCHAR(10)
用户性别。
cust_birthday
DATE
用户生日。
cust_address
TEXT
用户收货地址,添加非空约束。
- 商品表(t_goods)
该表存储商品信息,每件商品在该表中有一条记录,并且有唯一的商品ID(item_id)。
表2 商品表 字段名
字段类型
字段说明
item_id
SERIAL
商品ID,主键。
item_name
VARCHAR(100)
商品名称,添加非空约束。
item_category
VARCHAR(50)
商品类别,添加非空约束。
item_desc
TEXT
商品描述。
item_price
DECIMAL(10,2)
商品单价,添加非空约束。
stock_quantity
INTEGER
库存数量,添加非空约束。
- 订单表(t_orders)
该表存储订单信息,用于关联用户和商品。每个订单在该表中有一条记录,并且有唯一的订单ID(trans_id)。
表3 订单表 字段名
字段类型
字段说明
trans_id
SERIAL
订单ID,主键。
cust_id
INTEGER
订单用户ID,关联用户表(t_customers)中的用户ID(cust_id)。
item_id
INTEGER
订单商品ID,关联商品表(t_goods)中的商品ID(item_id)。
purchase_quantity
INTEGER
商品购买数量,添加非空约束。
total_price
DECIMAL(10,2)
商品总价,添加非空约束。
order_time
TIMESTAMP
订单生成时间,添加DEFAULT约束。
order_status
VARCHAR(20)
订单状态,添加非空约束。
创建表
- 在数据库中创建表。
- 创建用户表(t_customers)。
CREATE TABLE t_customers ( cust_id SERIAL PRIMARY KEY, cust_nickname VARCHAR(50) NOT NULL, cust_gender VARCHAR(10), cust_birthday DATE, cust_address TEXT NOT NULL );
- 创建商品表(t_goods)。
CREATE TABLE t_goods( item_id SERIAL PRIMARY KEY, item_name VARCHAR(100) NOT NULL, item_category VARCHAR(50) NOT NULL, item_desc TEXT, item_price DECIMAL(10,2) NOT NULL, stock_quantity INTEGER NOT NULL );
- 创建订单表(t_orders)。
CREATE TABLE t_orders ( trans_id SERIAL PRIMARY KEY, cust_id INTEGER REFERENCES t_customers(cust_id), item_id INTEGER REFERENCES t_goods(item_id), purchase_quantity INTEGER NOT NULL, total_price DECIMAL(10,2) NOT NULL, order_time TIMESTAMP NOT NULL DEFAULT NOW(), order_status VARCHAR(20) NOT NULL );
- 创建用户表(t_customers)。
- 假设商城上架了一些商品,用户已经在平台上注册了账号并且购买了部分商品,相关数据已传回系统数据库。在数据库中模拟插入如下测试数据:
-- 用户数据 INSERT INTO t_customers (cust_nickname, cust_gender, cust_birthday, cust_address) VALUES ('Rich Man', 'Female', '1995-08-12', '北京市海淀区'), ('Superman', 'Male', '1998-03-25', '上海市浦东新区'); -- 商品数据 INSERT INTO t_goods(item_name, item_category, item_desc, item_price, stock_quantity) VALUES ('智能手机X', '电子产品', '最新款智能手机', 5999.00, 22), ('无线耳机Pro', '电子产品', '爆款产品', 1299.00, 200), ('棉质T恤', '服装', '纯棉材质', 199.00, 300); -- 订单数据 INSERT INTO t_orders(cust_id, item_id, purchase_quantity, total_price, order_status) VALUES (1, 1, 1, 5999.00, '已支付'), (1, 2, 2, 2598.00, '已发货'), (2, 3, 5, 995.00, '已完成');
场景示例
- Superman用户查询自己的所有订单(cust_id为2)。
SELECT m.item_name, t.purchase_quantity, t.total_price, t.order_time, t.order_status FROM t_customers c JOIN t_orders t ON c.cust_id = t.cust_id JOIN t_goods m ON t.item_id = m.item_id WHERE c.cust_id = 2;
返回结果如下:
item_name | purchase_quantity | total_price | order_time | order_status -----------+-------------------+-------------+----------------------------+-------------- 棉质T恤 | 5 | 995.00 | 2025-07-31 15:04:03.593379 | 已完成 (1 row)
- 平台统计各商品销量。
SELECT m.item_name, SUM(t.purchase_quantity) AS total_sold FROM t_goods m LEFT JOIN t_orders t ON m.item_id = t.item_id GROUP BY m.item_name ORDER BY total_sold DESC;
返回结果如下:
item_name | total_sold -------------+------------ 棉质T恤 | 5 无线耳机Pro | 2 智能手机X | 1 (3 rows)
- 查询库存数量低于50件的电子产品。
SELECT item_name, stock_quantity FROM t_goods WHERE stock_quantity < 50 AND item_category = '电子产品';
返回结果如下:
item_name | stock_quantity -----------+---------------- 智能手机X | 22 (1 row)