使用 PowerDesigner 从 MySQL 反向工程生成物理数据模型并优化展示

在使用 PowerDesigner 进行数据库建模时,我们常常需要将已有数据库结构反向导入为物理数据模型(Physical Data Model, PDM),并对其进行中文命名与模块化整理,以提升可读性和维护效率。以下是完整的操作流程:

1. 创建物理数据模型并配置数据库连接

首先,新建一个 Physical Data Model 类型的文件。

接着,点击菜单栏中的 ​Database → Configure Connections​,弹出 “Configure Data Connections” 窗口。在左侧选择 ​Connection Profiles,如下图所示:

image

2. 新建 MySQL 数据库连接

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

image

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

image

填写完成后点击 Test Connection 验证连通性,确认无误后保存连接。

3. 从数据库反向生成模型

点击菜单栏 ​Database → Update Model from Database,弹出 “Database Reverse Engineering Options” 窗口。

在此窗口中,先点击右侧的 ​取消全选箭头​(→|),清空默认选中的对象;
再点击左侧的 ​选择数据库箭头​(|←),选中目标数据库;
最后再次点击 ​全选箭头(→|),选中该数据库下的所有表、视图等对象。

操作示意如下:

image

image

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

image

确认选择后点击 ​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 将自动生成如“活动模块”、“系统模块”等图表,并将匹配前缀的表自动归类、布局,效果如下图所示:

image

总结

通过以上五步操作,您可以高效地:

  • 从 MySQL 数据库反向生成 PDM;
  • 将英文名称替换为中文注释,提升可读性;
  • 按业务前缀自动分组,实现模块化管理。

这套流程特别适用于接手遗留系统或进行数据库文档标准化工作,推荐保存为常用脚本模板,后续项目可直接复用。