Slide 1

Slide 1 text

tbls活用事例 
 〜 ビューポイントから
 データベースを整理してみた話 〜
 株式会社マネーフォワード
 クラウド経費本部 プロダクト開発部
 手島 尚人 / tosite
 2024-04-23
 株式会社マネーフォワード 福岡開発拠点
 Money Forward Tech LT大会 vol.1


Slide 2

Slide 2 text

初めまして
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

株式会社マネーフォワード 
 クラウド経費本部 プロダクト開発部
 バックエンドエンジニア
 手島 尚人 / tosite
 
 趣味:
 キャンプ・登山・料理・ドライブ・温泉・車中泊


Slide 5

Slide 5 text

近況
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 6

Slide 6 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 7

Slide 7 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

My new gear...


Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

寝袋などの寝具を収納
 折りたたみ式の
 マットレス
 ライトなどの
 電気周りのギア
 キャンプ道具などの
 大物を床下収納
 イレクターパイプで
 ベッドを構築
 車内カーテンを設置


Slide 12

Slide 12 text

道の駅やサービスエリアで
 車中泊しています


Slide 13

Slide 13 text

仕事終わりにそのまま
 出かけられるので休日が
 一日増えたような感覚です


Slide 14

Slide 14 text

雨が降っても
 キャンプ場を
 キャンセルしなくて
 よくなりました!


Slide 15

Slide 15 text

閑話休題 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 16

Slide 16 text

JaSST Kyushuの
 実行委員長も
 やっています 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 17

Slide 17 text

今年も九州のどこかで開催するので
 もしテストや品質に興味がある方は
 続報をお待ちください!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 18

Slide 18 text

閑話休題 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 19

Slide 19 text

2023年8月
 からマネーフォワードで働いています
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 20

Slide 20 text

入社後はガーディアングループの一員として
 CRE(Customer Reliability Engineer)
 的な動きをしています
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 21

Slide 21 text

テックブログも
 書いているので
 見てください 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 22

Slide 22 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 7th長崎QDGでデータベースの 
 ドキュメント化について 
 LTしてきました
 必見!?JaSST'23 Kyushuの 
 舞台裏全部お見せしちゃいます 
 「ハンドラー」から見る 
 インシデント対応 
 ―起こってしまったその時に― 


Slide 23

Slide 23 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 7th長崎QDGでデータベースの 
 ドキュメント化について 
 LTしてきました


Slide 24

Slide 24 text

かいつまんで
 あらすじ
 ここまで2:30


Slide 25

Slide 25 text

2023年9月の話
 ※マネーフォワードに入社して1ヶ月後
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 26

Slide 26 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 27

Slide 27 text

話してきました!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 28

Slide 28 text

あらすじ
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 29

Slide 29 text

やめて!複雑なドメイン知識と大量のテーブルの海を
 見たら、転職したてで覚えることがいっぱいの
 tositeの精神は燃え尽きちゃう!
 お願い、全て暗記してtosite!
 あんたがER図を覚えればバリューが発揮できるんだから!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 30

Slide 30 text

次回「tosite死す」
 デュエルスタンバイ!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 31

Slide 31 text

…という夢を見たんだ
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 32

Slide 32 text

そういうつらい状況にならないように
 私はtblsというツールの導入を推進しました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 33

Slide 33 text

What is tbls?
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 34

Slide 34 text

端的に言えば
 データベースドキュメント
 自動生成ツール
 開発者の方は「Document as Code」というキーワードを使われています
 https://speakerdeck.com/k1low/phpconfuk-2023

Slide 35

Slide 35 text

https://github.com/k1LoW/tbls 参考: 出力イメージ


Slide 36

Slide 36 text

Phase 1. ローカルにドキュメント生成環境を準備 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 tblsのインストールと 
 ymlファイルを準備しただけ! 
 
 あとはMakefileに便利コマンドを 
 追加した程度の開発 
 1.ローカルのDBをマイグレーション 
  ファイルから構築
 2.tbls.ymlを作成
 3.コマンドを実行してデータベース 
  ドキュメントを生成 


