☰
北邮数据库实验四:从E-R图到物理表结构,模式设计到底在练什么
2026/10/14 10:58:12 网站建设 项目流程

简介:这份资源是北京邮电大学数据库课程的实验四报告文档,面向正在学习数据库模式设计的高校学生与自学者,帮助理解从需求抽象到物理实现的完整设计流程。文档围绕在线考试系统展开,涵盖用户、试题库、知识点、试卷与考试管理五个实体的属性定义,并借助Power Designer完成E-R图绘制、概念模型到物理模型的转换,以及建表与视图的SQL脚本生成,最终在IBM DB2 v8.1环境中验证考试信息视图与在线试卷视图的创建效果。资源包共1个docx文件,约1.56MB,内容为结构完整的实验报告,包含实验目的、内容、环境、步骤与结果分析,可直接对照复现实验过程。目前已有145人学习下载,适合需要掌握E-R建模、Power Designer操作及SQL建表建视图技能的读者参考,也可作为课程实验报告的撰写范例。

1. 北邮数据库实验四:从 E-R 图到物理表结构,模式设计到底在练什么

北邮数据库实验四的核心不是写 SQL,而是数据库模式设计——把一份需求文档翻译成 E-R 图,再落成可执行的建表语句。很多同学拿到题目直接开 SSMS 或 DB2 命令行建表,结果中期检查被问“你这张表为什么拆成两个实体”就卡住了。这个实验真正训练的是三件事:用 Power Designer 画 E-R 图并导出物理模型、理解逻辑模式到物理模式的映射规则、在 SQL Server 或 DB2 上把 DDL 跑通并验证约束。适合正在做实验四但不知道从哪下手的人,也适合已经建完表但说不清设计理由的人。下面按我实际带人做这个实验的顺序拆开讲,每一步都给可复现的操作。

2. 需求到 E-R 图:Power Designer 建模的完整操作链

2.1 先确定实体和联系,别急着打开 Power Designer

需求文档里出现的名词不一定都是实体。我一般让学生先用纸笔做一轮筛选:能独立存在、有唯一标识、有多个属性描述的对象才建实体;只作为其他实体属性存在的名词直接归到属性里。比如“学生选课”场景中,学生、课程、教师是实体,“选课时间”“成绩”是学生和课程之间多对多联系的属性,不是独立实体。

这一步做完后,把每个实体的候选码标出来。候选码要满足唯一性和最小性,比如学生实体里学号是候选码,姓名不是。如果需求里没给学号,就要自己补一个代理键,常见做法是用自增整数或 GUID。SQL Server 里可以用NEWID()生成 GUID 默认值,DB2 里用GENERATE_UNIQUE(),但实验阶段用自增整数更直观。

提示:候选码的选择直接影响后面物理模型的主键和外键,这一步错了后面全要返工。

2.2 Power Designer 建 CDM:实体、属性、联系的具体填法

打开 Power Designer,新建 Conceptual Data Model。在工具箱里选 Entity 拖到画布上,双击进入属性页。以“学生”实体为例,Name 填“学生”,Code 填Student,Code 是后面生成 SQL 时用的表名,建议用英文且首字母大写。在 Attributes 标签页逐条加属性:

属性名Code数据类型是否主标识
学号SnoCharacters(10)是
姓名SnameCharacters(20)否
性别SsexCharacters(2)否
年龄SageInteger否

主标识勾选后,Power Designer 会自动在主键列旁边显示<pi>标记。联系用 Relationship 工具画,双击联系设置 Cardinality。多对多联系在 CDM 里可以直接画,但生成物理模型时会自动产生一张中间表,这是后面要检查的重点。

2.3 从 CDM 生成 PDM:检查表名和字段映射

CDM 画完后,菜单栏选 Tools → Generate Physical Data Model。DBMS 选 Microsoft SQL Server 2019 或 IBM DB2 UDB 8.x,取决于你实验环境用哪个。生成后切到 PDM 视图,重点检查三件事:

