PowerDesigner进行数据库物理建模的规范

3,358 阅读8分钟

背景说明

利用PowerDesigner(下文简称PD)进行数据库设计时,其实没有什么固定的规范。但是数据库设计的目的,是为了在团队中沉淀和共享信息,所以设计文档的可读性非常重要。团队使用统一的标准规范来进行设计,才能够保障文档具有高可读性,进而提高团队协作的效率。

本文把一些在实践中经常使用的要求、经验、技巧列出来,可以作为小型团队的数据建模标准规范。

基于这些规范,建模团队可以:

  • 基于模块化思路进行数据库建模;
  • 最大化复用标准的字段类型,以及常用的字段;
  • 优化界面上对象的布局和显示,方便排版和打印;
  • 快速导出数据库设计文档;

注意 PD可以进行多种模型的设计,本文内容仅仅对物理模型设计(Physical Data Model)有效。

模块化结构

一般情况下,没有经验的建模人员会把所有的表都包含在一张图上。当表的数量超过30个的时候,所有表堆叠到一起看起来特别乱,特别复杂,严重影响了pdm的可读性。

下图是一个比较糟糕的例子

a3feba277016f50e4ec1ae9d4f2d0d6a

为了提高pdm的可读性,我们应该使用模块化结构来组织pdm,把整个系统按照相关性拆分成多个低耦合的模块,每个模块独立设计,并且在逻辑上独立管理。模块化设计可以让我们清楚的掌握,哪些模块有什么表,以及当前表属于哪一个模块。

按照实践中我们使用的规范,常用的模块包括

  • 包(Package):可以包含多张图,主要作用是从逻辑上拆分系统;
  • 图(Diagram):本质是一张画布,用来展现表之间的关系;
  • 域(Domain):复用的字段类型设置;
  • 文档模板:快速生成设计文档;

样例如下图

8df78824a42969bbd3762c7cdd067d27

复用对象

一个真实的案例,早期的身份证号码是15位长度,后来调整为18位。系统中很多表都有这个身份证号码字段,当发生长度变化的时候,就需要把每一个表里面的对应字段类型都修改过来,这种时候很容易发生遗漏。

避免这种问题的办法就是尽可能复用已有的对象。比如这个身份证长度,我们有两种复用方法

  1. 复用字段的类型属性
  2. 复用整个字段

字段类型域

预先用定义常用的字段类型,在设计表字段的时候直接使用,就可以降低发生修改时候的工作量。

在定义域的过程中,不但可以指定类型、长度、not null、默认值等属性,还可以限制字段内容。如下图

042d76b12ac75b34c9835aca1cbf6065
97e3d032d9049b5e9eb619fc623fa384

设计表字段的时候,在字段的Properties页面直接引用域即可,如下图

91ad335db34b0534b3cb1f7fb418a0c2

字段

如果需要复用整个字段,只需要在表设计时复制字段即可。这里的复制不是Ctrl-C/V,正确的操作是

  • Add Columns 拷贝一个源字段的副本,名字是黑色
  • Replicate Columns 引用一个源字段,名字是灰色

如下图

7a1b8473309a57d7ee02a4ab84ccd501

备注 为了方便复用字段,可以仿照Domain的做法,预先把常用的公共字段保存在一个专用的表里面(还可以设置这张专用表不自动生成DDL),其他地方引用即可。

主外键关联

因为数据库分表分库越来越普遍,所以业务系统的数据库中已经不再要求必须使用主外键(考虑到数据一致性,建议在可以使用的地方尽量使用)。

但是在pdm文档中,必须设计主外键关系,否则pdm无法体现表的关联关系,就会变成没有任何作用的一份形式文档。

使用表的替身(Shortcut)

为了保持高可读性,我们会把相关性高的表放在一张图里面显示,甚至会在一张图内人为划分多个区域显示不同的主题。

有时候就会出现这样的情况:

  • 一个表要引用另一个包/图里面的表;
  • 同一个表要展现在一张图的多个区域;

我们使用Shortcut,解决一个表需要出现在多个地方的问题。

先Ctrl-C源表,然后选择Paste as Shortcut,如下图

6bcd1a8ac8ced27a43381d2973eba574
8ed81b97498edeb00ced713d8e57f4c3

警告 在需要删除有多个替身的对象时,一定要搞清楚,到底是删除这一个替身,还是删除整个对象。删除替身操作如下图

e17213a29872724ad9b8f2bc05ad9d82

主外键的形式(物理/逻辑)