Slide 37

Slide 37 text

Phase 2. CIでドキュメントのビハインドを検知する 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 CIで利用されるテーブルは常に 
 最新になることを利用 
 コミットされているドキュメントと 
 最新のドキュメントに差分がある 
 場合はCIを落とすようにした 
 1.CIのDBをマイグレーション 
  ファイルから構築
 2.CIのデータベースドキュメントを生成 
 3.CIとコミットしたデータベース 
  ドキュメントの差分を検知 


Slide 38

Slide 38 text

ER図が作られただけではなく
 データベースドキュメントが
 最新の状態に保たれる
 仕組みが構築できました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 39

Slide 39 text

…ですがいくつかの
 課題を残していました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 40

Slide 40 text

抱えている
 課題
 ここまで4:30


Slide 41

Slide 41 text

課題1. テーブルの関係性の全体像を把握しにくい
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 42

Slide 42 text

tblsの標準機能でも2テーブル間の
 リレーションは出力することができますが…
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 43

Slide 43 text

テーブルのまとまり
 を出力するのは難しいです
 例えばユーザー情報のテーブルのまとまりや契約情報のテーブルのまとまりなど
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 44

Slide 44 text

課題2. モデルにのみリレーションが定義されている
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 45

Slide 45 text

データベースの
 外部キー制約がなく
 tbls側からリレーションが検知できないケースがあります
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 46

Slide 46 text

MVC2フレームワークは
 ポリモーフィック関連付け
 などの強力な機能を有している反面
 しばしばこういったことを目にします
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 47

Slide 47 text

これらの課題を解決するために
 次の取り組みを行いました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 48

Slide 48 text

課題1への
 アプローチ
 ここまで5:30


Slide 49

Slide 49 text

課題1. テーブルの関係性の全体像を把握しにくい
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 50

Slide 50 text

tblsにはViewpointsという
 概念がありますが…
 ref: k1LoW/tbls#Viewpoints

Slide 51

Slide 51 text

より気軽にメンテナンスできるように
 一旦はLabelを使うこととしました
 ref: k1LoW/tbls#Labels

Slide 52

Slide 52 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 # ER図をsvg形式で出力する 
 tbls out -t svg -o #{path}.svg --label #{label} -c .tbls.yml # Markdown形式でドキュメントを生成する 
 tbls out -t md -o #{path}.md --label #{label} -c .tbls.yml 幸いにも次のコマンドで
 ラベル単位のドキュメントが生成できたからです


Slide 53

Slide 53 text

ただこれだけだとテーブル定義と
 ER図がバラバラに生成されるので…
 ref: k1LoW/tbls#Labels

Slide 54

Slide 54 text

そして以下コマンドで
 Markdownにsvgファイルを埋め込む
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 55

Slide 55 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 md = File.read("#{path_to_markdown }.md") .gsub( "---\n", "##Relations\n\n![er](#{label}.svg)\n\n---\n") File.write(path, md)

Slide 56

Slide 56 text

THE ☆ 力技
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 57

Slide 57 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 このあたりを再現

Slide 58

Slide 58 text

ですがこのやり方を使わなくても
 Viewpointsがあるので
 今から導入される方はそちらをおすすめします
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 59

Slide 59 text

課題1. テーブルの関係性の全体像を把握しにくい
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 60

Slide 60 text

課題1. テーブルの関係性の全体像を把握しにくい
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 61

Slide 61 text

課題2への
 アプローチ
 ここまで6:30


Slide 62

Slide 62 text

課題2. モデルにのみリレーションが定義されている
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 63

Slide 63 text

…の前に
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 64

Slide 64 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 cat .tbls.yml | wc -l

Slide 65

Slide 65 text

4,647行
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 66

Slide 66 text

😱
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 67

