当前位置: 首页 > ai >正文

设计一个食品种类表

在这里插入图片描述

需求:设计一个食品种类表,注意食品种类有多层,比如面食下面,面条、方便面,面条下有干面、湿面等

一、食品种类表结构设计(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)

二、设计优势解析

  1. 层级管理高效性
    邻接表模型:通过parent_id建立递归关系,支持无限层级扩展(如面食→面条→干面→手工干面)

路径字段辅助:path字段存储层级路径(如"1.3.5"),可通过LIKE快速查询子树(如查询所有面食子类:WHERE path LIKE ‘1.%’)

冗余层级字段:level字段避免递归计算层级深度,提升统计效率(如统计所有三级分类数量)

  1. 查询场景优化
-- 查询某分类所有子孙(含多级)
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)
  1. 数据维护便捷性
    .插入新分类:自动计算level和path(需触发器或程序处理)。
    .移动分类:更新parent_id后级联更新子节点path。
    .排序控制:order_num实现同层级人工排序(如让"方便面"显示在"面条"前面)

四、扩展优化建议

  1. MPTT预排序算法(高频查询场景)
    若需极速查询子树(如万级以上分类),可引入lft和rgt字段实现MPTT算法,将时间复杂度降至O(1)
ALTER TABLE food_category ADD (lft INT DEFAULT 0,rgt INT DEFAULT 0
);
-- 需配套维护程序更新左右值
http://www.xdnf.cn/news/2425.html

相关文章:

  • 【算法】回溯法
  • 【锂电池剩余寿命预测】Transformer锂电池剩余寿命预测(Pytorch完整源码和数据)
  • 攻击 WordPress 目标的 5 种方法
  • AtCoder Beginner Contest 242 G - Range Pairing Query (莫队)
  • 解锁现代生活的健康密码
  • 杨洋出席青岛啤酒白啤品牌活动 共赴生活美学之旅
  • 2025年应用物理与电子电气国际会议(IACSEM 2025)
  • 【Code Sprint】第一章 从零开始
  • 【Java学习笔记】类与对象
  • 前端零基础入门到上班:【Day8】JavaScript 基础语法入门
  • 【数据可视化-38】基于Plotly得泰坦尼克号数据集的多维度可视化分析
  • 给应用加速:Spring Boot集成缓存 (Caffeine Redis) 实战
  • Maven 依赖范围(Scope)详解
  • Spring Boot中@RequestParam、@RequestBody、@PathVariable的区别与使用
  • Servlet
  • AI如何重塑DDoS防护行业?六大变革与未来展望
  • 可以隐藏列的表格
  • spark 课程总结
  • 影楼精修-皮肤瑕疵祛除算法解析
  • 安卓基础(适配器和RecyclerView )
  • 富文本展示前使用DOMPurify进行文本过滤
  • T 电梯维修作业考试精选题目
  • AI大模型知识与医疗项目实践 - Java架构师面试实战
  • Haply MinVerse触觉3D 鼠标—沉浸式数字操作,助力 3D 设计与仿真
  • DeepSeek系列(10):与其他AI工具协同
  • 自然语言to SQL的评估
  • #苍穹外卖# (day 12)
  • 2025年大一ACM训练-搜索
  • 如何创建并使用极狐GitLab 部署令牌?
  • 特征工程四-1:自定义函数find_similar_docs查找最相似文档案例