桥接表详解

桥接表是解决多对多关系的标准方法,核心设计步骤:

  1. 创建基础表(如 student 和 course)。

  2. 创建桥接表(如 student_course_bridge),通过外键关联基础表。

  3. 在桥接表中存储额外关联信息(如成绩、时间等)。

实际应用场景

  • 用户与用户组的关联

  • 商品与多个标签的关联

  • 医生与患者的诊疗关系


以下是一个简单的桥接表示例,用 学生选课系统 的场景来说明桥接表的作用。


场景说明

  • 学生(Student)可以选修多门课程(Course)。

  • 一门课程(Course)也可以被多个学生选修。

  • 这是一个典型的 多对多关系,需要用桥接表(student_course_bridge)来管理学生和课程的关联关系。


1. 基础表设计

学生表(student)

存储学生基本信息:

CREATE TABLE student (
  student_id INT PRIMARY KEY,  -- 学生ID(自然键)
  name VARCHAR(50)             -- 学生姓名
);
student_id name
1 张三
2 李四
3 王五
课程表(course)

存储课程基本信息:

CREATE TABLE course (
  course_id INT PRIMARY KEY,   -- 课程ID(自然键)
  course_name VARCHAR(50)      -- 课程名称
);
course_id course_name
101 数学
102 英语
103 物理

2. 桥接表设计(student_course_bridge)

记录学生与课程的关联关系:

CREATE TABLE student_course_bridge (
  student_id INT,     -- 关联学生表
  course_id  INT,     -- 关联课程表
  score      DECIMAL(5,2),  -- 额外字段:学生在该课程的成绩
  PRIMARY KEY (student_id, course_id)  -- 联合主键
);
student_id course_id score
1 101 85.5
1 102 92.0
2 101 78.0
3 103 88.5

3. 桥接表的应用

场景1:查询某个学生选修的所有课程
SELECT 
  s.name AS 学生姓名,
  c.course_name AS 课程名称,
  b.score AS 成绩
FROM student s
JOIN student_course_bridge b ON s.student_id = b.student_id
JOIN course c ON b.course_id = c.course_id
WHERE s.name = '张三';

结果

学生姓名 课程名称 成绩
张三 数学 85.5
张三 英语 92.0

桥接表的优势

  1. 解决多对多关系
    避免在 student 或 course 表中冗余存储多个关联字段(如 student 表中不需要 course1, course2…)。

  2. 支持扩展字段
    桥接表可以存储额外信息(如 score),而无需污染基础表。

  3. 灵活查询
    支持双向查询(按学生查课程,按课程查学生)。

你可能感兴趣的:(#,数据库理论,数据库)