跳转到内容

模块一:需求分析、E-R图与关系模式设计

这一部分对应开卷考核的模块一,满分30分,也是后续SQL能否正确编写的基础。教材第7章把数据库设计分为需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、运行和维护等阶段。本次考核重点集中在前三步。


任务分值核心得分点
需求分析文档10说清核心业务、实体及属性,内容不超过2页
完整E-R图10不少于5个核心实体,标清属性、主键、联系和基数
E-R模型转换为关系模式10正确生成表,并标出主键、外键、非空、唯一等约束

这三项是前后连贯的:

业务需求 → 找实体和联系 → 画E-R图 → 转换成关系模式 → 编写建表SQL

如果实体和联系前后不一致,例如需求分析中有“支付记录”,E-R图与表结构中却完全没有支付相关信息,报告就会显得不完整。


2.1 需求分析:回答“系统要管理什么”

Section titled “2.1 需求分析:回答“系统要管理什么””

需求分析不是写空泛介绍,而是从业务中提炼数据库必须保存的信息与必须支持的操作。

需要回答的三个问题:

谁在使用系统?
系统要保存哪些对象及其属性?
这些对象之间发生什么业务动作?

例如,如果当天题目是某类“订单管理”场景,需求分析可以提炼为:

用户可以创建订单;
订单包含一种或多种商品;
每个商品属于一个分类;
订单可能产生支付记录;
管理员维护商品与查询订单统计。

这几句话自然导出实体:

用户、订单、商品、分类、订单明细、支付记录

2.2 概念结构设计:回答“对象之间怎样联系”

Section titled “2.2 概念结构设计:回答“对象之间怎样联系””

概念结构设计通常使用 E-R 模型,它不依赖 MySQL 或 openGauss 等具体数据库系统。

E-R图中的基本元素:

元素含义示例
实体可以独立识别的业务对象用户、课程、设备、订单
属性描述实体的数据项用户姓名、订单时间、商品价格
主键唯一标识实体的属性用户编号、订单编号
联系实体之间的业务关系用户创建订单、学生选修课程
基数联系数量特征1:1、1:N、M:N

2.3 逻辑结构设计:回答“最终建哪些表”

Section titled “2.3 逻辑结构设计:回答“最终建哪些表””

逻辑结构设计的核心任务,是把 E-R 图转换成关系表,并补上约束。

最终产物可以写成关系模式:

用户(UserID, UserName, Phone, ...)
订单(OrderID, UserID, OrderTime, Status, ...)
商品(ProductID, ProductName, UnitPrice, ...)
订单明细(OrderID, ProductID, Quantity, UnitPrice)

其中需要明确:

主键 PK:唯一识别一行数据
外键 FK:保证联系引用有效
NOT NULL:重要信息不能为空
UNIQUE:业务上不能重复的属性
CHECK:限定数值范围或状态取值

考试要求内容不超过2页,所以应该简明但信息完整。推荐按下面结构写。

用一段话说明系统服务对象和目的。例如:

本系统面向某业务中的用户与管理人员,负责记录基础资料、业务交易过程以及查询统计信息。系统目标是保证业务数据结构化存储、关系一致,并支持日常录入、查询和统计管理。

现场需要把“某业务”换成当天题目指定的真实业务,并补充它特有的动作。

用编号列出3至5条最关键的业务流程。例如:

1. 管理员维护基础信息,如商品、分类或服务项目。
2. 用户提交业务申请或订单。
3. 一次申请可以关联多个明细对象。
4. 系统记录处理状态或支付结果。
5. 管理员按时间、用户或分类进行统计查询。

建议使用表格,让老师快速看到你的设计是否完整。

实体主键主要属性设计理由
用户UserID姓名、电话、注册时间发起业务操作的主体
商品/项目ProductID名称、单价、状态被选择或被服务的对象
订单/申请OrderID创建时间、状态、用户编号表示一次完整业务过程
订单明细OrderID + ProductID数量、成交单价表示订单与商品的多对多联系
支付/处理记录PaymentID金额、时间、方式、订单编号记录后续执行结果

这只是可迁移的示例结构,最终实体名称和属性必须服从当天业务题目。

除了实体,还要说明关键规则,例如:

用户手机号不能重复。
商品单价必须大于等于0。
订单必须属于已存在的用户。
明细数量必须大于0。
支付金额不能为负数。
系统需要查询某用户的业务记录、按类别统计数量、按时间统计金额等。

这部分会直接帮助你写 UNIQUECHECKFOREIGN KEY 和多表查询。


实体是业务中需要单独保存信息、并且能够区分个体的对象。

判断一个名词是否适合成为实体,可以问:

它是否拥有多个属性?
它是否会被反复查询或引用?
它是否需要一个编号来唯一标识?

例如“用户”拥有姓名、手机号等属性,并且会关联很多订单,所以应当成为实体。而“订单总价”通常是由明细计算出来的属性,不一定需要独立成为实体。

属性是实体需要保存的数据。例如:

用户:用户编号、姓名、手机号、注册时间
订单:订单编号、用户编号、创建时间、订单状态