考虑到实际操作中的特殊场景,我们的要求是,保证pdm文档中有主外键关系,但是在生成建表DDL时可以没有主外键。即,要有逻辑主外键关系。

我们可以用不同的方式生成主外键,如下图

70b734a9db8638397288ab89e134c6a5

上图中的1,2都是使用Reference生成表之间的关系,但是2是逻辑外键。使用Reference的好处是,连接两张表的时候,PD会自动生成子表的外键字段。如t_phy_fk/t_logic_fk这两张表的vihicle_key字段就是自动生成的。

两者的区别就是在Reference Properties选择是否需要生成这个外键的DDL,如下图

2d8bad857ede379d5c789ffad5005204

再看一下两张表的建表DDL,逻辑外键不会出现在最终数据库脚本中。如下图

2fda65a2ced71aecb0fd03bf96297b12

还有另外一种表示表关联关系的办法,就是使用Link来连接两张表(最上面图中标号3的虚线)。这种方式不是真正的主外键关联,不生成DDL,不能自动生成外键字段,并且Properties也不能确定哪些字段是关联字段。如果疏忽就可能遗漏了字段。如标号3的场景中,t_link_fk这张表就遗漏了vehicle_key这个字段!

建议 使用Reference生成外键,并根据逻辑/物理的要求选择是否生成DDL。

批量修改Reference属性的技巧如下图

627a4bdbdee650bb22cc1501adb22c28

优化界面显示

默认配置下,当我们设计一个包含很多字段的宽表时,这张表的所有字段都会显示出来,最终图上表的大小不一,阅读体验非常差,如下图

51ae1e8720c85606aabb34d10b75d96a

实际上我们使用图的目的,是为了快速梳理各表之间的关系,而不是关心具体的每一个字段。所以,我们调整设置,显示少量字段即可。

在图的空白位置点击右键,在弹出菜单中选择显示选项,如下图

c0fc4360352ebdbc8a2034d4881c8c06
6495188c227faf2720f030e85a21235f

调整之后的图显示如下

d40f5fea1dfd417eb1a28afa7488f952

建议 设计过程中,通过拆分多张图的方式,尽量把一张图的内容控制在一个屏幕之内。

导出建表DDL

设计完成pdm后,我们需要根据pdm来生成数据库表及其他对象。PD提供了两种不同方法根据pdm生成数据库

  • 导出DDL,然后在数据库中执行;
  • 直接连接到数据库执行DDL;

根据SCM规范,我们必须使用导出DDL的方式。结合模块化结构建模,使用数据库持续集成工具,我们可以对整个数据库对象进行细粒度的控制。我们会在其他文章里详细介绍持续集成,本文仅仅简单介绍一下如何导出符合要求的DDL语句。

配置DBMS

打开表的Preview页面,可以看到当前表的建表语句,如下图

1621b173eeed9f5ae4497b1bc190c800

PD提供了常用数据库的语法生成功能,我们可以根据实际需求来自定义。默认配置已经可以满足日常需求,不建议普通用户进行自定义。自定义功能如下图

f1a81178a8d32dee941e722125e3014c

批量导出DDL

虽然可以在单个表的预览中拷贝DDL,但是更多时候我们需要批量处理整个包、图、PDM中的所有对象。这个时候需要使用生成数据库功能,如下图

eac04b17a6d4eb3831f98c53a8cb0f93

这里面最重要的步骤是设置和选择

  • 设置内容包括但不限于字体、大小写、物理参数;
  • 选择需要包含的数据库对象; 这两个步骤都可以通过保存配置文件的方式,复用常用的操作和配置。结合SCM工具和流程,才能更好发挥这个功能的作用。

设置参数,如下图

cb0401888685009211cb269eed04ca31

选择对象,如下图

1a8d9a2ea01e3c7f3173b48f650e521a

导出文件之前可以进行预览,如下图

e344ff173d81ddf47a25b193ec0ded00

生成设计文档

虽然pdm的可读性可以做到非常好,但是有一些特殊场合我们仍然需要Word或者HTML格式的数据库建模资料(俗称数据字典)。PD提供了一种可以高度自定义的文档生成机制,我们仅使用里面最基本的部分即可满足要求。

新建一个报告模板,并自定义内容,如下图

482685838f6af696765134f1fbd3239e
5508a1cfa7698b6834b59f0019bd3e2a

生成报告,如下图

4016349232368051de8c48ec799d63e4

HTML格式的报告,可以通过图下钻到表,如下图

5f7b57bada3329d4273524cf8204375f

Word格式的报告,如下图

10b9049f958585471da3af5dc7360adc