【Mysql】多表关系设计

多表关系设计

实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系,接下来我们一起学习一下多表关系设计方面的知识
一对多关系(多见)
一对多关系(1:n)
•例如:班级和学生,部门和员工,客户和订单,分类和商品

一对多建表原则
•在从表(多方)创建一个字段,字段作为外键指向主表(一方)的主键
在这里插入图片描述

** 多对多关系(常见)**
多对多(m:n)
•例如:老师和学生,学生和课程,用户和角色
多对多关系建表原则
•需要创建第三张表,中间表中至少两个字段,这两个字段分别作为外键指向各自一方的 主键。
在这里插入图片描述

一对一关系(了解)
一对一(1:1)
•在实际的开发中应用不多.因为一对一可以创建成一张表。
一对一建表原则
•外键唯一 主表的主键和从表的外键(唯一),形成主外键关系,外键唯一 UNIQUE
在这里插入图片描述

设计 省&市表
1)分析: 省和市之间的关系是 一对多关系,一个省包含多个市
在这里插入图片描述

SQL实现

-- 创建省表 (主表,注意: 一定要添加主键约束)
CREATE TABLE province(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20),
    description VARCHAR(20)
);

-- 创建市表 (从表,注意: 外键类型一定要与主表主键一致)
CREATE TABLE city(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20),
    description VARCHAR(20),
    pid INT,
    -- 添加外键约束
    CONSTRAINT pro_city_fk FOREIGN KEY (pid) REFERENCES province(id)
);

查看表关系
在这里插入图片描述

设计 演员与角色表
1)分析: 演员与角色 是多对多关系, 一个演员可以饰演多个角色, 一个角色同样可以被不同的演员扮演
在这里插入图片描述

  1. SQL 实现
-- 创建演员表
CREATE TABLE actor(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);

-- 创建角色表
CREATE TABLE role(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(20)
);
 
-- 创建中间表
CREATE TABLE actor_role(
    -- 中间表自己的主键
    id INT PRIMARY KEY AUTO_INCREMENT,
    
    -- 指向actor 表的外键
    aid INT,
    -- 指向role 表的外键
    rid INT 
);
  1. 添加外键约束
-- 为中间表的aid字段,添加外键约束 指向演员表的主键
ALTER TABLE actor_role ADD FOREIGN KEY(aid) REFERENCES actor(id);

-- 为中间表的rid字段, 添加外键约束 指向角色表的主键
ALTER TABLE actor_role ADD FOREIGN KEY(rid) REFERENCES role(id);
  1. 查看表关系
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MySQL中,多对多关系可以通过使用中间表来实现。中间表是一个连接两个表的桥梁,其中包含两个外键,分别指向这两个表的主键。 例如,假设我们有两个表“学生”和“课程”,一个学生可以选择多个课程,一个课程也可以有多个学生,这是一个多对多关系。我们可以创建一个名为“选课”的中间表,其中包含学生ID和课程ID这两个外键。 CREATE TABLE student ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL ); CREATE TABLE course ( id INT NOT NULL PRIMARY KEY, name VARCHAR(50) NOT NULL ); CREATE TABLE student_course ( student_id INT NOT NULL, course_id INT NOT NULL, PRIMARY KEY (student_id, course_id), FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (course_id) REFERENCES course(id) ); 在这个例子中,中间表“student_course”包含两个外键“student_id”和“course_id”,分别引用学生表和课程表的主键。同时,我们使用“PRIMARY KEY (student_id, course_id)”来指定这两个外键作为联合主键,确保每个学生只能选择一次相同的课程。 当我们需要查询学生和他们所选的课程时,可以使用JOIN语句连接这三个表: SELECT s.name AS student_name, c.name AS course_name FROM student_course sc JOIN student s ON sc.student_id = s.id JOIN course c ON sc.course_id = c.id; 这个查询将返回所有学生以及他们所选的课程的名称。我们可以根据需要添加其他条件和过滤器,以实现更复杂的查询。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZikH~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值