How I code (not draw) my ER Diagram
ER Diagram without drawing
Hi again,
This time I would like to share how I code my ER Diagram using code only.
The tool I'm using is PlantUML. There is an online tool at planttext.com
Why I'm doing this? I hate using mouse and I love being able to version control my ER Diagram as a code inside git.
Preparation
Online
If you don't want to setup anything, just go ahead and use planttext.com
Local / Atom
Install these packages
plantuml plantuml-viewer
or plantuml plantuml-preview
Then create a file for your ER diagram.
touch ~/Desktop/example.pu
I usually go for *.pu
for all PlantUML files.
The fun part
Put this in your file then toggle preview using cmd+shift+p then type plantuml.
@startuml
skinparam linetype ortho
skinparam packageStyle rectangle
skinparam shadowing false
skinparam class {
BackgroundColor White
BorderColor Black
ArrowColor Black
}
hide members
hide circle
User1 ||-up-|{ Role1
User2 ||-down-|{ Role2
User3 ||-left-|{ Role3
User4 ||-right-|{ Role4
@enduml
This is One and Only One
to One or Many
If you don't specify direction, it will default to down.
More options
@startuml
skinparam linetype ortho
skinparam packageStyle rectangle
skinparam shadowing false
skinparam class {
BackgroundColor White
BorderColor Black
ArrowColor Black
}
hide members
hide circle
User1 --|{ Role1
User2 o--|{ Role2
User3 |o--|{ Role3
User4 --o{ Role4
User5 --{ Role5
@enduml
I can't get o--|{
to work properly.
It also work the other way around
@startuml
skinparam linetype ortho
skinparam packageStyle rectangle
skinparam shadowing false
skinparam class {
BackgroundColor White
BorderColor Black
ArrowColor Black
}
hide members
hide circle
User1 }|-- Role1
User2 }o-- Role2
User3 }--|| Role3
User4 }--o| Role4
User5 }--o Role5
@enduml
You can experiment changing it to the other way round.
Showing attributes
By removing hide members
(line 10) you can add attributes to your classes. If you add it back, all attributes will be hidden.
@startuml
skinparam linetype ortho
skinparam packageStyle rectangle
skinparam shadowing false
skinparam class {
BackgroundColor White
BorderColor Black
ArrowColor Black
}
hide circle
class "User" as User1 {
- int id
- int age
- string name
+ ([role]) roles()
+ ([user_role]) user_roles()
}
class Role {
- int id
- string name
}
class "UserRole" as User1Role {
- int id
- int user_id
- int role_id
}
User1 ||-right-|{ User1Role
Role ||-left-|{ User1Role
@enduml
That's it, hope you liked the way I did it.
I also got a gem for rails apps https://github.com/sakKo/prailroady forked from https://github.com/preston/railroady
Let me know if I can improve my post. thankz!