点餐系统的菜品推荐功能可以根据用户的点餐习惯、菜品热度等维度,为用户推送符合其偏好的菜品,提升用户点餐效率和满意度。实现这个功能不需要依赖复杂的外部算法框架,合理利用MySQL的查询能力即可完成基础推荐逻辑。

常见的菜品推荐维度
在点餐系统中,常见的推荐维度主要分为三类,开发者可以根据业务需求选择适配的维度:
- 热门推荐:基于菜品的销量、好评率等数据,推荐当下最受欢迎的菜品,适合所有用户场景。
- 个性化推荐:基于用户的历史点餐记录,推荐用户偏好的分类或相似菜品,提升推荐精准度。
- 关联推荐:基于用户同时点选的菜品组合,推荐搭配率高的菜品,提升客单价。
基础数据表设计
实现推荐功能需要先设计合理的数据表,以下是核心表的结构示例:
-- 菜品表,存储菜品基础信息
CREATE TABLE dish (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL COMMENT '菜品名称',
category_id INT NOT NULL COMMENT '所属分类ID',
price DECIMAL(10,2) NOT NULL COMMENT '菜品价格',
sales INT DEFAULT 0 COMMENT '销量',
score DECIMAL(2,1) DEFAULT 0 COMMENT '评分,范围0-5'
);
-- 用户点餐记录表,存储用户的点餐行为
CREATE TABLE order_record (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL COMMENT '用户ID',
dish_id INT NOT NULL COMMENT '菜品ID',
order_time DATETIME NOT NULL COMMENT '点餐时间',
quantity INT DEFAULT 1 COMMENT '点餐数量'
);
-- 菜品分类表,存储菜品分类信息
CREATE TABLE dish_category (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL COMMENT '分类名称'
);
热门菜品推荐实现
热门推荐逻辑最简单,只需要根据菜品的销量和评分排序即可,SQL查询示例如下:
-- 查询销量前10的热门菜品,同时参考评分排序
SELECT
id,
name,
price,
sales,
score
FROM dish
ORDER BY sales DESC, score DESC
LIMIT 10;
如果需要区分时间范围,比如查询近7天的热门菜品,可以结合点餐记录表统计:
-- 统计近7天销量前10的菜品
SELECT
d.id,
d.name,
d.price,
SUM(r.quantity) AS recent_sales
FROM dish d
JOIN order_record r ON d.id = r.dish_id
WHERE r.order_time >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY d.id, d.name, d.price
ORDER BY recent_sales DESC
LIMIT 10;
个性化菜品推荐实现
个性化推荐可以基于用户历史点餐的分类偏好,推荐同分类下的其他未点过的高评分菜品,实现逻辑如下:
-- 查询用户ID为1的用户偏好的分类,推荐该分类下未点过的高评分菜品
-- 第一步:先查询用户历史点餐的分类ID
WITH user_category AS (
SELECT
d.category_id,
COUNT(*) AS order_count
FROM order_record r
JOIN dish d ON r.dish_id = d.id
WHERE r.user_id = 1
GROUP BY d.category_id
ORDER BY order_count DESC
LIMIT 3 -- 取用户点餐最多的3个分类
)
-- 第二步:推荐这些分类下用户未点过的高评分菜品
SELECT
d.id,
d.name,
d.price,
d.score,
c.name AS category_name
FROM dish d
JOIN dish_category c ON d.category_id = c.id
WHERE d.category_id IN (SELECT category_id FROM user_category)
AND d.id NOT IN (
SELECT dish_id FROM order_record WHERE user_id = 1
)
ORDER BY d.score DESC, d.sales DESC
LIMIT 10;
关联菜品推荐实现
关联推荐可以基于用户点选某菜品时,同时点选率最高的其他菜品,实现逻辑如下:
-- 查询和用户点选的菜品ID为5同时被点选最多的其他菜品
SELECT
d2.id,
d2.name,
d2.price,
COUNT(*) AS together_count
FROM order_record r1
JOIN order_record r2 ON r1.order_id = r2.order_id -- 假设order_record表有order_id字段标识同一订单
JOIN dish d2 ON r2.dish_id = d2.id
WHERE r1.dish_id = 5
AND r2.dish_id != 5
GROUP BY d2.id, d2.name, d2.price
ORDER BY together_count DESC
LIMIT 5;
推荐功能的优化建议
当点餐系统的数据量增大时,可以对推荐查询做以下优化:
- 给
order_record表的user_id、dish_id、order_time字段添加联合索引,提升查询效率。 - 可以定期将热门推荐、常用关联推荐的结果缓存到Redis中,减少MySQL的查询压力。
- 如果用户量极大,可以将推荐计算任务放到定时任务中执行,将结果存储到专门的推荐结果表中,查询时直接读取结果表。