第一,多对多联系是否自动拆成了中间表,中间表的两个外键是否都设了主键或唯一约束。第二,字符型字段的长度是否合理,比如姓名给 20 够用,但课程名可能要 50。第三,主键的数据类型是否和引用它的外键完全一致,不一致会导致建表时外键约束失败。

如果发现表名或字段名显示的是中文 Name 而不是英文 Code,在 PDM 里右键选 Model Options → Naming Convention,把 Display 改成 Code。这个设置也影响后面导出 SQL 脚本时的命名。

2.4 导出建表 SQL:Generate Database 的四个必调参数

在 PDM 界面按 Ctrl+G 打开 Generate Database 对话框。Directory 选一个空文件夹,File name 填schema.sql。Format 选 SQL 或 DBMS 对应的脚本格式。Options 标签页里勾选以下几项:

  • Generate primary key:生成主键约束
  • Generate foreign key:生成外键约束
  • Generate check:生成检查约束
  • Generate index:生成索引

不勾 Create database 和 Drop table,实验环境里通常手动建库,自动 drop 容易误删。点确定后打开生成的schema.sql,里面就是完整的CREATE TABLE语句。下面是一段典型输出:

create table Student ( Sno char(10) not null, Sname char(20) null, Ssex char(2) null, Sage int null, constraint PK_STUDENT primary key (Sno) ); create table SC ( Sno char(10) not null, Cno char(10) not null, Grade decimal(5,1) null, constraint PK_SC primary key (Sno, Cno) );

这段脚本里PK_STUDENT是 Power Designer 自动生成的约束名,格式是PK_表名。如果后面要手动改约束,记住这个名字。SC表的联合主键(Sno, Cno)就是多对多联系拆解的结果,两个字段同时作为主键保证了一个学生选同一门课只能有一条记录。

3. 物理模式落地:在 SQL Server 和 DB2 上跑通建表脚本

3.1 SQL Server 2019 建库建表的完整命令序列

打开 SSMS,用 Windows 身份登录。先建一个实验用数据库:

CREATE DATABASE Lab4DB ON PRIMARY ( NAME = Lab4DB_data, FILENAME = 'D:\SQLData\Lab4DB.mdf', SIZE = 20MB, MAXSIZE = 100MB, FILEGROWTH = 10MB ) LOG ON ( NAME = Lab4DB_log, FILENAME = 'D:\SQLData\Lab4DB_log.ldf', SIZE = 10MB, MAXSIZE = 50MB, FILEGROWTH = 5MB );

FILENAME的路径要改成你机器上实际存在的目录,否则报“操作系统错误 3”。建完库后用USE Lab4DB;切换,再执行 Power Designer 导出的schema.sql。如果脚本里表之间有外键依赖,注意执行顺序:先建被引用的表,再建引用表。Power Designer 生成的脚本通常已经排好序,但手动调整过的话要自己检查。

3.2 DB2 建表:deactivate 和 db2stop 的时机

DB2 实验环境里建表前先确认实例状态。命令行执行db2start启动实例,然后db2 connect to sample连接示例库。如果要建自己的库:

db2 create database lab4db using codeset UTF-8 territory CN db2 connect to lab4db db2 -tvf schema_db2.sql

-tvf参数表示详细模式执行脚本文件,遇到错误会停下来并显示行号。DB2 的CREATE TABLE语法和 SQL Server 有差异,比如自增列用GENERATED ALWAYS AS IDENTITY,字符类型用VARCHAR而不是CHAR更常见。Power Designer 选 DB2 作为 DBMS 时生成的脚本会自动适配这些差异。

实验做完要释放资源时,先db2 connect reset断开连接,再db2 deactivate db lab4db停用数据库,最后db2stop停止实例。顺序反了会报“数据库正在使用中”。这个流程在实验报告里经常被要求写出来。

3.3 验证约束是否生效:三条必跑的测试 SQL

