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

文章目录

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

文章专栏: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)
);

四、关系总结

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

五、面试高频问题

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

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

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

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

六:最终总结

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

相关推荐
脑子进水养啥鱼?2 小时前
PostgreSql CAST
数据库·postgresql
思麟呀2 小时前
Epoll的学习,在select和poll的基础上
网络·数据库·sql·学习·tcp/ip
zhangchaoxies2 小时前
c++怎么在Linux下获取文件被最后一次访问的精确纳秒时间【进阶】
jvm·数据库·python
m0_747854522 小时前
c++怎么在Linux下获取文件被最后一次访问的精确纳秒时间【进阶】
jvm·数据库·python
2301_816660212 小时前
如何用HTML函数工具检测当前设备性能_内置诊断操作【操作】
jvm·数据库·python
zhangchaoxies2 小时前
CSS如何实现移动端视口适配_利用rem与vw单位构建响应式布局
jvm·数据库·python
m0_747854522 小时前
如何创建CDB公共用户_C##前缀强制规则与CONTAINER=ALL
jvm·数据库·python
Absurd5872 小时前
SQL如何高效提取每组首条记录 ROW_NUMBER优化策略
jvm·数据库·python
2501_914245932 小时前
CSS如何更改鼠标悬停时的指针样式_设置cursor属性为pointer或not-allowed
jvm·数据库·python