もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

tblsの論理設定を使ってみる

はじめに

こんばんは。

久々のブログです。

前回tblsの記事をあげたところ、開発者の方からこんな意見をもらいました。

ちなみに以前の記事はこちら

kojirooooocks.hatenablog.com

早速やってみます。

本題

1. サンプルテーブル群作成

サンプルで使用するテーブル群は前回と同様ですが、リレーションやらコメントやらをすべて取っ払ったテーブル設計にしてみました。

CREATE TABLE `master_categories` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(256) NOT NULL DEFAULT '',
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `master_items` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `category_id` int(11) unsigned NOT NULL,
  `name` varchar(256) NOT NULL DEFAULT '',
  `price` int(11) unsigned NOT NULL DEFAULT 0,
  `delivery_cost` int(11) unsigned NOT NULL DEFAULT 0,
  `stock` int(11) unsigned NOT NULL DEFAULT 0,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `userId` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `master_tags` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `short_name` varchar(64) NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `master_tag_relations` (
  `tag_id` int(11) unsigned NOT NULL,
  `item_id` int(11) unsigned NOT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`tag_id`,`item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

このテーブル群を、論理値設定で前回のテーブル設計と同じ情報を作り出したいと思います。

2. .tbls.ymlの設定

今回の .tbls.yml の設定は以下。

dsn: mysql://local_user:1qazxcvb@127.0.0.1:3306/local_test_db
docPath: schema

comments:
  -
    table: master_categories
    tableComment: カテゴリ管理テーブル
    columnComments:
      id: PrimaryKey
      name: カテゴリ名
      created: 登録日
      modified: 更新日
  -
    table: master_items
    tableComment: アイテム管理テーブル
    columnComments:
      id: PrimaryKey
      category_id: カテゴリID
      name: アイテム名
      price: 価格
      delivery_cost: 配送料
      stock: 在庫
      created: 登録日
      modified: 更新日
  -
    table: master_tags
    tableComment: タグ管理テーブル
    columnComments:
      id: PrimaryKey
      name: タグ名
      short_name: ふりがな
      created: 登録日
      modified: 更新日
  -
    table: master_tag_relations
    tableComment: タグ中間テーブル
    columnComments:
      tag_id: タグID
      item_id: アイテムID
      created: 登録日

relations:
  -
    table: master_items
    columns:
      - category_id
    parentTable: master_categories
    parentColumns:
      - id
    def: master_items->master_categories
  -
    table: master_tag_relations
    columns:
      - tag_id
    parentTable: master_tags
    parentColumns:
      - id
    def: master_tag_relations->master_tags
  -
    table: master_tag_relations
    columns:
      - item_id
    parentTable: master_items
    parentColumns:
      - id
    def: master_tag_relations->master_items

3. 結果確認

実行してみます。

$ tbls doc
schema/schema.png
schema/master_categories.png
schema/master_items.png
schema/master_tag_relations.png
schema/master_tags.png
schema/README.md
schema/master_categories.md
schema/master_items.md
schema/master_tag_relations.md
schema/master_tags.md

f:id:kojirooooocks:20190727041229p:plain

問題なく作成されています!

実際の情報を確認してみます。

f:id:kojirooooocks:20190727041241p:plain

リレーションは問題なさそうです。

f:id:kojirooooocks:20190727041252p:plain

コメントも問題なさそうです!

終わりに

実際に試してみましたが、設定も簡単でとても使いやすかったです。

ymlでテーブルごとに設定できるので、設計的に足りてないものだけ論理値設定してあげるなど柔軟なこともできると思います。

PlantUMLでもoutput出来るようなので試してみました。

f:id:kojirooooocks:20190727041303p:plain

問題なく作成されました。が、情報量的にやはり markdown で出力したほうが良さそうかな?と思いました。

現場からは以上です。