Slide 67 text

さすがにメンテナンスがつらいので
 定義ファイルを分割
 する対応を行いました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 68

Slide 68 text

実装イメージ
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 69

Slide 69 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 70

Slide 70 text

編集するべきファイル
 が分割されたことで保守性が上がった
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 71

Slide 71 text

改めて
 課題2. モデルにのみリレーションが定義されている
 の解決策を考える
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 72

Slide 72 text

モデルにだけ定義があって
 外部キー制約がないために
 tblsがリレーションを検知できないのが問題
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 73

Slide 73 text

モデルにだけ定義がある?
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 74

Slide 74 text

       |
    \  __  /
    _ (m) _ ピコーン
       |ミ|
     /  `´  \
      ('A`)    
      ノヽノヽ
       く く
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 75

Slide 75 text

せや!モデルからリレーションを抽出したろ!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 76

Slide 76 text

Ruby on Railsには
 reflect_on_all_associations
 というメソッドがあります
 ref: reflect_on_all_associations

Slide 77

Slide 77 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 78

Slide 78 text

そこからさらに次のコードから
 モデル間の親子関係
 を取得できます
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 79

Slide 79 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜  models = ActiveRecord::Base .descendants.reject(& :abstract_class? )  models.each do |model| model.reflect_on_all_associations.each do |reflection|   child_table = reflection.active_record&.table_name   parent_table = reflection.klass&.table_name pk = reflection.klass&.primary_key fk = reflection.foreign_key end  end

Slide 80

Slide 80 text

これで親子間テーブルと
 キーのペアが取得できた!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 81

Slide 81 text

ですが
 ここでも問題が…
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 82

Slide 82 text

検証段階ではリレーションの精度が100%で出力されず
 我々はこのリレーションを
 どこまで信用するかという問題がありました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 83

Slide 83 text

ですが
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 84

Slide 84 text

社内向けのドキュメントであること
 とにかく概要を掴みたいこと
 最悪間違っていた場合手動で更新すればいいこと
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 85

Slide 85 text

以上のことから
 100点のリレーションではありませんが
 70点のリレーションを構築すること
 を目標にしました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 86

Slide 86 text

ここで先ほど対応した
 定義ファイル分割
 が活きてきます
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 87

Slide 87 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 88

Slide 88 text

tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 89

Slide 89 text

このようにファイルを分割したことによって
 自動で分割した定義ファイルを
 常に更新できるようになりました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 90

Slide 90 text

課題2. モデルにのみリレーションが定義されている
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 91

Slide 91 text

課題2. モデルにのみリレーションが定義されている
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 92

Slide 92 text

本題: 結
 ここまで9:00


Slide 93

Slide 93 text

これらの対応によって
 明確にデータベースから
 アプリケーションを理解
 できるようになりました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 94

Slide 94 text

チームメンバーや
 新しくジョインしたメンバーからも
 たくさんのポジティブなコメントをもらえました
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 95

Slide 95 text

利用者からの声
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 入社してからプロダクトのキャッチアップを
 する際、また何か調査する際に
 めちゃくちゃお世話になってます!!!
 中でもテーブルやカラムのコメントが
 ありがたく、細かなRailsの実装を
 見なくとも、それらが何をしているのかが
 わかるのは本当にありがたいです🙏


Slide 96

Slide 96 text

利用者からの声
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 入社してからプロダクトのキャッチアップを
 する際、また何か調査する際に
 めちゃくちゃお世話になってます!!!
 中でもテーブルやカラムのコメントが
 ありがたく、細かなRailsの実装を
 見なくとも、それらが何をしているのかが
 わかるのは本当にありがたいです🙏
 ER 図をシュッと見ることができて便利だと
 思いました。
 リレーションで困ったらすぐ活用してます。


Slide 97

Slide 97 text

