多表设计 案例

下面通过一个综合案例加深对于多表关系的理解,并掌握多表设计的流程。

需求

  • 根据参考资料中提供的《苍穹外卖_管理后台》页面原型,设计分类管理、菜品管理、套餐管理模块的表结构。

步骤

  1. 阅读页面原型及需求文档,分析各个模块涉及到的表结构,及表结构之间的关系。

  2. 根据页面原型及需求文档,分析各个表结构中具体的字段及约束。

分析

  • 页面原型-分类管理

分类的信息:分类名称、分类类型[菜品/套餐]、分类排序、分类状态[禁用/启用]、分类的操作时间(修改时间)。

  • 页面原型-菜品管理

菜品的信息:菜品名称、菜品图片、菜品分类、菜品售价、菜品售卖状态、菜品的操作时间(修改时间)。

思考:分类与菜品之间是什么关系?

  • 思考逻辑:一个分类下可以有多个菜品吗?反过来再想一想,一个菜品会对应多个分类吗?

答案:一对多关系。一个分类下会有多个菜品,而一个菜品只能归属一个分类。

设计表原则:在多的一方,添加字段,关联属于一这方的主键。

在菜品表设置一个外健  在关联分类表的主健

分类与菜品的关系    一对多

  • 页面原型-套餐管理

套餐的信息:套餐名称、套餐图片、套餐分类、套餐价格、套餐售卖状态、套餐的操作时间。

思考:套餐与分类之间是什么关系?

  • 思考逻辑:一个分类下可以有多个套餐吗?反过来再想一想,一个套餐品可以出现在多个分类中吗?

一对多关系。一个分类下会有多个套餐,而一个套餐只能归属一个分类。

设计表原则:在多的一方,添加字段,关联属于一这方的主键。

在套餐表设置一个外健    在关联分类表的主健

分类与套餐的关系    一对多

思考:套餐与菜品之间是什么关系?

  • 思考逻辑:一个套餐下可以有多个菜品吗?反过来再想一想,一个菜品可以出现在多个套餐中吗?

答案:多对多关系。一个套餐下会有多个菜品,而一个菜品也可以出现在多个套餐中。

设计表原则:创建第三张中间表,建立两个字段分别关联菜品表的主键和套餐表的主键。

建立两个字段分别关联菜品表(dish_id)的主键和套餐表(setmal_id)的主键  

   在一个套餐下面可以很多菜品  比如有鱼香肉丝  宫保鸡丁等     一个套餐可以关联多个菜品

             一个菜品可以在不同的套餐下面   比如 鱼香肉丝一个菜品  可以包含在不同套餐里面     一个菜品也可以关联多个套餐  

所以是多对多的关系

分析页面原型及需求文档后,我们获得:

  • 分类表

    • 业务字段:分类名称、分类类型、分类排序、分类状态

    • 基础字段:id(主键)、分类的创建时间、分类的修改时间

  • 菜品表

    • 业务字段:菜品名称、菜品图片、菜品分类、菜品售价、菜品售卖状态

    • 基础字段:id(主键)、分类的创建时间、分类的修改时间

  • 套餐表

    • 业务字段:套餐名称、套餐图片、套餐分类、套餐价格、套餐售卖状态

    • 基础字段:id(主键)、分类的创建时间、分类的修改时间

表结构之间的关系:

  • 分类表 - 菜品表 : 一对多

    • 在菜品表中添加字段(菜品分类),关联分类表

  • 菜品表 - 套餐表 : 多对多

    • 创建第三张中间表(套餐菜品关联表),在中间表上添加两个字段(菜品id、套餐id),分别关联菜品表和分类表

表结构

分类表:category

  • 业务字段:分类名称、分类类型、分类排序、分类状态

  • 基础字段:id(主键)、创建时间、修改时间

-- 分类表
create table category
(
    id          int unsigned primary key auto_increment comment '主键ID',
    name        varchar(20)      not null unique comment '分类名称',
    type        tinyint unsigned not null comment '类型 1 菜品分类 2 套餐分类',
    sort        tinyint unsigned not null comment '顺序',
    status      tinyint unsigned not null default 0 comment '状态 0 禁用,1 启用',
    create_time datetime         not null comment '创建时间',
    update_time datetime         not null comment '更新时间'
) comment '菜品及套餐分类';

菜品表:dish

  • 业务字段:菜品名称、菜品图片、菜品分类、菜品售价、菜品售卖状态

  • 基础字段:id(主键)、分类的创建时间、分类的修改时间

-- 菜品表
create table dish
(
    id          int unsigned primary key auto_increment comment '主键ID',
    name        varchar(20)      not null unique comment '菜品名称',
    category_id int unsigned     not null comment '菜品分类ID',   -- 逻辑外键
    price       decimal(8, 2)    not null comment '菜品价格',
    image       varchar(300)     not null comment '菜品图片',
    description varchar(200) comment '描述信息',
    status      tinyint unsigned not null default 0 comment '状态, 0 停售 1 起售',
    create_time datetime         not null comment '创建时间',
    update_time datetime         not null comment '更新时间'
) comment '菜品'; 

套餐表:setmeal

  • 业务字段:套餐名称、套餐图片、套餐分类、套餐价格、套餐售卖状态

  • 基础字段:id(主键)、分类的创建时间、分类的修改时间

-- 套餐表
create table setmeal
(
    id          int unsigned primary key auto_increment comment '主键ID',
    name        varchar(20)      not null unique comment '套餐名称',
    category_id int unsigned     not null comment '分类id',       -- 逻辑外键
    price       decimal(8, 2)    not null comment '套餐价格',
    image       varchar(300)     not null comment '图片',
    description varchar(200) comment '描述信息',
    status      tinyint unsigned not null default 0 comment '状态 0:停用 1:启用',
    create_time datetime         not null comment '创建时间',
    update_time datetime         not null comment '更新时间'
) comment '套餐'; 

套餐菜品关联表:setmeal_dish

-- 套餐菜品关联表
create table setmeal_dish
(
    id         int unsigned primary key auto_increment comment '主键ID',
    setmeal_id int unsigned     not null comment '套餐id ',    -- 逻辑外键
    dish_id    int unsigned     not null comment '菜品id',     -- 逻辑外键
    copies     tinyint unsigned not null comment '份数'
) comment '套餐菜品关联表'; 

图形化

主建约束Primary  key      主建自增Auto inc       默认值:Default

无符号:unsigned          唯一约束(不可重复):Unique       必填:Not null

分类表  

 

菜品表      

套餐表

套餐菜品关系表

 

  • 26
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值