Data Modeling Markup


[UML](https://en.wikipedia.org/wiki/Unified_Modeling_Language)は開発のデザインでプロダクトマネージャとエンジニアがコンテキストを共有するのに有効なツールです。
そのUMLを軽量マークアップ言語で記述できる[PlantUML](http://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)はテキストエディタを選ばないのでとても便利です。

しかし、UMLのダイアグラム以外にもプロダクトマネージャとエンジニアで共有したいダイアグラムがあります。
それはデータの構造と意味です。これがおたがいに正確に共有されていると開発がスムーズに進みます。

モデリングの手法は多数ありますが、佐藤正美氏のT字形ER手法(TM)を軽量マークアップ言語で表現しました。
**個人的に軽量マークアップ言語したもので、公式に認められたものではありません。**

## T字形ER手法(TM)

TMはデータ構造を作りながら同時に事業を解析し、実装の生産性向上を実現する目的で作られました。
(この手法は理論に基づいた[ルール](http://www.amazon.co.jp/%E4%BD%90%E8%97%A4-%E6%AD%A3%E7%BE%8E/e/B004L59MG8)があります。そのルールを理解してご利用ください。)


## Entity(個体)

* `entity`(個体)は認知された事実的対象のことで、`identifier`(認知番号)が付与される。
* entityは`event`(出来事・行為)と`resource`(行為に関与するもの)の2種類に分類される。
    * eventは関係は非対称性で、性質として日付が帰属する。
    * resourceは関係は対称性で、event以外のentityである。

### 記法

* 簿記の **T字勘定** と同じように、entityの仕訳をする。
* 左側には認知番号(主語)が記入され、右側には性質(述語)が記入される。
    * 性質は名称や日・数量、および区分コードなど
* 個体名称の右側に分類のeventなら`E`、resourcenなら`R`が記入される。

```
個体名称 | 分類
---------------
認知番号 | 性質
```

#### 例

```
        顧客    | R
-------------------
顧客番号 | 顧客名称
```

```
        受注  | E
-----------------
受注番号 | 受注日
         | 受注数
```

### 軽量マークアップ

* [Markdown記法の拡張](https://michelf.ca/projects/php-markdown/extra/#table)の **テーブル** のマークアップで表現する。
* 分類はeventなら`Event`、resourcenなら`Resource`が記入される。

個体名称 | 分類
---------|-----
認知番号 | 性質

#### 例

  顧客   | Resource
---------|---------
顧客番号 | 顧客名称

  受注   | Event
---------|-------
受注番号 | 受注日
         | 受注数

## Relation(関係)

* entity(個体)の間には関係が成立する。
* 関連には4種の対応性がある。
    * One-to-one(1 対 1)
    * One-to-many(1 対 複数)
    * Many-to-one(複数 対 1)
    * Many-to-many(複数 対 複数)

### 記法

#### 1

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8369/c0b4b8af-5396-0431-9e26-defd9ad82088.png)

#### 複数

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8369/4d2ae80d-2ced-536f-56b5-1566e98b9a75.png)

#### 例

##### One-to-one

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8369/a2ca722a-b26e-82e3-be1a-a9cf6e02dac0.png)

##### One-to-many

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8369/4aa4f508-c431-9e90-f59e-3b9d963a2125.png)

##### Many-to-many

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8369/854515ad-fb56-b243-de31-ffb355cae336.png)

##### Recursive

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8369/cb119b13-f824-da84-2ab9-55b8a1570a82.png)

### 軽量マークアップ

* [PlantUML](http://plantuml.com/usecase.html)の **Use Case** に似たマークアップで表現する。

#### 1

```
 |
```

#### 複数

```
 <
```

#### Entity

```
 [ ]
```

* event

```
 [ :E]
```

* resourcen

```
 [ :R]
```

#### 例

##### One-to-one

* [顧客] has one [住所]
* [住所] belongs to [顧客]

```
[顧客:R] -|-|- [住所:VE]
```

##### One-to-many

* [顧客] has many [受注]
* [受注] belongs to [顧客]

```
[顧客:R] -|-<- [受注:E]
```

* [顧客] has many [商品] through [対照表]
* [商品] has many [顧客] through [対照表]

##### Many-to-many

```
[顧客:R] ->+<- [商品:R]
          |
       [対照表]
```

##### Recursive

* [受注] has many [再帰表]
* [再帰表] belongs to [受注]

```
[受注:E] =|+<- [再帰表]
```

## Tips

ケーキを生地(`batter`)から作るのに、大きさ(`size`)を決めたり、クリーム(`cream`)でデコレーションをします。
Entityの構造はホールケーキやロールケーキなど作り方の工程でいくつも存在します。
こんな構造の違いをプロダクトマネージャとエンジニアが認識して正確に共有することが大切です。

* ホールケーキ

```
[batter:R] ->+|- [size:R]
             |
  [batter,size] ->+|- [cream:R]
                  |
            [batter,size,cream]
```

* ロールケーキ

```
[batter:R] ->+|- [cream:R]
             |
  [batter,cream] ->+|- [size:R]
                   |
            [batter,cream,size]
```

ドキュメントは[Git Server]()で管理され、会話は[Slack]()などのチャットが使われるようになりました。
そこで軽量マークアップ言語はプレーンテキストで記述できるのでコミュニケーションに役立ちます。