我正在使用 PlantUML 构建 ER 图,我的目的是在多个 DER 文件视图中分离数据库结构,这样我就会有一个“完整视图”和一个“系统表视图”,也许还有一个“发票组表视图” .这样,每当我想构建一个新视图时,我都可以创建一个新文件并将表添加到其中。
为了防止每次写实体属性我想把实体分成文件,所以表
users
会在一个名为entity.users.swd
的文件中结束,表user_role
会被命名为entity.user_role.swd
。每当我想展示实体时,我都会按原样包含文件。但是我想将每个表关系添加到表文件中,这样每当呈现 users
时,与 users
的每个关系也会被打印出来。如果我将关系放在实体文件中并将它们都添加到视图文件中,它将复制图表。
例如:
entity.users.swd
@startuml
entity users {
int id
string name
int business_unit_id
}
@enduml
entity.user_role.swd
@startuml
entity user_role {
int user_id
int role_id
}
@enduml
entity.roles.swd
@startuml
entity roles {
int id
string name
}
@enduml
entity.business_units.swd
@startuml
entity business_units {
int id
string name
}
@enduml
如果我将它们添加到 DER 视图文件中,并将关系添加到该 DER 视图文件中,则关系将按应有的方式呈现
der.full.swd
@startuml
!include ./entity.users.swd
!include ./entity.user_role.swd
!include ./entity.roles.swd
!include ./entity.emails.swd
users ||--o{ user_role
roles ||--o{ user_role
business_units ||--o{ users
@enduml
这会结束
现在让我们将样本发展到手头的问题......
我想在实体文件中放置所有像
users ||--o{ user_role
这样的关系标记,所以每当我将它们放在图表中时,它会自动显示该表具有外部依赖性,而无需详细说明外部表的字段。 users
和 user_role
文件都具有如下关系 users ||--o{ user_role
,但如果我这样做,它将复制下面最终图像中的关系。
entity.users.swd
@startuml
entity users {
int id
string name
int business_unit_id
}
users ||--o{ user_role
@enduml
entity.user_role.swd
@startuml
entity users {
int id
string name
int business_unit_id
}
users ||--o{ user_role
roles ||--o{ user_role
@enduml
der.user-view.swd
@startuml
!include ./entity.users.swd
!include ./entity.user_role.swd
@enduml
它如何构建图像:
我想要它:
如何防止此多文件 PlantUML ER 图上的重复关系?
使用预处理器设置变量可以避免在使用 include 时再次声明关系。它实际上是一个 include guard(虽然我不确定 PlantUML 有更好的方法——也许它应该)。
这不是完整的解决方案,只是用以下内容替换您对
users ||--o{ user_role
(或任何您不想重复的内容)的定义:
!if ($users!="defined")
users ||--o{ user_role
!$users = "defined"
!endif