ER 模型与数据建模
问题
什么是 ER 模型?如何进行数据建模?
答案
ER 模型基本概念
ER(Entity-Relationship)模型是描述实体及其关系的方法,是数据库设计的基础。
| 概念 | 说明 | 示例 |
|---|---|---|
| 实体(Entity) | 业务中可识别的对象 | 用户、订单、商品 |
| 属性(Attribute) | 实体的特征 | 用户名、手机号 |
| 关系(Relationship) | 实体之间的关联 | 用户「下」订单 |
三大关系类型
| 关系 | 符号 | 示例 |
|---|---|---|
| 一对一(1:1) | 1 --- 1 | 用户 ↔ 身份证 |
| 一对多(1:N) | 1 --- N | 部门 ↔ 员工 |
| 多对多(M:N) | M --- N | 学生 ↔ 课程(中间表) |
三大范式
| 范式 | 规则 | 违反示例 |
|---|---|---|
| 1NF | 字段不可再分 | 地址字段存 "省+市+区" |
| 2NF | 非主键完全依赖主键 | 订单明细中存商品名称 |
| 3NF | 消除传递依赖 | 员工表中存部门名称 |
范式 vs 反范式
- OLTP(业务系统):遵循 3NF,减少冗余
- OLAP(分析系统):适当反范式,用冗余换性能
常见面试问题
Q1: 为什么数仓中允许冗余?
答案:
- 数仓以查询性能为目标,JOIN 开销大
- 适当冗余(如维度字段冗余到事实表)可以减少 JOIN
- 数仓写入频率低(ETL 批量写入),冗余不会导致更新异常
Q2: 多对多关系如何建模?
答案:
- 引入中间表(关联表),存储两个实体的外键
- 例如学生-课程:
student_course(student_id, course_id, grade)