Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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\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活用事例 〜 ビューポイントからデータベースを整理してみた話 〜