15. ツール:ERAlchemy2#
pythonのeralchemyモジュールを使うと, SQLのshemaから直接ER図を作成できます。 ただeralchemyモジュールのメンテナンスが中断されている様で、sqlalchemyの最新バージョンでは ちょっとソースコードの修正が必要でした [1] 。eralchem2がforkされていて、いずれマージされそうです。 eralchemyのリンクで {1.N} などがつく場所が標準的な場所と逆転しているので、ersqlalchemy2 を使うのが良さそうです。
[performedby]
*id {label:"INTEGER"}
name {label:"VARCHAR"}
type {label:"VARCHAR"}
[groupmembers]
*artist_id {label:"INTEGER"}
*group_id {label:"INTEGER"}
[artists]
*id {label:"INTEGER"}
FamilyName {label:"VARCHAR"}
FirstName {label:"VARCHAR"}
MiddleName {label:"VARCHAR"}
Na {label:"VARCHAR"}
NickName {label:"VARCHAR"}
Sei {label:"VARCHAR"}
azana {label:"VARCHAR"}
[groups]
*id {label:"INTEGER"}
date_from {label:"DATETIME"}
[songs]
*id {label:"INTEGER"}
composer_id {label:"INTEGER"}
lyricwriter_id {label:"INTEGER"}
releasedate {label:"DATETIME"}
title {label:"VARCHAR"}
[tracklists]
*album_id {label:"INTEGER"}
*track_id {label:"INTEGER"}
[tracks]
*id {label:"INTEGER"}
TrackTime {label:"INTEGER"}
arranger_id {label:"INTEGER"}
performer_id {label:"INTEGER"}
recdate {label:"DATETIME"}
revision {label:"VARCHAR"}
song_id {label:"INTEGER"}
[albums]
*id {label:"INTEGER"}
artist_id {label:"INTEGER"}
company {label:"VARCHAR"}
genre {label:"VARCHAR"}
price {label:"INTEGER"}
title {label:"VARCHAR"}
year {label:"DATETIME"}
artists 1--* groupmembers
groups 1--* groupmembers
performedby 1--1 artists
performedby 1--1 groups
artists ?--* songs
artists ?--* songs
tracks 1--* tracklists
albums 1--* tracklists
performedby ?--* tracks
performedby ?--* tracks
songs ?--* tracks
performedby ?--* albums
@startuml
title Translated from .gv file to .puml by hand
entity albums {
*id : INTEGER
--
artist_id : INTEGER
company : VARCHAR
genre : VARCHAR
price : INTEGER
title : VARCHAR
year : DATETIME
}
entity performedby {
*id : INTEGER
--
name : VARCHAR
type : VARCHAR
}
entity artists {
*id : INTEGER
--
FamilyName : VARCHAR
FirstName : VARCHAR
MiddleName : VARCHAR
Na : VARCHAR
NickName : VARCHAR
Sei : VARCHAR
azana : VARCHAR
}
entity groupmembers {
*artist_id : INTEGER
--
*group_id : INTEGER
}
entity groups {
*id : INTEGER
--
date_from : DATETIME
}
entity songs {
*id : INTEGER
--
composer_id : INTEGER
lyricwriter_id : INTEGER
releasedate : DATETIME
title : VARCHAR
}
entity tracklists {
*album_id : INTEGER
--
*track_id : INTEGER
}
entity tracks {
*id : INTEGER
--
TrackTime : INTEGER
arranger_id : INTEGER
performer_id : INTEGER
recdate : DATETIME
revision : VARCHAR
* song_id : INTEGER
}
artists |o-o{ songs
artists |o-o{ songs
artists ||--o{ groupmembers
groups ||--o{ groupmembers
performedby |o--o{ albums
performedby |o--o{ tracks
performedby |o--o{ tracks
performedby ||--|| artists
performedby ||--|| groups
songs |o-o{ tracks
albums ||--o{ tracklists
tracks ||--o{ tracklists
@enduml
15.1. 改良版eralchemy2#
オリジナルのeralchemy2はPlantUMLに対応していません。しかし、PlantUMLに対応した改良版eralchemyが githubに 投稿 されています。
このバージョンで出力のファイル拡張子を".puml", ".uml", ".pu" のいずれかにすると、PlantUMLのインプットが生成されます。
図 12.2 のデータベースを実際に構築し、そのデータベースのER図を eralchemy2とplantUMLで作成してみました。
N対MのリレーションはそのままではRDBに実装できませんので、リンクテーブル course_takerを作成しています。
DBeaverで表示されるおなじデータベースのER図がこちらです。
この章で先ほど紹介した SongsDBのeralchemy2で作成したER図はこちらです。位置の調整は行っていません。
15.1.1. image map#
eralchemy2で作成した図には、リンクが表示されています。pngファイルと同時に生成される .cmapx ファイルを利用することで、 HTMLのイメージ マップとして動作させることが可能です。 以下の例では同じER図をplantUMLサーバーを使ってブラウザ上に表示します。 PlantUMLでsvgを作成して、クリック可能なwebページとすることも可能ですね。
<img src="_images/Classes_ER2_UML.png" USEMAP="#Classes_ER2_UML_map" />
<map id="Classes_ER2_UML_map" name="Classes_ER2_UML_map">
<area shape="rect" id="id1" href="https://www.plantuml.com/plantuml/svg/IyqhoIofL538p2i6CafBKgkv5BGKyX9pKnMi5C8SWvmz78CK_Fn35Fn2VNouT7MvQhbIeLgIyqkBYbFZInApKul0ka02oRZqAIW0LHINbAO0jUDMef1Ub9W2CiBJByJLtJK8oJgeNaBkmsO8I0pkGMpwG0hoIdEJKekmMWtnAJ4s9-UJPd4j5yHi1OMQ6btT_6gKGEM21HTMIOIvC6ceSYmo48q0" title="link to PlantUML server" alt="" coords="181,416,295,428"/>
</map>