入社してからプロダクトのキャッチアップを
 する際、また何か調査する際に
 めちゃくちゃお世話になってます!!!
 中でもテーブルやカラムのコメントが
 ありがたく、細かなRailsの実装を
 見なくとも、それらが何をしているのかが
 わかるのは本当にありがたいです🙏
 ER 図をシュッと見ることができて便利だと
 思いました。
 リレーションで困ったらすぐ活用してます。
 利用者からの声
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 複雑なリレーションを持つテーブルが
 視覚的に分かるのがとてもいいですね。
 有志が追加してくれているdescriptionも
 とても重宝しています。
 開発・調査で迷った際に
 参照させていただいています。


Slide 98

Slide 98 text

入社してからプロダクトのキャッチアップを
 する際、また何か調査する際に
 めちゃくちゃお世話になってます!!!
 中でもテーブルやカラムのコメントが
 ありがたく、細かなRailsの実装を
 見なくとも、それらが何をしているのかが
 わかるのは本当にありがたいです🙏
 複雑なリレーションを持つテーブルが
 視覚的に分かるのがとてもいいですね。
 有志が追加してくれているdescriptionも
 とても重宝しています。
 開発・調査で迷った際に
 参照させていただいています。
 ER 図をシュッと見ることができて便利だと
 思いました。
 リレーションで困ったらすぐ活用してます。
 利用者からの声
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 開発チームの時は、実装する前に
 リレーションがどうなっているか確認できて
 とてもよかったです!
 ガーディアンになってからは主に調査で
 活用させてもらいました!
 シュッと確認できるので、とても
 助かってます!ありがとうございます!


Slide 99

Slide 99 text

入社してからプロダクトのキャッチアップを
 する際、また何か調査する際に
 めちゃくちゃお世話になってます!!!
 中でもテーブルやカラムのコメントが
 ありがたく、細かなRailsの実装を
 見なくとも、それらが何をしているのかが
 わかるのは本当にありがたいです🙏
 複雑なリレーションを持つテーブルが
 視覚的に分かるのがとてもいいですね。
 有志が追加してくれているdescriptionも
 とても重宝しています。
 開発・調査で迷った際に
 参照させていただいています。
 ER 図をシュッと見ることができて便利だと
 思いました。
 リレーションで困ったらすぐ活用してます。
 利用者からの声
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 開発チームの時は、実装する前に
 リレーションがどうなっているか確認できて
 とてもよかったです!
 ガーディアンになってからは主に調査で
 活用させてもらいました!
 シュッと確認できるので、とても
 助かってます!ありがとうございます!
 ビューの機能がすごくありがたいです!
 膨大なコードベースなので対象の関心ごとを理解するのに
 すごく役立っています!
 また、CIで腐らないER図になっているところも非常に
 ありがたいです!
 既存のER図は手運用だったため網羅されていない点や、
 最新状態でないという点が大きな問題だったかと
 思っていますが、 tblsの導入でこれらの点が払拭
 されたと思っています!(入社のタイミングで欲しかった!)


Slide 100

Slide 100 text

うれしい!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 101

Slide 101 text

すべてが参考になるとは思いませんが
 皆さんがドキュメント化で迷った際は
 今回のLTを思い出してもらえると嬉しいです
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 102

Slide 102 text

確かにER図を整理するということは
 簡単なことではありませんし
 非常に根気の必要な作業です
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 103

Slide 103 text

ですが…
 後々レバレッジが効いてくるものなので
 これを機にドキュメント化に
 取り組んでみてはいかがでしょうか?
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 104

Slide 104 text

終わりに
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 105

Slide 105 text

マネーフォワード福岡開発拠点では
 一緒に働ける仲間を募集しています!
 https://hrmos.co/pages/moneyforward/jobs?category=1666323298559537153 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 106

Slide 106 text

福岡開発拠点のサイトもあるので
 ぜひご覧ください!
 https://fukuoka.moneyforward.com 
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜

Slide 107

Slide 107 text

ご清聴ありがとう
 ございました!
 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