002-数据模型与E-R模型
难度:🟢 | 预计时间:90分钟 | 前置:001-数据库系统概述
学习目标
- 理解数据模型的概念和分类体系
- 掌握实体-联系(E-R)模型的基本概念和表示方法
- 学会使用E-R图进行数据库概念设计
- 了解E-R模型向关系模型的转换规则
- 能够独立完成简单系统的E-R建模
数据模型概述
数据模型的定义
数据模型(Data Model) 是对现实世界数据特征的抽象,用来描述数据、组织数据和对数据进行操作的方法。它是数据库系统的核心和基础。
数据模型的组成要素
数据模型通常由三个部分组成:
1. 数据结构
- 静态特性:描述数据对象的类型、内容、性质
- 动态特性:描述数据对象实例之间的联系
2. 数据操作
- 检索操作:查询满足条件的数据
- 更新操作:插入、删除、修改数据
3. 数据约束
- 完整性约束:保证数据的正确性和一致性log、
- 安全性约束:保护数据不被非法访问
数据模型的分类
按抽象层次分类
| 层次 | 模型类型 | 特点 | 应用场景 | 代表 |
|---|---|---|---|---|
| 概念层 | 概念数据模型 | 面向用户、易理解 | 需求分析、概念设计 | E-R模型、UML |
| 逻辑层 | 逻辑数据模型 | 面向DBMS、可实现 | 逻辑设计、物理设计 | 关系模型、面向对象模型 |
| 物理层 | 物理数据模型 | 面向存储、高效率 | 物理实现 | 存储结构、访问路径 |
按数据结构分类
实体-联系(E-R)模型
E-R模型基本概念
实体-联系模型(Entity-Relationship Model) 是由Peter Chen于1976年提出的概念数据模型,用于数据库概念设计。
核心概念
1. 实体(Entity)
定义:客观存在并可相互区别的事物称为实体。
特点:
- 具有独立存在的意义
- 可以被唯一标识
- 具有一组描述性质的属性
示例:
- 一个具体的学生(张三)
- 一门具体的课程(数据库原理)
- 一次具体的选课行为
2. 实体集(Entity Set)
定义:同一类型实体的集合称为实体集。
示例:
- 学生实体集:所有学生的集合
- 课程实体集:所有课程的集合
- 选课实体集:所有选课记录的集合
3. 属性(Attribute)
定义:实体所具有的某一特性称为属性。
属性分类:
4. 联系(Relationship)
定义:实体之间的相互关系称为联系。
联系的度数:
- 一元联系:同一实体集内部的联系
- 二元联系:两个实体集之间的联系(最常见)
- 三元联系:三个实体集之间的联系
- n元联系:n个实体集之间的联系
联系的类型:
| 联系类型 | 符号表示 | 含义 | 示例 |
|---|---|---|---|
| 一对一 | 1:1 | 一个实体最多与另一个实体相关联 | 学生-学生证 |
| 一对多 | 1:n | 一个实体可与多个实体相关联 | 班级-学生 |
| 多对多 | m:n | 多个实体可与多个实体相关联 | 学生-课程 |
E-R图表示法
基本图形符号
完整E-R图示例
以学生选课系统为例:
E-R建模过程
建模步骤
详细建模方法
1. 需求分析
- 理解业务流程
- 收集数据需求
- 明确系统边界
2. 识别实体
识别原则:
- 名词通常对应实体
- 具有独立意义的概念
- 需要存储信息的对象
示例分析:
“学生可以选修多门课程,每门课程由一位教师授课,学生选课后会有成绩记录。”
识别结果:
- 实体:学生、课程、教师
- 联系实体:选课(学生-课程的多对多联系)
3. 确定属性
属性识别原则:
- 描述实体特征的数据项
- 原子性:不可再分
- 单值性:一个属性对应一个值(除多值属性外)
键属性选择:
- 唯一性:能唯一标识实体
- 最小性:去掉任何一个属性都不能唯一标识
- 稳定性:值不经常变化
4. 确定联系
联系识别方法:
- 动词通常表示联系
- 分析实体间的业务关系
- 确定联系的类型(1:1, 1:n, m:n)
联系类型判断:
-- 示例:判断学生-课程联系类型
-- 文件路径: examples/relationship_analysis.sql
-- 问题1:一个学生可以选几门课程? 答:多门 (n)
-- 问题2:一门课程可以被几个学生选? 答:多个 (m)
-- 结论:学生-课程是 m:n 联系
-- 问题1:一个班级有几个班长? 答:一个 (1)
-- 问题2:一个学生可以当几个班的班长? 答:最多一个 (1)
-- 结论:班级-班长是 1:1 联系
复杂E-R建模示例
案例:图书管理系统
需求描述:
- 图书馆有多本图书,每本图书有书号、书名、作者、出版社、价格等信息
- 读者有读者号、姓名、性别、年龄、职业等信息
- 读者可以借阅图书,借阅时记录借书日期,还书时记录还书日期
- 图书有多个副本,每个副本有唯一的条形码
E-R建模过程:
设计要点分析
-
实体识别:
- 图书(BOOK):抽象的书籍信息
- 图书副本(BOOK_COPY):具体的物理书籍
- 读者(READER):借书的人
- 借阅记录(BORROW_RECORD):借还书的历史记录
-
属性设计:
- 使用ISBN作为图书主键(国际标准)
- 条形码作为副本主键(唯一标识物理书籍)
- 借阅记录包含时间信息(借书、应还、实还)
-
联系分析:
- 图书-副本:1:n(一本书有多个副本)
- 读者-借阅记录:1:n(一个读者有多次借阅)
- 副本-借阅记录:1:n(一个副本有多次借阅历史)
E-R模型扩展
扩展E-R模型特性
1. 弱实体(Weak Entity)
定义:不能被自己的属性唯一标识,必须依赖于其他实体的实体。
特征:
- 没有键属性或键属性不足以唯一标识
- 依赖于强实体存在
- 通过与强实体的联系来唯一标识
表示方法:双线矩形框
2. ISA层次结构
定义:表示实体集之间的继承关系,子类继承父类的所有属性。
应用场景:
- 实体有共同属性,也有特殊属性
- 需要表达"是一个"的关系
3. 聚集(Aggregation)
定义:将联系看作高层实体,可以与其他实体发生联系。
应用场景:
- 需要对联系本身建立联系
- 三元或更高元联系的简化表示
E-R模型向关系模型转换
转换规则
1. 实体集转换
规则:每个实体集转换为一个关系模式,实体的属性转换为关系的属性。
-- 示例:学生实体转换
-- 文件路径: examples/entity_to_relation.sql
-- E-R模型中的学生实体
-- 学生(学号, 姓名, 性别, 年龄, 专业)
-- 转换为关系模式
CREATE TABLE Student (
student_id VARCHAR(20) PRIMARY KEY, -- 学号(键属性)
name VARCHAR(50) NOT NULL, -- 姓名
gender CHAR(1) CHECK (gender IN ('M', 'F')), -- 性别
age INT CHECK (age > 0 AND age < 150), -- 年龄
major VARCHAR(50) -- 专业
);
2. 联系集转换
一对一联系(1:1)
方法1:合并关系
方法2:外键方法
方法3:独立关系
-- 示例:学生-学生证 (1:1联系)
-- 文件路径: examples/one_to_one_conversion.sql
-- 方法1:合并到学生表中
CREATE TABLE Student (
student_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
card_id VARCHAR(20) UNIQUE, -- 学生证号
issue_date DATE -- 发证日期
);
-- 方法2:独立的联系表
CREATE TABLE Student_Card (
student_id VARCHAR(20) PRIMARY KEY,
card_id VARCHAR(20) UNIQUE,
issue_date DATE,
FOREIGN KEY (student_id) REFERENCES Student(student_id)
);
一对多联系(1:n)
方法:在"多"的一方添加外键
-- 示例:班级-学生 (1:n联系)
-- 文件路径: examples/one_to_many_conversion.sql
CREATE TABLE Class (
class_id VARCHAR(20) PRIMARY KEY,
class_name VARCHAR(50) NOT NULL,
grade INT
);
CREATE TABLE Student (
student_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
class_id VARCHAR(20), -- 外键指向班级
FOREIGN KEY (class_id) REFERENCES Class(class_id)
);
多对多联系(m:n)
方法:创建独立的联系表
-- 示例:学生-课程 (m:n联系)
-- 文件路径: examples/many_to_many_conversion.sql
CREATE TABLE Student (
student_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
CREATE TABLE Course (
course_id VARCHAR(20) PRIMARY KEY,
course_name VARCHAR(100) NOT NULL,
credits INT
);
-- 联系表
CREATE TABLE Enrollment (
student_id VARCHAR(20),
course_id VARCHAR(20),
semester VARCHAR(20),
grade DECIMAL(4,2),
PRIMARY KEY (student_id, course_id, semester),
FOREIGN KEY (student_id) REFERENCES Student(student_id),
FOREIGN KEY (course_id) REFERENCES Course(course_id)
);
3. 多值属性转换
方法:创建独立的关系表
-- 示例:员工的多个电话号码
-- 文件路径: examples/multivalued_attribute.sql
CREATE TABLE Employee (
emp_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50) NOT NULL,
department VARCHAR(50)
);
-- 多值属性转换为独立表
CREATE TABLE Employee_Phone (
emp_id VARCHAR(20),
phone_number VARCHAR(20),
phone_type VARCHAR(10), -- 如:手机、座机、传真
PRIMARY KEY (emp_id, phone_number),
FOREIGN KEY (emp_id) REFERENCES Employee(emp_id)
);
4. 弱实体转换
方法:包含强实体的主键作为外键
-- 示例:员工-家属 (弱实体)
-- 文件路径: examples/weak_entity_conversion.sql
CREATE TABLE Employee (
emp_id VARCHAR(20) PRIMARY KEY,
name VARCHAR(50) NOT NULL
);
-- 弱实体转换
CREATE TABLE Dependent (
emp_id VARCHAR(20), -- 强实体主键
dependent_name VARCHAR(50), -- 弱实体部分键
relationship VARCHAR(20),
birth_date DATE,
PRIMARY KEY (emp_id, dependent_name), -- 组合主键
FOREIGN KEY (emp_id) REFERENCES Employee(emp_id)
);
实践练习
练习1:E-R建模基础
任务:为医院管理系统设计E-R模型
需求:
- 医院有多个科室,每个科室有科室号、科室名、位置
- 医生有医生号、姓名、职称,属于某个科室
- 患者有患者号、姓名、性别、年龄、联系电话
- 患者可以预约医生,预约时记录预约时间、就诊时间
验收标准:
- 正确识别实体:科室、医生、患者、预约
- 合理设计属性和主键
- 正确确定联系类型
- 绘制完整的E-R图
练习2:复杂联系建模
任务:设计在线购物系统的E-R模型
需求:
- 顾客可以下订单购买商品
- 每个订单包含多个商品,每个商品有数量和单价
- 商品属于不同类别
- 订单有配送地址和支付方式
验收标准:
- 处理多对多联系(订单-商品)
- 设计联系属性(数量、单价)
- 考虑实体的层次结构
- 完成E-R到关系模型的转换
练习3:模型转换实践
任务:将练习1的E-R模型转换为关系模式
验收标准:
- 正确转换所有实体
- 正确处理各种联系类型
- 设计合理的主键和外键
- 编写完整的SQL DDL语句
常见问题
Q1:如何区分实体和属性?
A1:判断标准:
- 实体:具有独立意义,需要单独管理和查询的对象
- 属性:描述实体特征的数据项,通常不需要单独查询
例如:"地址"可能是属性(如果只是描述),也可能是实体(如果需要详细管理地址信息)。
Q2:多对多联系一定要转换为独立表吗?
A2:是的。关系模型不能直接表示多对多联系,必须通过中间表来实现。中间表的主键通常是参与联系的实体主键的组合。
Q3:什么时候使用弱实体?
A3:当满足以下条件时使用弱实体:
- 实体的存在依赖于其他实体
- 实体的标识需要借助其他实体
- 实体没有足够的属性来唯一标识自己
Q4:E-R图中的菱形和矩形什么时候可以互换?
A4:当联系具有属性时,可以将联系转换为实体。特别是在多对多联系中,联系经常被转换为实体以便更好地管理联系属性。
总结
- 数据模型是数据库设计的理论基础,E-R模型是最重要的概念数据模型
- E-R建模包括识别实体、确定属性、分析联系三个核心步骤
- 实体、属性、联系是E-R模型的三个基本要素,需要准确理解和应用
- 联系类型(1:1, 1:n, m:n)的正确识别是建模成功的关键
- 模型转换遵循固定规则,不同类型的联系有不同的转换方法
下一步
- 前往:003-关系模型基础
- 扩展阅读:UML类图与E-R图的对比
- 实践建议:使用建模工具(如Draw.io)练习E-R图绘制
参考与引用
- Peter Chen - The Entity-Relationship Model (1976)
- 数据库系统概念 (第7版) - 第2章 - Abraham Silberschatz等 (2019)
- Fundamentals of Database Systems (第7版) - Elmasri & Navathe (2015)
- ER图绘制工具 - Draw.io
更新记录
- 更新时间: 2024-01-15 | 更新内容: 创建数据模型与E-R模型章节,包含基本概念、建模方法、转换规则等内容 | 更新人: lvs
870

被折叠的 条评论
为什么被折叠?



