
简介这份资源是北京邮电大学数据库课程实验四的完整实验报告文档面向正在学习数据库设计的高校学生与自学者聚焦数据库模式设计这一关键环节。内容围绕在线考试系统展开涵盖用户、试题库、知识点、试卷与考试管理五个实体的属性定义并完整呈现从E-R图抽象、Power Designer概念模型构建、物理模型转换到SQL脚本生成与执行的全流程同时包含考试信息视图与在线试卷视图的创建与验证。资源包共1个docx文件约1.56MB以实验报告形式组织结构清晰便于对照学习。目前已有145人学习下载。读者可借此掌握E-R图到逻辑模式的转换方法、Power Designer建表与视图操作技巧以及DB2环境下SQL脚本的导入与验证思路适合作为数据库实验课参考或课程设计模板使用。1. 北邮数据库实验四到底在练什么从 E-R 图到可建库的物理模式很多同学拿到“数据库模式的设计”这个题目第一反应是打开 Word 写几段文字交差。但北邮数据库实验四真正想让你走通的是一条从需求到可执行 SQL 的完整链路先把业务语义抽象成 E-R 图再把 E-R 图翻译成关系模式接着用 Power Designer 这类建模工具把表、字段、主外键、约束画出来最后导出能在 DB2 或 SQL Server 上直接跑的 DDL 脚本。它解决的不是“会不会写 CREATE TABLE”而是“能不能在设计阶段就把冗余、异常和约束想清楚”。适合正在做实验四、准备数据库课设或者第一次用 Power Designer 做物理模型的人。热搜里“数据库模式设计”“Power Designer”“E-R图”“SQL”“DB2”这几个词恰好就是这条链路上的五个关键节点。2. 先分清概念模型和物理模型E-R 图不是画着好看2.1 概念模型、逻辑模型、物理模型各自负责什么数据库模式设计最容易翻车的地方是把三个层次揉成一团。概念模型只关心业务世界里有哪些实体、实体之间是什么联系典型产物就是 E-R 图逻辑模型关心的是关系模式也就是把实体和联系转成一张张二维表并确定主键、外键物理模型才关心具体 DBMS 的数据类型、索引、存储参数和约束语法。北邮实验四通常要求你从概念模型一路做到物理模型所以每一步的产物都要能对得上。我一般会这样区分E-R 图里出现“学生”“课程”“选课”这些词逻辑模型里出现“Student”“Course”“SC”这些表名物理模型里出现VARCHAR(20)、PRIMARY KEY、FOREIGN KEY这些具体语法。如果你在 E-R 图阶段就开始纠结VARCHAR还是CHAR说明层次混了如果你在物理模型阶段还在画菱形表示联系说明还没落地。提示实验报告里最好把三层模型分别截图或导出老师一眼就能看出你不是直接拍脑袋建表。2.2 用 Power Designer 建概念模型的实操步骤Power Designer 的入口是 New Model → Conceptual Data Model。新建之后先别急着拖实体先把实体和联系的命名规范定下来。常见做法是实体用单数名词联系用动词或动宾短语。下面是一个概念模型里实体和属性的描述方式虽然 Power Designer 是图形化操作但你可以用这段伪结构来检查自己的模型是否完整。实体 Student: 属性 Sno学号标识符 属性 Sname姓名 属性 Ssex性别 属性 Sage年龄 属性 Sdept系别 实体 Course: 属性 Cno课程号标识符 属性 Cname课程名 属性 Ccredit学分 联系 SCStudent 与 Course 之间多对多: 属性 Grade成绩逻辑说明概念模型里多对多联系 SC 带一个属性 Grade这是后面转成独立表的关键。参数说明标识符就是候选主键Power Designer 里用下划线或勾选 Primary Identifier 表示。很多同学在这里漏掉联系属性导致后面 SC 表没有成绩字段整个设计就断了。2.3 从 E-R 图转关系模式的四条转换规则转换规则不复杂但每条都有边界。第一每个实体转一张表实体的标识符转主键。第二一对多联系把“一”端的主键放到“多”端做外键。第三多对多联系必须单独转一张表主键是两个端实体主键的组合。第四一对一联系可以把任一端主键放到另一端做外键或者单独建表看业务查询频率决定。以学生选课为例Student 和 Course 是多对多所以 SC 表的结构应该是SC(Sno, Cno, Grade)主键是(Sno, Cno)Sno引用Student(Sno)Cno引用Course(Cno)。如果你把 Grade 放到 Student 表里一个学生选多门课就没法存多个成绩这就是典型的范式错误。CREATE TABLE SC ( Sno CHAR(9) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Student(Sno), FOREIGN KEY (Cno) REFERENCES Course(Cno) );逻辑说明这段 DDL 是逻辑模型落到物理模型后的产物主键组合保证同一个学生同一门课只有一条记录。参数说明CHAR(9)和CHAR(4)是定长字符串如果学号或课程号长度不固定可以换成VARCHARGrade允许为空表示还没出成绩如果业务要求必须录入就加NOT NULL。3. 在 Power Designer 里把逻辑模型做成能导出的物理模型3.1 从 LDM 生成 PDM 的关键选项Power Designer 里逻辑模型叫 LDM物理模型叫 PDM。从 LDM 生成 PDM 的入口是 Tools → Generate Physical Data Model。这里有几个选项直接决定导出的 SQL 能不能用。第一DBMS 要选对实验要求 DB2 就选 DB2要求 SQL Server 就选 SQL Server因为不同 DBMS 的数据类型和约束语法不一样。第二勾选“Generate primary key”和“Generate foreign key”否则导出的脚本没有约束。第三如果 LDM 里用了多对多联系生成 PDM 时会自动转成中间表但你要检查表名和字段名是否符合预期。我见过最常见的翻车是LDM 里实体名用了中文生成 PDM 后表名也是中文导出 SQL 在 DB2 命令行里执行报错。所以命名规范最好在 LDM 阶段就用英文中文名放到 Comment 或 Name 里。3.2 物理模型里必须检查的字段类型和约束生成 PDM 之后不要直接导出。先打开每张表检查字段类型。DB2 和 SQL Server 的类型有差异比如 DB2 里字符串常用VARCHARSQL Server 里NVARCHAR更常见DB2 的IDENTITY和 SQL Server 的IDENTITY语法也不完全一样。下面这张表是我一般会对照检查的项。检查项DB2 常见写法SQL Server 常见写法注意点自增列GENERATED ALWAYS AS IDENTITYIDENTITY(1,1)导出后确认语法匹配字符串VARCHAR(n)NVARCHAR(n)中文多时优先 Unicode日期时间TIMESTAMPDATETIME精度需求高用DATETIME2主键约束PRIMARY KEYPRIMARY KEY组合主键顺序要一致外键约束FOREIGN KEY ... REFERENCES同左被引用列必须有唯一约束注意Power Designer 里改字段类型后要重新生成一次 DDL不要手动改导出的 SQL 文件否则下次生成会覆盖。3.3 导出 DDL 并在 DB2 上跑通的最小命令导出路径是 Database → Generate Database。选择目录和文件名格式选.sql。导出后在 DB2 命令行里执行。假设你已经建好数据库testdb并且用db2 connect to testdb连上了那么执行脚本的命令是db2 -tvf schema.sql逻辑说明-t表示语句以分号结尾-v表示回显每条语句-f表示从文件读取。参数说明如果脚本里有大量语句建议加-z output.log把错误输出到日志方便排查。执行完用db2 list tables确认表是否建成功。如果报错“SQL0104N An unexpected token”多半是语句分隔符或类型不匹配如果报错“SQL0204N ... is an undefined name”多半是外键引用的表还没建调整脚本里 CREATE TABLE 的顺序即可。4. 避坑与排查实验四最容易翻车的五个地方4.1 现象Power Designer 里表名显示成中文导出 SQL 报错原因LDM 阶段实体 Name 用了中文PDM 生成时把 Name 当成了 Code。解决在 LDM 里把 Name 写成中文Code 写成英文或者在 PDM 里用 Tools → Model Options 把 Name 和 Code 的映射关系改掉。更稳妥的做法是一开始就英文命名中文放 Comment。4.2 现象导出的 SQL 在 DB2 里执行到外键就失败原因CREATE TABLE 的顺序不对子表先于父表创建。解决手动调整脚本顺序先建被引用的表再建引用表或者在 Power Designer 生成时勾选“Generate foreign key after all tables”让外键用 ALTER TABLE 单独加。4.3 现象多对多联系转成中间表后主键丢了原因LDM 里多对多联系没有设置标识符生成 PDM 时中间表没有主键。解决回到 LDM给联系加上标识符或者手动在 PDM 里给中间表设置组合主键。4.4 现象SQL Server 上执行脚本提示“对象名无效”原因没有切换到正确的数据库或者脚本里用了dbo.前缀但当前用户没有权限。解决先执行USE 你的数据库名;再执行建表脚本如果用了 schema确认 schema 已创建。4.5 现象字段允许空值导致后续查询出现 NULL 陷阱原因设计时没想清楚业务是否允许空值默认全允许。解决对业务上必须有的字段加NOT NULL比如学号、课程号、姓名对可能为空的字段在查询时用IS NULL或COALESCE处理避免 NULL这种无效条件。5. 让模式设计经得起检查反向验证与一个小技巧模式设计做完怎么证明它是对的我一般会做两件事反向生成 E-R 图和用测试数据跑一遍约束。Power Designer 支持从 PDM 反向生成 LDM 或概念模型如果反向出来的图和最初画的差太多说明中间转换有信息丢失。另一个办法是往每张表插几条测试数据故意插违反主键、外键、非空约束的数据看数据库是否按预期拒绝。-- 测试主键冲突 INSERT INTO Student(Sno, Sname) VALUES (202100001, 张三); INSERT INTO Student(Sno, Sname) VALUES (202100001, 李四); -- 应报错 -- 测试外键约束 INSERT INTO SC(Sno, Cno, Grade) VALUES (999999999, C001, 90); -- 应报错 -- 测试非空约束 INSERT INTO Course(Cno, Cname) VALUES (C002, NULL); -- 应报错逻辑说明这三条语句分别验证主键唯一性、外键引用完整性和非空约束。参数说明如果你的数据库配置了级联删除或延迟约束报错行为可能不同以实验要求为准。跑完测试后记得回滚或删除测试数据避免影响后续实验。还有一个容易被忽略的技巧在 Power Designer 的 PDM 里给每张表加 Comment把业务含义写清楚。导出 SQL 时勾选“Generate comments”这样 DB2 或 SQL Server 里表的注释就是完整的。以后别人接手你的库不用翻实验报告也能看懂字段含义。我自己做课设时因为没写注释过了一周再回头看SC表愣了半天才想起Grade是成绩而不是等级。希望帮到你。本文还有配套的精品资源点击获取