下面通过一个综合案例加深对于多表关系的理解,并掌握多表设计的流程。
需求
步骤
阅读页面原型及需求文档,分析各个模块涉及到的表结构,及表结构之间的关系。
根据页面原型及需求文档,分析各个表结构中具体的字段及约束。
分析
页面原型-分类管理
分类的信息:分类名称、分类类型[菜品/套餐]、分类排序、分类状态[禁用/启用]、分类的操作时间(修改时间)。
页面原型-菜品管理
菜品的信息:菜品名称、菜品图片、菜品分类、菜品售价、菜品售卖状态、菜品的操作时间(修改时间)。
思考:分类与菜品之间是什么关系?
思考逻辑:一个分类下可以有多个菜品吗?反过来再想一想,一个菜品会对应多个分类吗?
答案:一对多关系。一个分类下会有多个菜品,而一个菜品只能归属一个分类。
设计表原则:在多的一方,添加字段,关联属于一这方的主键。
在菜品表设置一个外健 在关联分类表的主健
分类与菜品的关系 一对多
页面原型-套餐管理
套餐的信息:套餐名称、套餐图片、套餐分类、套餐价格、套餐售卖状态、套餐的操作时间。
思考:套餐与分类之间是什么关系?
思考逻辑:一个分类下可以有多个套餐吗?反过来再想一想,一个套餐品可以出现在多个分类中吗?
一对多关系。一个分类下会有多个套餐,而一个套餐只能归属一个分类。
设计表原则:在多的一方,添加字段,关联属于一这方的主键。
在套餐表设置一个外健 在关联分类表的主健
分类与套餐的关系 一对多
思考:套餐与菜品之间是什么关系?
思考逻辑:一个套餐下可以有多个菜品吗?反过来再想一想,一个菜品可以出现在多个套餐中吗?
答案:多对多关系。一个套餐下会有多个菜品,而一个菜品也可以出现在多个套餐中。
设计表原则:创建第三张中间表,建立两个字段分别关联菜品表的主键和套餐表的主键。
建立两个字段分别关联菜品表(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
分类表
菜品表
套餐表
套餐菜品关系表