ER 模型
实体、关系、基数;cf_track/cf_lesson 实例。
30 分钟
ER 模型
ER 图(Entity-Relationship)在写 Java Entity 或 schema.sql 之前,先把「谁和谁什么关系」画清楚。CodeRoadMap 核心域:cf_track ↔ cf_lesson。
学习目标
- 识别实体、属性、关系
- 读懂 1—1、1—N、M—N 基数
- 把 ER 图落到表结构与 JPA 注解
本站核心 ER
┌─────────────┐ 1 N ┌─────────────┐
│ cf_track │───────────────────│ cf_lesson │
│ id (PK) │ │ id (PK) │
│ slug │ │ track_id FK│
│ title │ │ slug │
└─────────────┘ │ order_index│
└──────┬──────┘
│ 1
│ N
┌──────▼──────┐
│ cf_exercise │
└─────────────┘
cf_user ──< cf_progress >── cf_lesson
(M—N 通过关联表实现)
一门 Track 有多条 Lesson;用户 Progress 记录完成哪条课时——典型 1—N 与 M—N。
基数对照表
| 关系 | 表设计 | JPA |
|---|---|---|
| 1—N | 子表加 FK | @ManyToOne / @OneToMany |
| 1—1 | 任一侧 FK 或共享 PK | @OneToOne |
| M—N | 中间表 | @ManyToMany + @JoinTable |
cf_lesson.track_id 是 1—N 在「多」侧放外键 的标准做法。
落到 schema.sql
-- cf_track.id ← cf_lesson.track_id
FOREIGN KEY (track_id) REFERENCES cf_track(id) ON DELETE CASCADE
UNIQUE KEY uk_track_slug (track_id, slug)
uk_track_slug 保证同一课内 slug 唯一——ER 上的业务约束。
JPA 映射草图
@Entity @Table(name = "cf_track")
public class Track {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "track")
private List<Lesson> lessons;
}
@Entity @Table(name = "cf_lesson")
public class Lesson {
@ManyToOne @JoinColumn(name = "track_id")
private Track track;
}
详细注解见 sb-jpa。