使用 PowerDesigner 从 MySQL 反向工程生成物理数据模型并优化展示
在使用 PowerDesigner 进行数据库建模时,我们常常需要将已有数据库结构反向导入为物理数据模型(Physical Data Model, PDM),并对其进行中文命名与模块化整理,以提升可读性和维护效率。以下是完整的操作流程:
1. 创建物理数据模型并配置数据库连接
首先,新建一个 Physical Data Model 类型的文件。
接着,点击菜单栏中的 Database → Configure Connections,弹出 “Configure Data Connections” 窗口。在左侧选择 Connection Profiles,如下图所示:

2. 新建 MySQL 数据库连接
点击窗口左上角的 + 按钮(如下图红框所示),新建一个 MySQL 连接:

随后会弹出连接配置窗口,请根据实际情况填写数据库连接信息,例如主机地址、端口、用户名、密码及目标数据库名称等,参考如下界面:

填写完成后点击 Test Connection 验证连通性,确认无误后保存连接。
3. 从数据库反向生成模型
点击菜单栏 Database → Update Model from Database,弹出 “Database Reverse Engineering Options” 窗口。
在此窗口中,先点击右侧的 取消全选箭头(→|),清空默认选中的对象;
再点击左侧的 选择数据库箭头(|←),选中目标数据库;
最后再次点击 全选箭头(→|),选中该数据库下的所有表、视图等对象。
操作示意如下:


先点击右边箭头取消全选,在点左边箭头选择数据库之后,再点击全部选中,点击确定后就导入到了pd

确认选择后点击 OK,PowerDesigner 将自动将数据库结构导入到当前 PDM 中。
4. 批量将英文表名/字段名替换为中文注释
PowerDesigner 默认使用英文名称,但若数据库中已填写了中文注释(Comment),我们可以通过脚本将其同步为显示名称,便于阅读。
操作路径:Tools → Execute Commands → Edit/Run Script
粘贴并运行以下脚本:
Option Explicit
ValidationMode = True
InteractiveMode = im_Batch
Dim mdl ' 当前模型
' 获取当前活动模型
Set mdl = ActiveModel
If (mdl Is Nothing) Then
MsgBox "当前没有打开的模型!"
ElseIf Not mdl.IsKindOf(PdPDM.cls_Model) Then
MsgBox "当前模型不是物理数据模型(PDM)!"
Else
ProcessFolder mdl
End If
Private Sub ProcessFolder(folder)
On Error Resume Next
Dim Tab ' 表对象
For Each Tab In folder.Tables
If Not Tab.IsShortcut Then
If Tab.Comment <> "" Then Tab.Name = Tab.Comment
Dim col ' 字段对象
For Each col In Tab.Columns
If col.Comment <> "" Then col.Name = col.Comment
Next
End If
Next
Dim view ' 视图对象
For Each view In folder.Views
If Not view.IsShortcut And view.Comment <> "" Then
view.Name = view.Comment
End If
Next
' 递归处理子包
Dim f
For Each f In folder.Packages
If Not f.IsShortcut Then
ProcessFolder f
End If
Next
End Sub
运行后,模型中的对象名称将变为中文,大幅提升可读性。
5. 按前缀自动分组并创建模块化图表
为了进一步提升模型的组织性,我们可以根据表名前缀(如 act_、sys_)自动创建对应的模块图表,并将相关表拖入其中。
再次进入 Tools → Execute Commands → Edit/Run Script,运行以下脚本:
Option Explicit
Dim mdl, prefixMap, d, prefix, diagName
Dim tab, sym, symExists, diagram, tabCode
Dim createdCount, movedCount
' 1. 获取当前活动模型
Set mdl = ActiveModel
If mdl Is Nothing Then
MsgBox "请在物理数据模型中运行此脚本!", vbExclamation
ElseIf mdl.ClassName <> "Physical Data Model" Then
MsgBox "当前模型不是物理数据模型(PDM),请检查!", vbCritical
Else
' 2. 配置前缀与图表名称的映射
Set prefixMap = CreateObject("Scripting.Dictionary")
prefixMap.Add "act_", "活动模块"
prefixMap.Add "sys_", "系统模块"
createdCount = 0
movedCount = 0
' 3. 遍历前缀配置
For Each prefix In prefixMap.Keys
diagName = prefixMap(prefix)
Set diagram = Nothing
' 检查图表是否已存在
For Each d In mdl.PhysicalDiagrams
If d.Name = diagName Then
Set diagram = d
Exit For
End If
Next
' 如果图表不存在,则自动创建一个
If diagram Is Nothing Then
Set diagram = mdl.PhysicalDiagrams.CreateNew()
diagram.SetNameAndCode diagName, prefix & "diagram"
createdCount = createdCount + 1
End If
' 4. 遍历所有表,按前缀匹配并移动
For Each tab In mdl.Tables
tabCode = LCase(tab.Code)
If LCase(Left(tabCode, Len(prefix))) = LCase(prefix) Then
symExists = False
' --- 修复点:安全地检查符号 ---
For Each sym In diagram.Symbols
' 检查 sym.Object 是否存在
If Not sym.Object Is Nothing Then
' 直接比较对象实例,不再调用 .ID 属性
If sym.Object Is tab Then
symExists = True
Exit For
End If
End If
Next
' 如果符号不存在,则添加
If Not symExists Then
diagram.AttachObject(tab)
movedCount = movedCount + 1
End If
End If
Next
' 5. 自动布局
If Not diagram Is Nothing Then
diagram.AutoLayout
End If
Next
MsgBox "? 处理完成!" & vbCrLf & _
"新创建模块图表:" & createdCount & " 个" & vbCrLf & _
"新增表符号总数:" & movedCount & " 个", vbInformation
End If
🔧 自定义提示:
如需支持其他业务模块(如 user_、order_ 等),只需在 prefixMap.Add 部分追加对应规则即可。例如:
prefixMap.Add "user_", "用户模块"
prefixMap.Add "order_", "订单模块"
执行后,PowerDesigner 将自动生成如“活动模块”、“系统模块”等图表,并将匹配前缀的表自动归类、布局,效果如下图所示:

总结
通过以上五步操作,您可以高效地:
- 从 MySQL 数据库反向生成 PDM;
- 将英文名称替换为中文注释,提升可读性;
- 按业务前缀自动分组,实现模块化管理。
这套流程特别适用于接手遗留系统或进行数据库文档标准化工作,推荐保存为常用脚本模板,后续项目可直接复用。
评论已关闭