数据库表关系详解:一对一、一对多、多对多

文章目录

文章作者:当战神遇到编程

文章专栏:MySQL

欢迎大家点赞👍评论📝收藏⭐文章


表与表之间常见有 三种关系类型:

一对一(1 : 1)

一对多(1 : N)

多对多(M : N)

一: 一对一

含义:

一张表中的一条记录,只对应另一张表中的一条记录。

示例:

用户表 与 用户详情表

user(用户表)

id username
1 张三

user_info(详情表)

user_id 身份证号 地址
1 xxx 北京

说明:

  • 一个用户只有一份详情
  • 一份详情只属于一个用户

一对一 (1:1) 实现代码

核心要点 : 在从表的外键上添加 UNIQUE 约束,确保一个主表记录只能被引用一次。

sql 复制代码
-- 1. 创建用户主表
CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20)
);

-- 2. 创建用户详情表
CREATE TABLE user_info (
    -- user_id 既是外键,也必须是唯一的,从而实现 1:1
    user_id INT UNIQUE, 
    id_card VARCHAR(18),
    address VARCHAR(100),
    -- 建立外键关联
    FOREIGN KEY (user_id) REFERENCES user(id)
);

二、一对多(1 : N)

含义

一张表中的一条记录,对应另一张表中的多条记录。

示例

学院表 与 学生表

college(学院表)

id 学院名
1 计算机学院

student(学生表)

id 姓名 college_id
1001 张三 1
1002 李四 1

说明:

  • 一个学院有多个学生
  • 一个学生只属于一个学院

一对多 (1:N) 实现代码

核心要点: 外键直接建立在"多"的一方(学生表)即可,不需要加 UNIQUE。

sql 复制代码
-- 1. 创建学院表 (一)
CREATE TABLE college (
    id INT PRIMARY KEY AUTO_INCREMENT,
    college_name VARCHAR(20)
);

-- 2. 创建学生表 (多)
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    student_name VARCHAR(10),
    college_id INT, -- 外键列
    -- 多个学生可以关联同一个学院ID
    FOREIGN KEY (college_id) REFERENCES college(id)
);

三、多对多(M : N)

含义:

两张表中的多条记录彼此对应多条记录。

示例:

学生表 与 课程表

  • 一个学生可选多门课
  • 一门课可被多个学生选

student

id 姓名

course

id 课程名

student_course(中间表)

student_id course_id
1001 C01
1001 C02
1002 C01

多对多 (M:N) 实现代码

核心要点: 必须创建一个独立的中间表,用来存放两个表的主键关联。

sql 复制代码
-- 1. 创建学生表
CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(10)
);

-- 2. 创建课程表
CREATE TABLE course (
    id VARCHAR(10) PRIMARY KEY,
    course_name VARCHAR(20)
);

-- 3. 创建中间表 (选课表)
CREATE TABLE student_course (
    student_id INT,
    course_id VARCHAR(10),
    -- 建议:将两个外键设为联合主键,防止同一个学生重复选同一门课
    PRIMARY KEY (student_id, course_id),
    -- 分别建立外键关联
    FOREIGN KEY (student_id) REFERENCES student(id),
    FOREIGN KEY (course_id) REFERENCES course(id)
);

四、关系总结

关系类型 举例 实现方式
一对一 用户-详情 外键 + 唯一约束
一对多 学院-学生 多方加外键
多对多 学生-课程 建中间表

五、面试高频问题

问:为什么多对多要拆中间表?

关系型数据库无法直接表示多对多关系,需要通过第三张表拆解成两个一对多关系。

问:最常见的是哪种关系?

一对多最常见,例如部门与员工、分类与商品、用户与订单。

六:最终总结

表关系本质就是:通过主键和外键,让多张表协同存储数据,避免冗余,提高维护性。

相关推荐
迷枫71237 分钟前
【无标题】
数据库
TDengine (老段)1 小时前
TDengine 扫描算子 — TableScan、TagScan 与下推优化
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
放下华子我只抽RuiKe51 小时前
FastAPI 全栈后端(三):数据库与 ORM
前端·数据库·react.js·oracle·性能优化·前端框架·fastapi
BAGAE2 小时前
星链卫星数据获取:从太空安全到实时通信的技术革命
网络·数据结构·数据库·算法·云计算·hbase
zh_xuan2 小时前
Android导出并查看数据库
数据库·sqlite
小短腿的代码世界2 小时前
Qt定时器高精度架构:从QTimer源码到纳秒级定时调度
数据库·qt·架构
herinspace2 小时前
管家婆辉煌软件如何新增往来单位档案分类
服务器·数据库·电脑·管家婆软件
程序猿乐锅2 小时前
【MySQL | 第九篇】MySQL 存储过程
数据库·mysql
栗子~~2 小时前
金融场景下BigDecimal 运算规范 + 常用场景使用 + 数据库字段设计详解
java·数据库·金融
他们叫我技术总监2 小时前
Kettle(PDI)连接TDengine数据库实战:一个有趣的小现象
大数据·数据库·tdengine