![动态生成数据库 ERD](https://linux22.com/image/338518/%E5%8A%A8%E6%80%81%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE%E5%BA%93%20ERD%20.png)
我已经编写了一个模板(完成后将开源;最好使用 MIT 许可证,如果您的答案是 MIT 许可证,请注明)postgresql_autodoc
它允许我生成数据库结构的 shell 脚本可解析输出,然后我可以将其转换为 TeX,并根据需要转义特殊字符。我计划输出一个表格(类似于 的postgresql_autodoc
默认 HTML 输出,但更简洁,尤其是更易读),以及一个数据库图表,我被告知它是某种内皮生长因子受体。数据库文档将提供给开发人员(连同纯文本输出)和分发给客户的 PDF 操作手册的一部分(尽管我们认为他们不会查看数据库)。我目前的实施要点是,该脚本生成的 Teχ 源必须是什么样子才能得到我想要的输出。
我四处寻找,当然找到了几种实现它的方法,但到目前为止还没有一种方法完全符合我的设想。我手绘了一个例子(在 xpaint 中…),大致看起来像这样:
我的输入是一些数据库表(名称、字段及其名称的列表),以及每个字段是否是主键和/或外键,以及对于外键,它引用的表和字段的名称。
这将以最多 的图表形式输出\linewidth
,该图表可以动态调整大小(高度)和重新排列(表格的位置)以容纳所有表格和链接,并且链接可以自动绘制,重叠尽可能少,并且没有链接越过任何表格。
表格是一个框,里面包含多行表示字段的行,顶部是名称(最好是反向的)。主键带有下划线(这是惯例,我在常规文本中不使用下划线)。
链接被画成带箭头的线,从带有起始表的框到目标表的框(与反转方向的 UML 不同,它有点像鱼尾纹);它们是简单的箭头(我们不知道它们是 1:1 还是 1:n,并且 m:n 关系被分开,它们的中间表明确可见,在我们从 PostgreSQL 转储中获取的输入数据的细节级别上)。
现在,重要的是:表格之间的链接始终以表格的垂直框线开始和结束,而不是水平线之一,和它们垂直放置,以在场地上开始/结束,而不是在桌子上的任何地方。(这意味着线条可以合并,例如,当多个表格引用时,在场地上的表格users.pk
处只有一个箭头,但有几条线指向它,它们可能在中间某处汇合。这是可选的;如果它们不汇合,请发明一些东西让输出不糟糕☺)users
p̲k̲
我曾经手绘这个 ERD 作为 UTF-8 文本文件:
这个显然缺少箭头(但显示了 m:n 关系,因为它是设计优先的),但它很好地展示了合并线的概念。此外,它使用了一个可见的“隧道”来表示,线在交叉处不会合并(在CSYMS.CSYM
和之间SOURCES.VDEPS
)。有这样的事情也很酷 ☻
正如我所说,我的输入数据是原始表名、字段名、哪些字段属于哪些表、哪些字段是主键、哪些字段是外键以及它们链接到什么。我几乎可以生成任何可以想象到的 Teχ 代码,因为我有一个 shell 脚本可以充当中间代码,主要是因为postgresql_autodoc
只能转义 HTML,而且我们的表名包含下划线。
我首先想到了 graphviz,因为它可以非常好地布局“节点”(表格)和线条,并且可以嵌入其输出(如果必须的话,可以使用 PNG),但这并不适用,因为 graphviz 倾向于水平和垂直扩展图表,而我需要它成为文档(操作手册)的一页(或几页 - 如果需要,图表可能跨越多页)的一部分,所以我最终找到了纯 LaTeX 或 Tikz/PGF 解决方案。
运行环境为:Debian不稳定版(TeXlive 2016)上的pdflatex,大致这些包已加载(实际项目是内部的,还有几行代码,但我将开源非客户/项目特定的部分)。字体不是免费的,但 500 大小可以在网上找到(使用字体的 pdflatex 胶水是 git repo 的一部分,位于同一目录中),并且图表中的字体不必相同(尽管可以接受)。