CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
ORM 与数据库设计/课时/ER 模型
RawBlame
课时目录12 节

ORM 与数据库设计

  1. 01ORM 是什么
  2. 02范式与规范化
  3. 03ER 模型
  4. 04JPA 与 Hibernate
  5. 05MyBatis
  6. 06Spring Data 家族
  7. 07Schema 迁移
  8. 08N+1 与抓取策略
  9. 09MariaDB 与 MySQL
  10. 10ORM 与事务
  11. 11反模式
  12. 12综合练习

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。

相关课程

  • sql-design
  • orm-jpa
  • mongo-documents — 嵌套文档 vs 关系拆表

练习

  • 为 cf_track—cf_lesson—cf_exercise 画 ER 图并标基数
  • 说明 cf_progress 为何需要 (user_id, lesson_id) 联合唯一
  • 若「标签」与「课程」是多对多,中间表应有哪些列

小结

ER 图是表结构与 ORM 映射的蓝图。 下一课深入 JPA 与 Hibernate。

加载本节练习…
← 上一课范式与规范化下一课 →JPA 与 Hibernate