数据库设计 · ER图标注 · 主键外键属性

ER 图主键、外键和属性怎么标?

很多同学画 ER 图时,实体和联系大概能找出来,但一到主键、外键、属性标注就乱了:哪些要画在实体里?哪些要等转成关系模式后再体现?外键到底是不是 ER 图里的属性?这类问题本质上是在问:概念模型和关系模型怎么衔接。

数据库与软件设计专题 软考题库编辑部 持续更新

先分清:ER 图强调概念,关系模式强调落表

ER 图主要表达实体、属性和联系;关系模式则要把这些内容落成表、字段、主键和外键。画 ER 图时,通常会标出实体的关键属性或标识属性;转成关系模式时,才更明确地写出主键、外键和字段列表。

所以不要把所有外键都强行画成 ER 图上的普通属性。比如客户和订单是一对多,ER 图上可以画客户、订单和它们之间的联系;转换成关系模式后,订单表里出现客户编号作为外键。这个客户编号来自转换规则,不是凭空多出来的字段。

对象ER 图里怎么体现关系模式里怎么体现
实体矩形或实体框一张关系表
普通属性属性节点或实体属性列表表中的普通字段
标识属性下划线或特别标注主键或候选键
联系菱形或关系线外键或联系表
联系属性附着在联系上放入联系表或合适的多端表

主键标的是“唯一识别”,不是看起来像编号就行

主键用于唯一标识表中的每一行。学号、订单号、课程号这类字段常常是主键候选,但考试题里也可能出现组合主键,比如选课表中的学号和课程号共同标识一条选课记录。

如果一个字段只在局部范围内唯一,就不能单独当全局主键。比如订单明细的行号,只在同一订单内唯一,单独拿出来不能标识所有订单明细;它要和订单号组合起来,才可能形成主键。

标注时可以这样写

学生(学号, 姓名, 班级),主键:学号。

课程(课程号, 课程名, 学分),主键:课程号。

选课(学号, 课程号, 成绩),主键:(学号, 课程号),外键:学号、课程号。

订单明细(订单号, 行号, 商品编号, 数量),主键:(订单号, 行号)。

外键标的是“引用关系”,不是为了凑字段

外键的作用是维护参照完整性。订单表里的客户编号,必须能在客户表中找到对应客户;选课表里的学号,必须能在学生表中找到对应学生。它不是装饰字段,而是约束两个表之间的引用关系。

答题时如果只写表结构,不写外键,很容易丢掉关系信息。尤其是数据库设计下午题,老师更希望看到你知道哪个字段引用哪张表,而不是只罗列字段名。

关系关系模式写法外键说明
客户-订单订单(订单号, 客户编号, 下单时间)客户编号引用客户表
学生-选课-课程选课(学号, 课程号, 成绩)学号引用学生表,课程号引用课程表
部门-员工员工(员工号, 姓名, 部门号)部门号引用部门表
订单-明细订单明细(订单号, 行号, 商品编号)订单号引用订单表

属性标注最常见的四个坑

第一,把联系属性放错位置。成绩、数量、借阅日期这类属性常常属于联系,不要硬塞到任一实体表里。第二,漏掉组合主键。多对多联系表和弱实体表经常需要组合主键。第三,把外键当成普通属性,不说明引用关系。第四,把派生属性、多值属性处理得过于随意。

考试答题时,建议用比较朴素的格式写清楚:表名(字段1, 字段2, 字段3),主键是什么,外键引用哪里。不要为了追求形式漂亮,反而让阅卷人看不出你的关系约束。

相关题目解析

下面这些题目和本专题的判断方法关联较强,适合读完概念后回到具体题干里校验理解。