先分清:ER 图强调概念,关系模式强调落表
ER 图主要表达实体、属性和联系;关系模式则要把这些内容落成表、字段、主键和外键。画 ER 图时,通常会标出实体的关键属性或标识属性;转成关系模式时,才更明确地写出主键、外键和字段列表。
所以不要把所有外键都强行画成 ER 图上的普通属性。比如客户和订单是一对多,ER 图上可以画客户、订单和它们之间的联系;转换成关系模式后,订单表里出现客户编号作为外键。这个客户编号来自转换规则,不是凭空多出来的字段。
| 对象 | ER 图里怎么体现 | 关系模式里怎么体现 |
|---|---|---|
| 实体 | 矩形或实体框 | 一张关系表 |
| 普通属性 | 属性节点或实体属性列表 | 表中的普通字段 |
| 标识属性 | 下划线或特别标注 | 主键或候选键 |
| 联系 | 菱形或关系线 | 外键或联系表 |
| 联系属性 | 附着在联系上 | 放入联系表或合适的多端表 |
主键标的是“唯一识别”,不是看起来像编号就行
主键用于唯一标识表中的每一行。学号、订单号、课程号这类字段常常是主键候选,但考试题里也可能出现组合主键,比如选课表中的学号和课程号共同标识一条选课记录。
如果一个字段只在局部范围内唯一,就不能单独当全局主键。比如订单明细的行号,只在同一订单内唯一,单独拿出来不能标识所有订单明细;它要和订单号组合起来,才可能形成主键。
标注时可以这样写
学生(学号, 姓名, 班级),主键:学号。
课程(课程号, 课程名, 学分),主键:课程号。
选课(学号, 课程号, 成绩),主键:(学号, 课程号),外键:学号、课程号。
订单明细(订单号, 行号, 商品编号, 数量),主键:(订单号, 行号)。
外键标的是“引用关系”,不是为了凑字段
外键的作用是维护参照完整性。订单表里的客户编号,必须能在客户表中找到对应客户;选课表里的学号,必须能在学生表中找到对应学生。它不是装饰字段,而是约束两个表之间的引用关系。
答题时如果只写表结构,不写外键,很容易丢掉关系信息。尤其是数据库设计下午题,老师更希望看到你知道哪个字段引用哪张表,而不是只罗列字段名。
| 关系 | 关系模式写法 | 外键说明 |
|---|---|---|
| 客户-订单 | 订单(订单号, 客户编号, 下单时间) | 客户编号引用客户表 |
| 学生-选课-课程 | 选课(学号, 课程号, 成绩) | 学号引用学生表,课程号引用课程表 |
| 部门-员工 | 员工(员工号, 姓名, 部门号) | 部门号引用部门表 |
| 订单-明细 | 订单明细(订单号, 行号, 商品编号) | 订单号引用订单表 |
属性标注最常见的四个坑
第一,把联系属性放错位置。成绩、数量、借阅日期这类属性常常属于联系,不要硬塞到任一实体表里。第二,漏掉组合主键。多对多联系表和弱实体表经常需要组合主键。第三,把外键当成普通属性,不说明引用关系。第四,把派生属性、多值属性处理得过于随意。
考试答题时,建议用比较朴素的格式写清楚:表名(字段1, 字段2, 字段3),主键是什么,外键引用哪里。不要为了追求形式漂亮,反而让阅卷人看不出你的关系约束。
相关题目解析
下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。
- 数据库表中的主键为什么不能重复也不能为空?主键 / 实体完整性
- 外键约束为什么能维护参照完整性?外键约束 / 参照完整性
- ER 图中的多对多联系转换成关系模式时怎么处理?ER 模型 / 多对多联系
- ER 图一对多联系转换成关系表时外键放在哪里?ER 图 / 关系模式转换