苍穹外卖 数据库关系速查

6 阅读3分钟

来自苍穹外卖

一、各数据表含义与作用范围

表名中文名含义作用范围
employee员工表商家内部账号、状态与基础资料管理端:员工登录、账号启停与信息维护
category分类表菜品分类 / 套餐分类主数据管理端维护;C 端展示菜单时只读引用
dish菜品表单品主数据(名称、价、图、售卖状态等)管理端 CRUD;C 端浏览、加购、下单只读
dish_flavor菜品口味表某道菜下的口味名与可选值管理端随菜品维护;C 端选规格时只读
setmeal套餐表套餐主数据管理端 CRUD;C 端浏览、加购、下单只读
setmeal_dish套餐菜品关系表套餐包含哪些菜、各多少份(可含名称/单价冗余)管理端配置套餐;C 端一般不直接写
user用户表C 端用户(如微信 openid 锚点)C 端:登录/资料;与订单、地址、购物车关联
address_book地址表用户收货地址、默认地址C 端维护;下单时选中并快照到订单
shopping_cart购物车表待结算的菜品行或套餐行(按用户隔离)C 端加购、改数量、清空;提交订单后对应落 order_detail
orders订单表订单头:单号、用户、地址、金额、状态与时间轴C 端提交生成;管理端接单、派送、完成/取消;可与定时任务配合超时处理
order_detail订单明细表订单行:买的菜/套餐、数量、金额与下单时快照orders 同事务写入;查询订单详情时展开

二、全局 ER 图(简化字段版)

erDiagram
    employee {
        BIGINT id PK
        VARCHAR username
        VARCHAR name
        INT status
    }

    category {
        BIGINT id PK
        VARCHAR name
        INT type
        INT status
    }

    dish {
        BIGINT id PK
        VARCHAR name
        BIGINT category_id FK
        DECIMAL price
        INT status
    }

    dish_flavor {
        BIGINT id PK
        BIGINT dish_id FK
        VARCHAR name
        VARCHAR value
    }

    setmeal {
        BIGINT id PK
        VARCHAR name
        BIGINT category_id FK
        DECIMAL price
        INT status
    }

    setmeal_dish {
        BIGINT id PK
        BIGINT setmeal_id FK
        BIGINT dish_id FK
        INT copies
    }

    user {
        BIGINT id PK
        VARCHAR openid
        VARCHAR name
        VARCHAR phone
    }

    address_book {
        BIGINT id PK
        BIGINT user_id FK
        VARCHAR consignee
        VARCHAR phone
        TINYINT is_default
    }

    shopping_cart {
        BIGINT id PK
        BIGINT user_id FK
        BIGINT dish_id FK
        BIGINT setmeal_id FK
        INT number
        DECIMAL amount
    }

    orders {
        BIGINT id PK
        VARCHAR number
        BIGINT user_id FK
        BIGINT address_book_id FK
        INT status
        DECIMAL amount
    }

    order_detail {
        BIGINT id PK
        BIGINT order_id FK
        BIGINT dish_id FK
        BIGINT setmeal_id FK
        INT number
        DECIMAL amount
    }

    category ||--o{ dish : "id -> category_id"
    category ||--o{ setmeal : "id -> category_id"
    dish ||--o{ dish_flavor : "id -> dish_id"
    setmeal ||--o{ setmeal_dish : "id -> setmeal_id"
    dish ||--o{ setmeal_dish : "id -> dish_id"

    user ||--o{ address_book : "id -> user_id"
    user ||--o{ shopping_cart : "id -> user_id"
    user ||--o{ orders : "id -> user_id"
    address_book ||--o{ orders : "id -> address_book_id"
    orders ||--o{ order_detail : "id -> order_id"
    dish ||--o{ order_detail : "id -> dish_id"
    setmeal ||--o{ order_detail : "id -> setmeal_id"

三、逐条关系说明(字段对应 + 实际含义)

下面按“主表字段 -> 子表字段”描述每条关联的真实业务含义。

  1. category.id -> dish.category_id
    表示一个分类下可以有多个菜品。比如“热菜”分类下有宫保鸡丁、鱼香肉丝。
  2. category.id -> setmeal.category_id
    表示一个分类下可以有多个套餐。比如“商务套餐”分类下有 A 套餐、B 套餐。
  3. dish.id -> dish_flavor.dish_id
    表示一个菜品可以配置多个口味选项。比如“宫保鸡丁”对应“不辣/微辣/中辣”。
  4. setmeal.id -> setmeal_dish.setmeal_id
    表示一个套餐会包含多条套餐明细记录(每条明细是一种菜品及份数)。
  5. dish.id -> setmeal_dish.dish_id
    表示同一道菜可以被多个套餐复用。比如“米饭”可以出现在多个套餐里。
  6. user.id -> address_book.user_id
    表示一个用户可以维护多个收货地址;每个地址只属于该用户。
  7. user.id -> shopping_cart.user_id
    表示购物车记录按用户隔离;每个用户看到的是自己的购物车数据。
  8. user.id -> orders.user_id
    表示一笔订单归属某个用户;一个用户可以有多笔历史订单。
  9. address_book.id -> orders.address_book_id
    表示这笔订单使用了哪条地址记录作为收货地址(下单时选中的地址)。
  10. orders.id -> order_detail.order_id
    表示一笔订单对应多条明细行;每条明细是一种购买项及数量。
  11. dish.id -> order_detail.dish_id
    表示该明细行购买的是某道菜品(非套餐场景)。
  12. setmeal.id -> order_detail.setmeal_id
    表示该明细行购买的是某个套餐(套餐场景)。

说明:order_detailshopping_cart 同时有 dish_idsetmeal_id,实际使用时通常二选一,用来区分“这行是菜品还是套餐”。


参考

苍穹外卖www.bilibili.com/video/BV1TP…

数据库设计文档.md

deekseek-v4