テーブルの設計にPlantUMLを使うと便利

# 概要
* テーブル設計のラフスケッチをPlantUMLでやったら便利だったので紹介
* テーブルの関連（１対多, 多対多など）を表現できる
* `entity{}`と`-{`と`package{}` の3つをおぼえれば、設計がはかどる

![alt](http://www.plantuml.com/plantuml/svg/IyqhoIofL2WjJYqgLgZcoapXoalCJUMgvUA2oYHd99P0PK2Aue5qRcfnSM8wigBCN20VgWhCZYyjoW79GypLhOOOmmKnJ1Ug7W00)

# 環境
* editor & viewer: いろいろあるけど、とりあえず http://www.plantuml.com/plantuml/uml/ でいいと思う

# 使い方
## 概要
* テーブル項目の表現: `entity{}`
* テーブル間の関連の表現: `-{`
* テーブルのまとまりの表現: `package{}`

## テーブル項目を表現する
テーブル名と登録されているカラムを表現する。
例えば、テーブル名を__users__、登録されているカラム名を__id__と__name__の場合のPlanUMLは以下の通り。

```plantuml
entity users {
id
name
}
```

http://www.plantuml.com/plantuml/uml/IyqhoIofL2WjJYqgLgZcoapXoalCJUMg1G00

![alt](http://www.plantuml.com/plantuml/svg/IyqhoIofL2WjJYqgLgZcoapXoalCJUMg1G00)

## テーブル間の関連を表現する
２つのテーブル間の関連を表現する。
その前に、復習も含めてchatsテーブルを作成してみる。chatsテーブルは__id__と__user_id__と__message__カラムを持つのでPlanUMLで表現すると以下のようになる。

```plantuml
entity chats {
id
user_id
message
}
```

http://www.plantuml.com/plantuml/uml/IyqhoIofL4ZEI2mfLgZcoapXAYrEBOe7qhcfnSM9wQbSjG00

![alt](http://www.plantuml.com/plantuml/svg/IyqhoIofL4ZEI2mfLgZcoapXAYrEBOe7qhcfnSM9wQbSjG00)

まず、２つのテーブルをならべてみる

```plantuml
entity users {
id
name
}

entity chats {
id
user_id
message
}
```

http://www.plantuml.com/plantuml/uml/IyqhoIofL2WjJYqgLgZcoapXoalCJUMgvUA2oYHd99P0PK2Aue5qRcfnSM8wK140

![alt](http://www.plantuml.com/plantuml/svg/IyqhoIofL2WjJYqgLgZcoapXoalCJUMgvUA2oYHd99P0PK2Aue5qRcfnSM8wK140)

chatsテーブルとusersテーブル間が結びついている場合はPlanUMLで表現すると以下のようになる。

```
entity users {
id
name
}

entity chats {
id
user_id
message
}

users - chats
```

テーブル名1とテーブル名2が結びついていることを示すには、__-__をつかいます。具体的には、__テーブル名1 - テーブル名2__と書きますので上記では__users - chats__と書きます。

http://www.plantuml.com/plantuml/uml/IyqhoIofL2WjJYqgLgZcoapXoalCJUMgvUA2oYHd99P0PK2Aue5qRcfnSM8wM154dov45G00

![alt](http://www.plantuml.com/plantuml/svg/IyqhoIofL2WjJYqgLgZcoapXoalCJUMgvUA2oYHd99P0PK2Aue5qRcfnSM8wM154dov45G00)


さらに、詳細に説明したい場合は__{__を使います。今回の例ではchatsテーブルにはuser_idがあることからわかるように、usersテーブルとchatsテーブル間は1対多の関係であることがわかります。これを表現するには、__users -{ chats__とします。重要なのは__{__です。

```
entity users {
id
name
}

entity chats {
id
user_id
message
}

users -{ chats
```

http://www.plantuml.com/plantuml/uml/SoWkIImgAStDuKhDAyaigLGeBKujAbQevifCuSfBp4tbgkM2oIHd99P0PK2Aue5qRcfnSM8wM154dsurH1cNGsfU2j1K0000

![alt](http://www.plantuml.com/plantuml/svg/SoWkIImgAStDuKhDAyaigLGeBKujAbQevifCuSfBp4tbgkM2oIHd99P0PK2Aue5qRcfnSM8wM154dsurH1cNGsfU2j1K0000)

## テーブルのまとまりを表現する
テーブル数が２つの場合は不要ですが、３つ以上になると複数のテーブルをまとめて表現するとわかりやすくなる場合があります。
そのとき使うのは__package{}__です。

まず、chatsテーブルと1対1の関係にあるimagesというテーブルを追加します。

```
entity users {
id
name
}

entity chats {
id
user_id
message
}

entity images {
id
image_url
}

users -{ chats
chats - images
```

http://www.plantuml.com/plantuml/uml/IyqhoIofL2WjJYqgLgZcoapXoalCJUMgvUA2oYHd99P0PK2Aue5qRcfnSM8wigBCN20VgWhCZYyjoW79GypLhOOOmmKnJ1Ug7W00

![alt](http://www.plantuml.com/plantuml/svg/IyqhoIofL2WjJYqgLgZcoapXoalCJUMgvUA2oYHd99P0PK2Aue5qRcfnSM8wigBCN20VgWhCZYyjoW79GypLhOOOmmKnJ1Ug7W00)

ここに、chatsテーブルとimagesテーブルは__chat_screen__で使われるという意味でグループ化して表現する場合はいかのように書きます。

```
entity users {
id
name
}

package chat_screen {
entity chats {
id
user_id
message
}

entity images {
id
image_url
}
}

users -{ chats
chats - images
```

http://www.plantuml.com/plantuml/uml/BSrB3e0W30JGVK_11JWJQN2YH266mi8GxswHhlZqpHIbfVQuBgZY1gMD2cVGItHpF7c7YmUt8B42HO7v-Mb-HeEU6IBgPzHGoleszTz3hvVELQnzVgmYMdNU4Xy0

![alt](http://www.plantuml.com/plantuml/svg/BSrB3e0W30JGVK_11JWJQN2YH266mi8GxswHhlZqpHIbfVQuBgZY1gMD2cVGItHpF7c7YmUt8B42HO7v-Mb-HeEU6IBgPzHGoleszTz3hvVELQnzVgmYMdNU4Xy0)

# さらに応用
これまでの情報でも十分ですが、もうちょっと装飾します。

```
entity users {
id
--
name
}

package chat_screen {
entity chats {
id
user_id
--
message
}

entity images {
id
--
image_url
}
}

users --{ chats
chats - images : has_one
```

http://www.plantuml.com/plantuml/uml/HSt13SCW30NG-v-21LYWfso2B68bgDYjC1mgbDrRGg8Ul_NVzsALIcsImLfJ_RXcNCnrf1NUGqaO1_2c-AIDNTof1ek5MLs_o7cyoD1XKc4pseQ-Uqb--Rzznj1AnZ5Ayx7tVUvXhlfRFTnE5bxAM5ZN9laB

![alt](http://www.plantuml.com/plantuml/svg/HSt13SCW30NG-v-21LYWfso2B68bgDYjC1mgbDrRGg8Ul_NVzsALIcsImLfJ_RXcNCnrf1NUGqaO1_2c-AIDNTof1ek5MLs_o7cyoD1XKc4pseQ-Uqb--Rzznj1AnZ5Ayx7tVUvXhlfRFTnE5bxAM5ZN9laB)

* 区切り

区切りを表現するには、__--__を使います。僕は、idとそれ以外を区別して表現するのに使っています。

```
entity chats {
id
user_id
--
message
}
```

* 関連の線を長くする

関連の線は__-__を使うと説明しましたが、このハイフンは複数重ねると線を長くして見やすくする事ができます。

```
users --{ chats
```

* 関連にコメントをつける

関連にコメントをつける場合は__ : コメント__を使います。頻度は多くないですが、たまに使います。

```
chats - images : has_one
```

これだけあればテーブルのラフスケッチは十分！

# 所感
PlantUMLがもっと広まるといいですね。