002-数据模型与E-R模型

002-数据模型与E-R模型

难度:🟢 | 预计时间:90分钟 | 前置:001-数据库系统概述

学习目标

  • 理解数据模型的概念和分类体系
  • 掌握实体-联系(E-R)模型的基本概念和表示方法
  • 学会使用E-R图进行数据库概念设计
  • 了解E-R模型向关系模型的转换规则
  • 能够独立完成简单系统的E-R建模

数据模型概述

数据模型的定义

数据模型(Data Model) 是对现实世界数据特征的抽象,用来描述数据、组织数据和对数据进行操作的方法。它是数据库系统的核心和基础。

数据模型的组成要素

数据模型通常由三个部分组成:

数据模型三要素
描述
定义
规定
数据结构
Data Structure
数据操作
Data Operation
数据约束
Data Constraint
数据对象类型
对象间联系
检索操作
更新操作
完整性规则
约束条件
实体、属性、联系
查询、插入、删除、修改
主键约束、外键约束、域约束
1. 数据结构
  • 静态特性:描述数据对象的类型、内容、性质
  • 动态特性:描述数据对象实例之间的联系
2. 数据操作
  • 检索操作:查询满足条件的数据
  • 更新操作:插入、删除、修改数据
3. 数据约束
  • 完整性约束:保证数据的正确性和一致性log、
  • 安全性约束:保护数据不被非法访问

数据模型的分类

按抽象层次分类
层次模型类型特点应用场景代表
概念层概念数据模型面向用户、易理解需求分析、概念设计E-R模型、UML
逻辑层逻辑数据模型面向DBMS、可实现逻辑设计、物理设计关系模型、面向对象模型
物理层物理数据模型面向存储、高效率物理实现存储结构、访问路径
按数据结构分类
数据模型分类
数据模型
层次模型
网状模型
关系模型
面向对象模型
对象关系模型
XML模型
树形结构
一对多关系
网状结构
多对多关系
表格结构
关系运算
对象封装
继承多态
关系+对象
复杂数据类型
半结构化
层次标记

实体-联系(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图示例

以学生选课系统为例:

STUDENT string student_id PK 学号 string name 姓名 string gender 性别 date birth_date 出生日期 int age 年龄(派生) string phone 电话(多值) COURSE string course_id PK 课程号 string course_name 课程名 int credits 学分 string department 开课系 TEACHER string teacher_id PK 教师号 string name 姓名 string title 职称 string department 所属系 ENROLLMENT string student_id FK string course_id FK int semester 学期 float grade 成绩 date enroll_date 选课日期 选课 被选 授课

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 string isbn PK 书号ISBN string title 书名 string author 作者 string publisher 出版社 decimal price 价格 int total_copies 总册数 BOOK_COPY string barcode PK 条形码 string isbn FK 书号 string status 状态 date purchase_date 采购日期 READER string reader_id PK 读者号 string name 姓名 string gender 性别 int age 年龄 string occupation 职业 date register_date 注册日期 BORROW_RECORD string record_id PK 借阅记录号 string reader_id FK 读者号 string barcode FK 条形码 date borrow_date 借书日期 date due_date 应还日期 date return_date 实还日期 string status 状态 拥有副本 借阅 被借阅
设计要点分析
  1. 实体识别

    • 图书(BOOK):抽象的书籍信息
    • 图书副本(BOOK_COPY):具体的物理书籍
    • 读者(READER):借书的人
    • 借阅记录(BORROW_RECORD):借还书的历史记录
  2. 属性设计

    • 使用ISBN作为图书主键(国际标准)
    • 条形码作为副本主键(唯一标识物理书籍)
    • 借阅记录包含时间信息(借书、应还、实还)
  3. 联系分析

    • 图书-副本:1:n(一本书有多个副本)
    • 读者-借阅记录:1:n(一个读者有多次借阅)
    • 副本-借阅记录:1:n(一个副本有多次借阅历史)

E-R模型扩展

扩展E-R模型特性

1. 弱实体(Weak Entity)

定义:不能被自己的属性唯一标识,必须依赖于其他实体的实体。

特征

  • 没有键属性或键属性不足以唯一标识
  • 依赖于强实体存在
  • 通过与强实体的联系来唯一标识

表示方法:双线矩形框

EMPLOYEE string emp_id PK 员工号 string name 姓名 string department 部门 DEPENDENT string name 姓名 string relationship 关系 date birth_date 出生日期 string emp_id FK 员工号 抚养
2. ISA层次结构

定义:表示实体集之间的继承关系,子类继承父类的所有属性。

应用场景

  • 实体有共同属性,也有特殊属性
  • 需要表达"是一个"的关系
PERSON string person_id PK 人员ID string name 姓名 string gender 性别 date birth_date 出生日期
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图绘制

参考与引用

更新记录

  • 更新时间: 2024-01-15 | 更新内容: 创建数据模型与E-R模型章节,包含基本概念、建模方法、转换规则等内容 | 更新人: lvs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值