:你只管努力,剩下的交给时间
:小破站
一定要进入KingbaseES 在线体验平台体验
在现代企业信息化系统中,用户管理和积分商城是非常常见的业务场景。本文将以"用户管理+积分商城"为主题,带你在 KingbaseES 在线体验平台上,完整体验从表结构设计、数据插入、索引优化、复杂查询,到视图、函数、触发器等高级特性的实战过程。无论你是数据库初学者,还是有一定经验的开发者,都能通过本案例深入理解 KingbaseES 的强大功能。
本案例模拟一个电商平台的用户与积分商城系统,主要包括:
我们将通过 SQL 语句一步步实现这些功能,并体验 KingbaseES 的在线开发与调试能力。
本节将简要介绍本次实战案例的业务背景和主要目标。我们以电商平台的用户管理和积分商城为例,涵盖用户注册、积分获取与消费、商品兑换、订单管理等典型业务,帮助大家理解数据库在实际业务中的应用。
在数据库开发中,合理的表结构设计是高效业务实现的基础。本节将带你设计用户、积分流水、商品、订单等核心表结构,并说明每个表的业务含义和字段设计思路。
请在 KingbaseES 在线平台依次执行以下插入语句,快速生成丰富的测试数据,便于后续查询和分析。
存储用户的基本信息。
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
reg_date DATE DEFAULT CURRENT_DATE,
status VARCHAR(20) DEFAULT 'active'
);
记录用户每一次积分变动(获取或消费)。
CREATE TABLE points_log (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
change_type VARCHAR(20) NOT NULL, -- earn/spend
points INT NOT NULL,
description VARCHAR(200),
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
积分商城可兑换的商品信息。
CREATE TABLE products (
id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
points_cost INT NOT NULL,
stock INT DEFAULT 0,
status VARCHAR(20) DEFAULT 'on_sale'
);
记录用户兑换商品的订单。
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
status VARCHAR(20) DEFAULT 'pending',
FOREIGN KEY (user_id) REFERENCES users(id),
FOREIGN KEY (product_id) REFERENCES products(id)
);
有了表结构,接下来需要准备一些测试数据,便于后续查询和功能演示。本节将批量插入用户、商品、积分流水和订单数据,模拟真实业务场景,让你在平台上有"数据可查"。
INSERT INTO users (username, email, reg_date, status) VALUES
('alice', '[email protected]', '2024-06-01', 'active'),
('bob', '[email protected]', '2024-06-02', 'active'),
('carol', '[email protected]', '2024-06-03', 'active'),
('dave', '[email protected]', '2024-06-04', 'inactive'),
('eve', '[email protected]', '2024-06-05', 'active');
INSERT INTO products (product_name, points_cost, stock, status) VALUES
('蓝牙耳机', 500, 10, 'on_sale'),
('智能手环', 800, 5, 'on_sale'),
('咖啡券', 200, 50, 'on_sale'),
('电影票', 300, 20, 'on_sale'),
('定制T恤', 1000, 2, 'on_sale');
INSERT INTO points_log (user_id, change_type, points, description) VALUES
(1, 'earn', 1000, '注册赠送'),
(1, 'earn', 200, '每日签到'),
(1, 'spend', -500, '兑换蓝牙耳机'),
(2, 'earn', 800, '注册赠送'),
(2, 'spend', -300, '兑换电影票'),
(3, 'earn', 1200, '注册赠送'),
(3, 'spend', -800, '兑换智能手环'),
(4, 'earn', 500, '注册赠送'),
(5, 'earn', 700, '注册赠送');
INSERT INTO orders (user_id, product_id, status) VALUES
(1, 1, 'completed'),
(2, 4, 'completed'),
(3, 2, 'completed');
索引是提升数据库查询性能的重要手段。本节将为常用的查询字段创建索引,并简要说明索引的作用和注意事项,帮助你体验索引优化带来的性能提升。
CREATE INDEX idx_points_user_id ON points_log(user_id);
CREATE INDEX idx_orders_user_id ON orders(user_id);
CREATE INDEX idx_orders_product_id ON orders(product_id);
数据库的强大之处在于能够支持复杂的数据分析和业务查询。本节将通过多表关联、分组、聚合、子查询等多种方式,演示如何用 SQL 实现积分统计、用户行为分析、商品热度排行等复杂业务需求。
SELECT u.username, COALESCE(SUM(p.points), 0) AS total_points
FROM users u
LEFT JOIN points_log p ON u.id = p.user_id
GROUP BY u.id, u.username;
说明:统计每个用户的积分获取与消费总和,得出当前积分余额。
SELECT u.username, ABS(SUM(CASE WHEN p.change_type = 'spend' THEN p.points ELSE 0 END)) AS total_spent,
STRING_AGG(DISTINCT pr.product_name, ', ') AS exchanged_products
FROM users u
JOIN points_log p ON u.id = p.user_id
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN products pr ON o.product_id = pr.id
WHERE p.change_type = 'spend'
GROUP BY u.id, u.username
ORDER BY total_spent DESC
LIMIT 3;
说明:用聚合、条件、连接和字符串聚合函数,查出积分消费最多的用户及其兑换过的商品。
SELECT u.username, p.change_type, p.points, p.description, p.change_time
FROM users u
JOIN points_log p ON u.id = p.user_id
WHERE p.change_time >= '2024-06-10'
ORDER BY p.change_time DESC;
说明:体验时间区间查询和排序。
视图和函数是数据库复用和业务封装的利器。本节将带你创建常用的业务视图和自定义函数,简化复杂查询、提升开发效率,并说明它们在实际项目中的应用场景。
CREATE VIEW user_points_view AS
SELECT u.username, p.change_type, p.points, p.description, p.change_time
FROM users u
JOIN points_log p ON u.id = p.user_id;
场景:每当有新订单插入时,自动记录一条积分消费流水。
CREATE OR REPLACE FUNCTION log_points_on_order() RETURNS TRIGGER AS $$
BEGIN
INSERT INTO points_log (user_id, change_type, points, description, change_time)
VALUES (NEW.user_id, 'spend', -1 * (SELECT points_cost FROM products WHERE id = NEW.product_id), '兑换商品', NEW.order_time);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_log_points_on_order
AFTER INSERT ON orders
FOR EACH ROW
EXECUTE PROCEDURE log_points_on_order();
通过本次 KingbaseES 在线体验平台的"用户管理与积分商城"实战,你不仅可以体验到表结构设计、数据批量插入、索引优化、复杂查询、视图、函数、触发器等数据库核心功能,还能感受到国产数据库的易用性和强大扩展能力。无论是业务开发还是数据分析,KingbaseES 都能为你提供高效、灵活的解决方案。欢迎大家动手实践,探索更多高级玩法!