设计一个食品种类表
需求:设计一个食品种类表,注意食品种类有多层,比如面食下面,面条、方便面,面条下有干面、湿面等
一、食品种类表结构设计(food_category)
CREATE TABLE food_category (category_id INT IDENTITY(1,1) PRIMARY KEY, -- 分类ID(自增主键)category_name VARCHAR(50) NOT NULL UNIQUE, -- 分类名称(唯一约束)parent_id INT DEFAULT NULL, -- 父级分类ID(NULL表示顶级)level TINYINT DEFAULT 1, -- 层级(1-顶级,2-二级,依此类推)path VARCHAR(200) DEFAULT '', -- 层级路径(如"1.3.5")order_num INT DEFAULT 0, -- 排序序号(同层级内排序)create_time TIMESTAMP DEFAULT SYSDATE -- 创建时间
);-- 外键约束
ALTER TABLE food_category ADD CONSTRAINT fk_parent FOREIGN KEY (parent_id) REFERENCES food_category(category_id);-- 索引优化
CREATE INDEX idx_parent ON food_category(parent_id); -- 父ID查询优化
CREATE INDEX idx_path ON food_category(path); -- 路径查询优化 [9](@ref)
二、设计优势解析
- 层级管理高效性
邻接表模型:通过parent_id建立递归关系,支持无限层级扩展(如面食→面条→干面→手工干面)
路径字段辅助:path字段存储层级路径(如"1.3.5"),可通过LIKE快速查询子树(如查询所有面食子类:WHERE path LIKE ‘1.%’)
冗余层级字段:level字段避免递归计算层级深度,提升统计效率(如统计所有三级分类数量)
- 查询场景优化
-- 查询某分类所有子孙(含多级)
SELECT * FROM food_category
WHERE path LIKE '1.%' ORDER BY path; -- 示例:查找"面食"(ID=1)下所有子类-- 查询直接子分类
SELECT * FROM food_category
WHERE parent_id = 1 ORDER BY order_num DESC; -- 示例:查找"面食"的直接子类-- 查询分类完整路径
SELECT c1.category_name AS lv1, c2.category_name AS lv2, c3.category_name AS lv3
FROM food_category c3
LEFT JOIN food_category c2 ON c3.parent_id = c2.category_id
LEFT JOIN food_category c1 ON c2.parent_id = c1.category_id
WHERE c3.category_id = 5; -- 示例:显示"干面"的路径"面食→面条→干面" [9](@ref)
- 数据维护便捷性
.插入新分类:自动计算level和path(需触发器或程序处理)。
.移动分类:更新parent_id后级联更新子节点path。
.排序控制:order_num实现同层级人工排序(如让"方便面"显示在"面条"前面)
四、扩展优化建议
- MPTT预排序算法(高频查询场景)
若需极速查询子树(如万级以上分类),可引入lft和rgt字段实现MPTT算法,将时间复杂度降至O(1)
ALTER TABLE food_category ADD (lft INT DEFAULT 0,rgt INT DEFAULT 0
);
-- 需配套维护程序更新左右值