我使用graphviz库实现了一个简短的python脚本,该脚本可解析给定的文档并自动执行简化的ER图的呈现。
我实现了渲染实体及其关系的方法,但是最终的布局并不是最佳的:
我想要更具人类可读性,面向风景的内容,例如:
我尝试使用Graphviz documentation中的某些属性,例如size
或ratio
,最后得到了以下形式的脚本:
digraph G {
graph [overlap=false rankdir=LR ratio=3 size="5,8!" splines=true]
node [fontname=Verdana fontsize=10 shape=record]
edge [arrowhead=crow style=dashed]
Tbl1 [label=<
<table border="0" cellborder="1" cellspacing="0" cellpadding="4">
<tr><td bgcolor="lightblue">Tbl1</td></tr>
<tr><td port='0' align='left'>id <i style='margin-left: 4px'>[int]</i></td></tr>
<tr><td port='1' align='left'>field2 <i style='margin-left: 4px'>[int]</i></td></tr>
<tr><td port='2' align='left'>field3 <i style='margin-left: 4px'>[date]</i></td></tr>
<tr><td port='3' align='left'>Tbl2Id <i style='margin-left: 4px'>[int]</i></td></tr>
</table>
> margin=0 shape=none]
Tbl2 [label=<
<table border="0" cellborder="1" cellspacing="0" cellpadding="4">
<tr><td bgcolor="lightblue">Tbl2</td></tr>
<tr><td port='0' align='left'>id <i style='margin-left: 4px'>[int]</i></td></tr>
<tr><td port='1' align='left'>field2 <i style='margin-left: 4px'>[int]</i></td></tr>
<tr><td port='2' align='left'>field3 <i style='margin-left: 4px'>[str]</i></td></tr>
</table>
> margin=0 shape=none]
Tbl3 [label=<
<table border="0" cellborder="1" cellspacing="0" cellpadding="4">
<tr><td bgcolor="lightblue">Tbl3</td></tr>
<tr><td port='0' align='left'>id <i style='margin-left: 4px'>[int]</i></td></tr>
<tr><td port='1' align='left'>field2 <i style='margin-left: 4px'>[int]</i></td></tr>
<tr><td port='2' align='left'>field3 <i style='margin-left: 4px'>[str]</i></td></tr>
<tr><td port='3' align='left'>field4 <i style='margin-left: 4px'>[str]</i></td></tr>
<tr><td port='4' align='left'>Tbl2Id <i style='margin-left: 4px'>[str]</i></td></tr>
</table>
> margin=0 shape=none]
Tbl1:3 -> Tbl2:0
Tbl3:4 -> Tbl2:0
}
有什么要做的事吗?我应该使用子图吗?其他图形或节点属性?