大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
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。
相关课程
- sql-design
- orm-jpa
- mongo-documents — 嵌套文档 vs 关系拆表
练习
- 为
cf_track—cf_lesson—cf_exercise画 ER 图并标基数 - 说明
cf_progress为何需要(user_id, lesson_id)联合唯一 - 若「标签」与「课程」是多对多,中间表应有哪些列
小结
ER 图是表结构与 ORM 映射的蓝图。 下一课深入 JPA 与 Hibernate。