任务二 概念结构设计
一、概念结构设计是什么
概念结构设计是在需求分析之后,将现实世界的业务需求转换为一种独立于任何数据库管理系统的高级数据模型的过程。
简单说:把业务需求“翻译”成一张“实体关系图”(E-R图),让所有相关人员(业务人员、开发人员、管理者)都能看懂并达成共识。
概念结构设计是数据库设计的第二阶段,也是最核心、最关键的一步。
二、核心目标
- 真实反映现实世界:准确表达业务中的实体、属性、联系及其约束。
- 易于理解:用直观的图形化语言(E-R图)作为沟通工具。
- 易于更改:当业务需求变化时,能方便地修改。
- 独立于技术:完全不考虑具体用什么数据库(Oracle、MySQL等),也不考虑物理存储细节。
三、产出物:E-R图(实体-联系图)
概念结构设计的主要成果就是E-R图
1.概念
E-R 图全称是实体-联系图(Entity-Relationship Diagram),是数据库概念结构设计阶段的核心工具,用来可视化地抽象描述现实世界中的事物、事物的特征,以及事物之间的关联关系。
2.核心组成元素
E-R图包含三个核心要素:
| 要素 | 含义 | 表示方式 | 对应“学生课程成绩”示例 |
|---|---|---|---|
| 实体 | 现实中客观存在的事物(如学生、课程) | 矩形 实体的唯一标识(主键/码)会用下划线标注 | 学生、课程、班级 |
| 属性 | 实体的特征(如学生的学号、姓名) | 椭圆形 通过线段与对应的实体相连。 | 学生的学号、姓名、性别;课程的课程号、课程名 |
| 联系 | 实体之间的关联(如学生选课程) | 菱形 通过线段与关联的实体相连,并标注联系的类型(1:1、1:n、m:n)。 | 学生与课程的“选课”联系;学生与班级的“归属”联系 |
3. 联系:实体与实体之间的关系
- 表示:菱形,用无向边连接相关实体,并标注联系类型
- 联系类型:
- 1:1(一对一):一个实体最多对应另一个实体的一个实例(如“班级”和“班长”,一个班级只有1个班长,一个班长只属于1个班级)。
- 1:n(一对多):一个实体可以对应另一个实体的多个实例(如“班级”和“学生”,一个班级有多个学生,一个学生只属于1个班级)。
- m:n(多对多):两个实体之间可以互相对应多个实例(如“学生”和“课程”,一个学生可以选多门课,一门课可以被多个学生选)。
4.作用
它是连接“现实需求”与“数据库模型”的桥梁:
- 沟通工具:让技术人员和业务人员能直观理解数据结构和业务关系,减少沟通偏差。
- 设计基础:是后续将概念模型转换为关系模式(逻辑设计)的直接依据。
- 抽象工具:屏蔽了数据库的技术细节,专注于描述业务本质。
5、以E-R模型为例的设计步骤
采用E-R方法进行概念结构设计,通常分为三步:
- 设计局部E-R图:明确各部门的实体、属性、实体间联系及信息约束,形成用户的局部视图。
- 设计全局E-R图:将多个局部视图整合、合并,形成能完整描述现实世界的全局视图。
- 优化全局E-R图:消除冗余、调整结构,提升模型的简洁性与合理性。
四、概念结构设计的详细步骤(四步法)
步骤1:数据抽象,识别实体
- 方法:从需求说明中找出所有“名词”或“核心对象”
- 筛选原则:该对象是否需要独立存储信息?
- 例子(在线商城需求):
需求描述:“客户下单购买商品,订单包含商品明细...”
识别出的实体:`客户`、`订单`、`商品`、`订单明细`
步骤2:定义实体属性,确定主键
- 为每个实体列出所有需要存储的属性
- 选择主键:能唯一标识实体的属性(如:订单号、身份证号)
- 属性分类:
- 简单属性 vs 复合属性:地址可分为省、市、街道
- 单值属性 vs 多值属性:电话号码(一个人可能有多个)
- 派生属性:年龄(可从出生日期计算得出)
步骤3:识别实体间的联系
- 分析业务规则,确定实体如何关联
- 关键问题:
问:一个客户可以下多个订单吗? 答:可以 → 客户与订单是1:n
问:一个订单可以包含多个商品吗?答:可以 → 订单与商品是m:n
问:一个员工只能有一个工位吗? 答:是 → 员工与工位是1:1 - 联系的属性:有些联系本身也有属性
- 例如:
学生与课程之间的选课联系,有属性“成绩”
- 例如:
步骤4:绘制E-R图,评审优化
- 将以上分析结果图形化
- 评审会议:与业务人员确认E-R图是否正确反映了业务
- 优化:消除冗余、合并相似实体、检查完整性
五、为什么这是最关键的一步?
- 沟通的桥梁:是技术人员和业务人员都能理解的“共同语言”
- 错误的早期发现:70%的数据库设计错误在此阶段就能发现和纠正
- 稳定的基础:好的概念结构能适应未来业务变化,减少后续修改
- 决定设计质量:直接决定了数据库是否易于使用、维护和扩展
常见陷阱提醒:
- ❌ 过早考虑主键是自增ID还是UUID(这是逻辑设计的事)
- ❌ 担心数据量太大要分表分库(这是物理设计的事)
- ❌ 纠结用MySQL还是PostgreSQL(这完全是技术选型)
- ✅ 应专注于:业务实体是否完整?关系是否正确?约束是否合理?
六、总结
概念结构设计的本质:做一次彻底的“业务建模”,用E-R图这张“业务地图”确保所有人对“系统要管理什么以及它们如何关联”达成一致共识。
这是数据库设计过程中最有创造性、最需要业务理解的一步,也是后续所有技术工作的坚实基石。做好了这一步,后续的逻辑设计和物理设计就会水到渠成;做不好,整个数据库系统就可能根基不稳,频繁返工。
七、案例:图书馆管理系统
需求描述(简化):
- 图书馆有图书,每本书有唯一编号
- 读者可以借阅多本图书,每本图书一次只能被一个读者借阅
- 需要记录借书日期和应还日期
- 读者有类别(如学生、教师),不同类别借书数量上限不同
概念结构设计过程:
步骤1:识别实体
图书读者读者类别(业务规则需要独立管理)
步骤2:定义属性
图书:图书编号、书名、作者、出版社、库存数量读者:读者卡号、姓名、电话、注册日期读者类别:类别ID、类别名称、最大借书量、借期天数
步骤3:识别联系
读者属于读者类别→ 多对一(n:1),因为多个读者属于同一类别读者借阅图书→ 一对多(1:n),因为一个读者可借多本书,但一本书同一时间只能被一个读者借(不考虑副本)借阅联系本身的属性:借书日期、应还日期、实际归还日期
步骤4:绘制E-R图
[读者类别] [读者]
| |
|(1个类别包含n个读者) |
|<——————————————属于—————————|
| |
| | 借阅 (1:n)
| |—————→ [图书]
| |
| |
(属性:类别ID, 名称, 最大借书量...) (属性:图书编号, 书名, 作者...)
[借阅联系属性]
借书日期、应还日期
八、案例:学生选课系统
核心前提
绘制E-R图的唯一依据是需求分析的结果(数据字典/需求清单),不凭空创造实体/属性,确保所有内容都贴合用户实际需求。 绘图规范(必记):
- 实体 → 矩形框,框内写实体名;
- 属性 → 椭圆形框,框内写属性名,主键属性加下划线;
- 联系 → 菱形框,框内写联系名;
- 无向直线连接:实体↔联系、实体↔属性;
- 联系与实体的连线上,*标注联系类型(1:1/1:n/m:n,n也可写)**。
步骤1:前期准备
目标:从需求中提取核心信息
操作要点
- 从需求分析文档中,筛选出需要存储的核心数据,排除「操作/过程/动作」(如“查询成绩”“录入信息”是操作,不是数据);
- 整理成「需要存什么事物+事物有什么特征+事物之间有什么关联」的简易清单,避免遗漏。
示例(学生课程成绩场景)
需求核心清单:
- 要存:学生、班级、课程的信息,以及学生选课程的成绩;
- 关联:学生属于班级,学生选择课程,班级有班主任;
- 约束:一个班级有多个学生,一个学生选多门课,一门课被多个学生选。
步骤2:抽象核心实体
目标:提取“客观存在的事物”
操作要点
- 实体是现实中客观存在、可区分的事物(人/物/抽象概念),一个独立的事物对应一个实体,不重复、不合并;
- 给每个实体起简洁唯一的名称(中文,忌拼音/英文),并从属性中确定主键(码)(能唯一标识实体的属性,一个实体只有一个主键);
- 排除干扰项:动作、过程、状态不能作为实体(如“成绩查询”“选课操作”不是实体)。
示例(学生课程成绩场景)
提取3个核心实体,标注主键(高考要求必须标):
- 学生(主键:学号)→ 唯一标识:学号;
- 班级(主键:班级名)→ 唯一标识:班级名;
- 课程(主键:课程号)→ 唯一标识:课程号。
步骤3:提取实体属性
目标:给每个实体“加特征”(忌冗余)
操作要点
- 属性是实体的固有特征,一个属性只能归属一个实体,不跨实体重复(如“班主任”是班级的属性,不是学生的);
- 每个实体的属性包含主键属性+普通属性,主键必须加下划线(高考绘图得分点);
- 排除冗余属性:如果一个属性能通过其他属性推导出来,不单独作为属性(如“学生年龄”可通过出生日期推导,无需存);
- 属性名简洁,忌模糊(如“姓名”而非“学生的名字”)。
示例(学生课程成绩场景)
按「实体→主键属性→普通属性」整理,主键加下划线:
- 学生:
$\underline{学号}$、姓名、性别、专业; - 班级:
$\underline{班级名}$、班主任; - 课程:
$\underline{课程号}$、课程名、课时。
步骤4:定义实体间的联系
目标:判断类型+标联系名+加联系属性
操作要点
- 先定联系名:用动词/动宾短语表示实体间的关联(如“归属”“选课”“任教”),简洁易懂;
- 再判联系类型(高考选择题/绘图题必考,3种核心类型):
- 1:1(一对一):一个A实体对应至多一个B实体,一个B实体对应至多一个A实体(如班级-班长);
- 1:n(一对多/多对一):一个A实体对应多个B实体,一个B实体对应至多一个A实体(核心,考频最高);
- m:n(多对多):一个A实体对应多个B实体,一个B实体对应多个A实体(核心,绘图必考); ✅ 判断技巧:用“一个XX能有几个YY,一个YY能有几个XX”造句,直接得出类型;
- 最后加联系属性:如果实体间的关联本身有特征,这个特征既不属于A也不属于B,作为联系的属性(高考绘图得分点)。
示例(学生课程成绩场景)
逐一对实体组合定义联系,造句判断类型:
- 学生 ↔ 班级
- 造句:一个班级能有多个学生,一个学生只能属于一个班级 → 类型:1:n(班级1,学生n);
- 联系名:归属;
- 无联系属性(“归属”这个关联无额外特征)。
- 学生 ↔ 课程
- 造句:一个学生能选多门课程,一门课程能被多个学生选 → 类型:m:n;
- 联系名:选课;
- 联系属性:成绩(“选课”的结果是有成绩,成绩既不属于学生也不属于课程,是联系的属性)。
步骤5:绘制基础E-R图
操作要点
- 按「实体(矩形)、联系(菱形)、属性(椭圆形)」的图形规范绘制,布局合理(避免线条交叉);
- 无向直线连接:实体↔联系、实体↔自身属性、联系↔自身属性;
- 必标注内容:联系类型(标在实体与联系的连线上)、主键下划线、所有名称/属性不遗漏;
- 同一实体/属性/联系只出现一次(忌重复绘制)。
示例(学生课程成绩场景·基础E-R图文字版)
┌──────────┐ ┌──────────┐
│ 学生(矩)│ │ 班级(矩)│
│$\underline{学号}$│ │$\underline{班级名}$│
│ 姓名 │◄───────┤ 班主任 │
│ 性别 │ 归属 │ │
│ 专业 │ 1:n │ │
└────┬─────┘ └──────────┘
│
│ 选课(菱)
│ m:n
│┌────────┐
└┤ 成绩(椭)
│└────────┘
│
┌────▼─────┐
│ 课程(矩)│
│$\underline{课程号}$│
│ 课程名 │
│ 课时 │
└──────────┘
(注:手绘/考试绘制时,矩形/椭圆形/菱形框画标准,线条笔直,标注清晰即可)
九、案例:图书管理系统
说明:1:n + m:n 组合
场景核心需求
- 存储读者(学号/读者号、姓名、性别、联系方式)、图书(书号、书名、作者、出版社、库存)、图书类别(类别号、类别名、描述)信息;
- 关联规则:一个图书类别包含多本图书,一本图书只属于一个类别;一个读者可借阅多本图书,一本图书可被多个读者借阅;
- 借阅关联有专属特征:借阅日期、归还日期、是否归还。
核心设计要点(高考考点)
- 覆盖1:n(类别-图书)和m:n(读者-图书) 两种核心联系,m:n联系带多个联系属性(高考绘图得分点);
- 三个实体均标注唯一主键,无冗余属性;
- “借阅日期/归还日期/是否归还”是联系的属性(非读者/图书的属性),归属准确。
规范E-R图(文字版)
┌────────────────┐ ┌────────────────┐
│ 图书类别(矩形)│ │ 读者(矩形)│
│$\underline{类别号}$│ │$\underline{读者号}$│
│ 类别名 │◄───────┤ 姓名 │
│ 描述 │ 包含 │ 性别 │
└────────┬───────┘ 1:n │ 联系方式 │
│ └────────┬─────┘
│ │
│ │ 借阅(菱形)
│ │ m:n
│ │┌────────────┐
│ ├┤ 借阅日期(椭圆)│
│ ├┤ 归还日期(椭圆)│
│ └┤ 是否归还(椭圆)│
┌────────▼───────┐ │
│ 图书(矩形)│ │
│$\underline{书号}$│◄─────────────────┘
│ 书名 │
│ 作者 │
│ 出版社 │
│ 库存 │
└────────────────┘
十、案例:商场购物系统
说明:纯m:n 核心,侧重多属性+多实体关联
场景核心需求
- 存储顾客(顾客号、姓名、电话、地址)、商品(商品号、商品名、单价、库存)、收银员(员工号、姓名、工号、所属柜台)信息;
- 关联规则:一个顾客可购买多种商品,一种商品可被多个顾客购买;一个收银员可接待多个顾客,一个顾客一次消费仅由一个收银员接待;
- 购买关联有专属特征:购买数量、交易金额、购买日期。
核心设计要点(高考考点)
- 重点考查m:n(顾客-商品) 核心联系,同时搭配1:n(收银员-顾客) 辅助联系;
- 联系属性包含数值型(购买数量/交易金额)+ 日期型(购买日期),贴合实际业务;
- 实体属性无冗余,如“所属柜台”是收银员的属性,不重复设计。
规范E-R图(文字版)
┌────────────────┐ ┌────────────────┐
│ 收银员(矩形)│ │ 顾客(矩形)│
│$\underline{员工号}$│ │$\underline{顾客号}$│
│ 姓名 │◄───────┤ 姓名 │
│ 工号 │ 接待 │ 电话 │
│ 所属柜台 │ 1:n │ 地址 │
└────────────────┘ └────────┬─────┘
│
│ 购买(菱形)
│ m:n
│┌────────────┐
├┤ 购买数量(椭圆)│
├┤ 交易金额(椭圆)│
└┤ 购买日期(椭圆)│
│
┌────────────────┐ │
│ 商品(矩形)│◄─────────────────┘
│$\underline{商品号}$│
│ 商品名 │
│ 单价 │
│ 库存 │
└────────────────┘
十一、案例:员工考勤管理系统
说明:1:1 + 1:n 组合
场景核心需求
- 存储员工(员工号、姓名、性别、部门、职位)、考勤机(机器号、位置、型号、状态)、考勤记录(无独立实体,为关联特征)信息;
- 关联规则:一个部门有多个员工,一个员工只属于一个部门(1:n);一个员工对应一台考勤机,一台考勤机只绑定一个员工(1:1,专属打卡);
- 打卡关联有专属特征:打卡日期、打卡时间、打卡类型(上班/下班)。
核心设计要点(高考考点)
- 覆盖1:1(员工-考勤机)和1:n(部门-员工) 两种基础联系,是高考客观题+绘图题的基础必考类型;
- 1:1联系的标注规范(连线上标1:1,无n/*);
- 无独立的“考勤记录”实体,将其特征作为联系属性,简化设计(避免冗余实体,高考实操得分点)。
规范E-R图(文字版)
┌────────────────┐
│ 部门(矩形)│
│$\underline{部门号}$│
│ 部门名 │
│ 部门经理 │
└────────┬───────┘
│
│ 归属 1:n
│
┌────────▼───────┐ ┌────────────────┐
│ 员工(矩形)│ │ 考勤机(矩形)│
│$\underline{员工号}$│ │$\underline{机器号}$│
│ 姓名 │◄───────┤ 位置 │
│ 性别 │ 打卡 │ 型号 │
│ 职位 │ 1:1 │ 状态 │
└────────┬───────┘ └────────────────┘
│
│ 打卡(菱形)
│┌────────────┐
├┤ 打卡日期(椭圆)│
├┤ 打卡时间(椭圆)│
└┤ 打卡类型(椭圆)│