目录
🔗 什么是 Relationship?
关系(Relationship) 在 MySQL 中指的是 表与表之间的关联方式,用来反映现实世界中实体之间的联系。在数据库设计中,我们通过 主键(Primary Key) 和 外键(Foreign Key) 来实现这些关系。
三种基本关系类型(基于实体间的关系):
1. 一对一(One-to-One)
每一条记录在 A 表中只对应一条 B 表记录,反之亦然。
例子:一个人只有一个护照。
实现方式:在一个表中设置外键,且该字段设为
UNIQUE
。
CREATE TABLE Person (
person_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE Passport (
passport_id INT PRIMARY KEY,
person_id INT UNIQUE,
FOREIGN KEY (person_id) REFERENCES Person(person_id)
);
2. 一对多(One-to-Many)
A 表的一条记录对应 B 表的多条记录,但 B 表的每条记录只对应 A 表的一条。
例子:一个老师教授多个学生,但一个学生只由一个老师指导。
实现方式:在 “多” 的一方添加外键。
CREATE TABLE Teacher (
teacher_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE Student (
student_id INT PRIMARY KEY,
name VARCHAR(100),
teacher_id INT,
FOREIGN KEY (teacher_id) REFERENCES Teacher(teacher_id)
);
3. 多对多(Many-to-Many)
A 表的记录可以与 B 表多条记录关联,反之亦然。
例子:一个学生可以选多门课,一门课也有多个学生。
实现方式:用第三张中间表(交叉表,junction table) 进行关联。
CREATE TABLE Student (
student_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE Course (
course_id INT PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE StudentCourse (
student_id INT,
course_id INT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
🔚 总结
关系类型 | 特点 | 示例 |
---|---|---|
一对一 | 双方都唯一 | 人与身份证 |
一对多 | 一方唯一,多方可以重复 | 教师与学生 |
多对多 | 双方都可以多个 | 学生与课程 |
ERD 中的关系类型与表示法
ERD 中关系的核心是描述两个实体之间的“基数”(Cardinality)和“可选性”(Optionality)**,也就是:
一对几?
是否必须有这个关系?
1. One
含义: 每个实体 A 只关联一个实体 B。
常见形式: 一对一(1:1)
ERD 图形符号: 线上通常是直线 + 一竖杠
|
表示 “exactly one”例子: 每个人有一个身份证号。
2. Many
含义: 每个实体 A 可能关联多个实体 B。
常见形式: 一对多(1:N)或多对多(M:N)
ERD 图形符号: 线上是“三叉爪”或者英文
crow's foot
形状>
, 代表 “many”例子: 一位老师教授多个学生。
3. One and only one (+
)
含义: 实体 A 必须且只能 关联一个实体 B。
ERD 符号: 一竖线
|
(表示 one)+ 圆点(表示 required)对应数据库约束:
NOT NULL
+FOREIGN KEY
+UNIQUE
例子: 每个员工必须拥有一个工号。
4. Zero or one(0 +
)
含义: 实体 A 可以没有 也可以有一个 B。
ERD 符号: 圆圈
O
(表示 optional)+ 竖线|
(表示 one)对应数据库约束: 外键字段是
NULLABLE
例子: 一个顾客可以没有会员卡,最多只能有一个。
5. One or many(-
)
含义: 实体 A 必须至少有一个 B,可以有多个。
ERD 符号: 竖线
|
(表示 one)+ 三叉爪>
(表示 many)对应数据库约束: 不能为 NULL,且是一对多关系
例子: 每个订单必须包含至少一件商品。
6. Zero or many(-
)
含义: 实体 A 可以没有 也可以有多个 B。
ERD 符号: 圆圈
O
(表示 optional)+ 三叉爪>
(表示 many)对应数据库约束: 外键字段可空,允许多条记录
例子: 一个顾客可以下 0 个、1 个或多个订单。