建完表不代表模式设计对了,要跑测试数据验证约束。第一条测主键冲突:

INSERT INTO Student VALUES ('2021001', '张三', '男', 20); INSERT INTO Student VALUES ('2021001', '李四', '女', 21);

第二条应该报主键冲突错误,说明主键约束生效。第二条测外键约束:

INSERT INTO SC VALUES ('9999999', 'C001', 85);

如果 Student 表里没有学号9999999,这条应该报外键冲突。第三条测检查约束,如果建表时加了CHECK (Sage BETWEEN 15 AND 50),插入Sage = 60应该被拒绝。这三条跑通,说明物理模式的约束层没问题。

4. 避坑:模式设计实验里最容易翻车的五个地方

4.1 多对多联系忘了拆中间表

现象:E-R 图里学生和课程之间画了多对多联系,生成 PDM 后只有 Student 和 Course 两张表,没有 SC 表。原因:Power Designer 在 CDM 转 PDM 时,如果联系属性没设置好,可能不自动生成中间表。解决:在 PDM 里手动建中间表,两个外键列同时设为主键,或者回到 CDM 检查联系的 Cardinality 是否设成了 Many-to-Many。

4.2 外键列数据类型和主键不一致

现象:建表时外键约束报错“列类型不匹配”。原因:Student 表的 Sno 是char(10),SC 表的 Sno 写成了varchar(10),虽然看起来一样但 SQL Server 认为类型不同。解决:在 PDM 里检查所有外键列的数据类型,确保和对应主键完全一致,包括长度和是否可空。

4.3 DB2 脚本在 SQL Server 上直接跑

现象:把 DB2 的建表脚本拿到 SSMS 里执行,报语法错误。原因:DB2 的IDENTITY列语法、ORGANIZE BY ROW等子句 SQL Server 不支持。解决:在 Power Designer 里针对不同 DBMS 分别生成脚本,不要混用。实验报告里如果要求两个平台都做,就生成两份 PDM。

4.4 表名或字段名用了中文导致查询要加引号

现象:SELECT * FROM 学生报错,必须写成SELECT * FROM [学生]或SELECT * FROM "学生"。原因:Power Designer 默认用 Name 而不是 Code 作为物理名。解决:在 PDM 的 Model Options 里把 Naming Convention 的 Display 改为 Code,重新生成脚本。如果已经建了表,用sp_rename改表名。

4.5 忘记设置级联删除导致删主表数据失败

现象:删除 Student 表里一条记录时,报“违反外键约束”。原因:SC 表里有引用该学生的选课记录,默认外键是NO ACTION。解决:如果业务允许,在 PDM 里把外键的 Delete 规则改成 Cascade,重新生成脚本。但实验里通常要求保留历史数据,所以更常见的做法是先删子表记录再删主表记录。

5. 进阶技巧:用 Power Designer 反向工程验证你的物理模式

做完实验四后,我习惯用反向工程检查一遍。在 Power Designer 里新建 Physical Data Model,菜单选 File → Reverse Engineer → Database,选 ODBC 数据源连接到你的 SQL Server 或 DB2 库,Power Designer 会把现有表结构读回来生成 PDM。然后和你的原始 PDM 对比,看有没有遗漏的约束、索引或字段类型偏差。

这个技巧在实验验收时特别有用:老师如果质疑你的表结构,你可以直接打开反向工程生成的 PDM,指着约束说“这是数据库里实际生效的”。另外,反向工程还能发现手动改表后忘记同步到设计文档的问题。我一般会在实验报告最后附一张反向工程截图,证明物理模式和设计模式一致。

还有一个细节:Power Designer 的 Check Model 功能(菜单 Model → Check Model)能自动检测命名冲突、数据类型不一致、孤立外键等问题。跑一遍 Check Model,把红色错误全部消掉,基本就能避免验收时被问住。这个习惯我从做实验四开始保持到现在,每次建完模先 Check 再导出,省了很多返工时间。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询