属性选择应当服务于业务。无用字段堆得很多不会增加得分,反而让表结构更难维护。

主键必须满足:

唯一:不同实体实例的主键值不能相同。
非空:每条记录都必须能够被识别。
稳定:尽量不要选择经常改变的业务属性。

因此通常使用编号作为主键,例如 UserIDOrderID,而不是直接用姓名作为主键。


含义:

实体A的一个实例最多对应实体B的一个实例,反之亦然。

示例:

用户 与 用户档案

转换方式:

可以合并为一张表;
也可以在任意一方加入另一方的外键,并设置 UNIQUE,保证一对一。

含义:

一名用户可以创建多个订单,但每个订单只属于一名用户。

转换规则非常重要:

把“一”端的主键放到“多”端作为外键。

例如:

用户(UserID, UserName, ...)
订单(OrderID, UserID, OrderTime, ...)

其中 订单.UserID 是指向 用户.UserID 的外键。

含义:

一个订单包含多个商品,一个商品也可以出现在多个订单中。

多对多不能简单只在某一方添加一个外键,否则无法正确存多个对应关系。正确做法是新建联系表:

订单明细(OrderID, ProductID, Quantity, UnitPrice)

其中:

OrderID 是指向订单的外键
ProductID 是指向商品的外键
OrderID + ProductID 可组成联合主键
Quantity、UnitPrice 是这次联系自身的属性

每个普通实体通常转换为一张表:

用户实体 → User表
商品实体 → Product表
订单实体 → Orders表

实体的主键成为表的主键,普通属性成为列。

E-R联系类型转换到关系模式的方法
1:1合并表,或在一方放置对方外键并加唯一约束
1:N在N端加入1端主键作为外键
M:N建立独立联系表,含两端主键及联系属性

假设抽象业务中包含用户、分类、商品、订单、订单明细和支付记录,可以转换为:

用户(UserID, UserName, Phone, RegisterTime)
分类(CategoryID, CategoryName)
商品(ProductID, CategoryID, ProductName, UnitPrice, ProductStatus)
订单(OrderID, UserID, OrderTime, OrderStatus, TotalAmount)
订单明细(OrderID, ProductID, Quantity, DealPrice)
支付记录(PaymentID, OrderID, PayTime, PayAmount, PayMethod)

关系与约束标注示例:

关系表主键外键其他重要约束
用户UserIDPhone UNIQUE NOT NULL
分类CategoryIDCategoryName UNIQUE NOT NULL
商品ProductIDCategoryIDUnitPrice CHECK (UnitPrice >= 0)
订单OrderIDUserIDOrderStatus NOT NULL
订单明细OrderID, ProductID两列分别引用订单与商品Quantity CHECK (Quantity > 0)
支付记录PaymentIDOrderIDPayAmount CHECK (PayAmount >= 0)

7. 三类完整性约束如何体现在设计中

Section titled “7. 三类完整性约束如何体现在设计中”

教材将数据库完整性强调为防止不正确数据进入数据库的重要机制。开卷SQL部分也明确要求涵盖以下三类约束,因此在模块一的表结构中就应该提前设计。

实体完整性要求:

主键值唯一且不能为空。

示例:

UserID INTEGER PRIMARY KEY

参照完整性要求:

外键值要么为空,要么必须对应被引用表中存在的主键值。

示例:

FOREIGN KEY (UserID) REFERENCES Customer(UserID)

它能够防止“订单引用一个根本不存在的用户”这种错误。

用户自定义完整性来自具体业务规则,例如:

手机号不能重复。
价格不能小于0。
数量必须大于0。
订单状态只能属于规定集合。

可以使用:

NOT NULL
UNIQUE
CHECK
DEFAULT

来实现。


本系统针对______业务场景进行设计,主要服务对象包括______和______。
系统需要完成______、______、______等核心业务,并支持按______进行查询统计。
根据业务流程,识别出不少于5个核心实体,分别为______。
实体______转换为关系模式______,以______作为主键。
实体______与实体______之间为一对多联系,因此在多端关系______中加入______作为外键。
实体______与实体______之间为多对多联系,因此建立联系关系______,其联合主键为______。
此外,通过NOT NULL、UNIQUE和CHECK约束保证______等业务规则。

常见错误为什么有问题正确改法
把姓名当主键可能重名且可能更改使用编号作为主键
多对多关系只放一个外键无法表示多个对应对象建中间表并放两端外键
E-R图有实体但表中遗漏前后不一致画图后逐实体检查转换结果
没有约束不能体现数据正确性标注PK、FK、NOT NULL、UNIQUE、CHECK
需求写得空泛看不出你理解业务写核心业务动作和查询需求

数据库设计的重点过程是需求分析、概念结构设计和逻辑结构设计。
需求分析用于明确业务、实体、属性和数据处理需求。
E-R图描述实体、属性和实体之间的联系,联系基数包括1:1、1:N、M:N。
一对多联系应在多端加入外键,多对多联系应转换为独立联系表。
关系模式设计必须体现实体完整性、参照完整性和用户自定义完整性。
考试中E-R图至少包含5个核心实体,表结构应明确主键、外键、非空、唯一等约束。