Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[2024/04/23]tbls活用事例 〜 ビューポイントから データベースを整理してみた話 〜
Search
tosite
April 23, 2024
Technology
0
430
[2024/04/23]tbls活用事例 〜 ビューポイントから データベースを整理してみた話 〜
Money Forward Tech LT大会 vol.1
https://moneyforward.connpass.com/event/296578/
tosite
April 23, 2024
Tweet
Share
More Decks by tosite
See All by tosite
[2025-02-07]生成AIで変える問い合わせの未来 〜チームグローバル化の香りを添えて〜
tosite
1
430
[2024/10/25]CREの守護者たち 〜DevOps×シフトレフト - 俺またプロダクト救っちゃいました!?〜
tosite
0
810
[2024/07/11]Guardianとして生まれ変わった俺は攻めと守りの運用で無双する 〜守りの天才が考える、攻めの運用術〜
tosite
0
900
[2023/09/15]ER図クエスト 過ぎ去りしドキュメントを求めて 〜複雑性に眠る秘宝〜
tosite
0
640
[2022/12/07]この素晴らしいアプリケーションにテストコードを
tosite
0
43
[2022/03/25]コミュニティから学ぶエンジニアリング
tosite
0
350
[2021/12/16]テストコードのないレガシーアプリケーションとの向き合い方
tosite
0
66
[2019/07/27]はじめよう、ニコカレ!
tosite
0
40
[2019/03/23]プルリクとの上手な付き合い方
tosite
0
22
Other Decks in Technology
See All in Technology
レビューを増やしつつ 高評価維持するテクニック
tsuzuki817
1
680
2.5Dモデルのすべて
yu4u
2
830
プロセス改善による品質向上事例
tomasagi
2
2.5k
Cloud Spanner 導入で実現した快適な開発と運用について
colopl
1
540
Swiftの “private” を テストする / Testing Swift "private"
yutailang0119
0
130
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
400
組織貢献をするフリーランスエンジニアという生き方
n_takehata
1
1.3k
関東Kaggler会LT: 人狼コンペとLLM量子化について
nejumi
3
570
表現を育てる
kiyou77
1
210
クラウドサービス事業者におけるOSS
tagomoris
0
250
第13回 Data-Centric AI勉強会, 画像認識におけるData-centric AI
ksaito_osx
0
370
明日からできる!技術的負債の返済を加速するための実践ガイド~『ホットペッパービューティー』の事例をもとに~
recruitengineers
PRO
3
380
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
We Have a Design System, Now What?
morganepeng
51
7.4k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Writing Fast Ruby
sferik
628
61k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.3k
Raft: Consensus for Rubyists
vanstee
137
6.8k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Practical Orchestrator
shlominoach
186
10k
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
Measuring & Analyzing Core Web Vitals
bluesmoon
6
240
Automating Front-end Workflow
addyosmani
1368
200k
Transcript
tbls活用事例 〜 ビューポイントから データベースを整理してみた話 〜 株式会社マネーフォワード クラウド経費本部 プロダクト開発部 手島
尚人 / tosite 2024-04-23 株式会社マネーフォワード 福岡開発拠点 Money Forward Tech LT大会 vol.1
初めまして tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
None
株式会社マネーフォワード クラウド経費本部 プロダクト開発部 バックエンドエンジニア 手島 尚人 / tosite
趣味: キャンプ・登山・料理・ドライブ・温泉・車中泊
近況 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
None
My new gear...
None
寝袋などの寝具を収納 折りたたみ式の マットレス ライトなどの 電気周りのギア キャンプ道具などの 大物を床下収納 イレクターパイプで ベッドを構築 車内カーテンを設置
道の駅やサービスエリアで 車中泊しています
仕事終わりにそのまま 出かけられるので休日が 一日増えたような感覚です
雨が降っても キャンプ場を キャンセルしなくて よくなりました!
閑話休題 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
JaSST Kyushuの 実行委員長も やっています tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
今年も九州のどこかで開催するので もしテストや品質に興味がある方は 続報をお待ちください! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
閑話休題 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
2023年8月 からマネーフォワードで働いています tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
入社後はガーディアングループの一員として CRE(Customer Reliability Engineer) 的な動きをしています tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
テックブログも 書いているので 見てください tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 7th長崎QDGでデータベースの ドキュメント化について LTしてきました 必見!?JaSST'23
Kyushuの 舞台裏全部お見せしちゃいます 「ハンドラー」から見る インシデント対応 ―起こってしまったその時に―
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 7th長崎QDGでデータベースの ドキュメント化について LTしてきました
かいつまんで あらすじ ここまで2:30
2023年9月の話 ※マネーフォワードに入社して1ヶ月後 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
話してきました! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
あらすじ tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
やめて!複雑なドメイン知識と大量のテーブルの海を 見たら、転職したてで覚えることがいっぱいの tositeの精神は燃え尽きちゃう! お願い、全て暗記してtosite! あんたがER図を覚えればバリューが発揮できるんだから! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
次回「tosite死す」 デュエルスタンバイ! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
…という夢を見たんだ tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
そういうつらい状況にならないように 私はtblsというツールの導入を推進しました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
What is tbls? tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
端的に言えば データベースドキュメント 自動生成ツール 開発者の方は「Document as Code」というキーワードを使われています https://speakerdeck.com/k1low/phpconfuk-2023
https://github.com/k1LoW/tbls 参考: 出力イメージ
Phase 1. ローカルにドキュメント生成環境を準備 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 tblsのインストールと
ymlファイルを準備しただけ! あとはMakefileに便利コマンドを 追加した程度の開発 1.ローカルのDBをマイグレーション ファイルから構築 2.tbls.ymlを作成 3.コマンドを実行してデータベース ドキュメントを生成
Phase 2. CIでドキュメントのビハインドを検知する tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 CIで利用されるテーブルは常に
最新になることを利用 コミットされているドキュメントと 最新のドキュメントに差分がある 場合はCIを落とすようにした 1.CIのDBをマイグレーション ファイルから構築 2.CIのデータベースドキュメントを生成 3.CIとコミットしたデータベース ドキュメントの差分を検知
ER図が作られただけではなく データベースドキュメントが 最新の状態に保たれる 仕組みが構築できました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
…ですがいくつかの 課題を残していました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
抱えている 課題 ここまで4:30
課題1. テーブルの関係性の全体像を把握しにくい tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tblsの標準機能でも2テーブル間の リレーションは出力することができますが… tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
テーブルのまとまり を出力するのは難しいです 例えばユーザー情報のテーブルのまとまりや契約情報のテーブルのまとまりなど tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
課題2. モデルにのみリレーションが定義されている tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
データベースの 外部キー制約がなく tbls側からリレーションが検知できないケースがあります tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
MVC2フレームワークは ポリモーフィック関連付け などの強力な機能を有している反面 しばしばこういったことを目にします tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
これらの課題を解決するために 次の取り組みを行いました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
課題1への アプローチ ここまで5:30
課題1. テーブルの関係性の全体像を把握しにくい tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tblsにはViewpointsという 概念がありますが… ref: k1LoW/tbls#Viewpoints
より気軽にメンテナンスできるように 一旦はLabelを使うこととしました ref: k1LoW/tbls#Labels
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 幸いにも次のコマンドで ラベル単位のドキュメントが生成できたからです
ただこれだけだとテーブル定義と ER図がバラバラに生成されるので… ref: k1LoW/tbls#Labels
そして以下コマンドで Markdownにsvgファイルを埋め込む tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 md = File.read("#{path_to_markdown }.md") .gsub( "---\n",
"##Relations\n\n\n\n---\n") File.write(path, md)
THE ☆ 力技 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 このあたりを再現
ですがこのやり方を使わなくても Viewpointsがあるので 今から導入される方はそちらをおすすめします tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
課題1. テーブルの関係性の全体像を把握しにくい tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
課題1. テーブルの関係性の全体像を把握しにくい tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
課題2への アプローチ ここまで6:30
課題2. モデルにのみリレーションが定義されている tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
…の前に tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 cat .tbls.yml | wc -l
4,647行 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
😱 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
さすがにメンテナンスがつらいので 定義ファイルを分割 する対応を行いました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
実装イメージ tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
編集するべきファイル が分割されたことで保守性が上がった tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
改めて 課題2. モデルにのみリレーションが定義されている の解決策を考える tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
モデルにだけ定義があって 外部キー制約がないために tblsがリレーションを検知できないのが問題 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
モデルにだけ定義がある? tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
| \ __ / _ (m) _ ピコーン |ミ|
/ `´ \ ('A`) ノヽノヽ く く tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
せや!モデルからリレーションを抽出したろ! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
Ruby on Railsには reflect_on_all_associations というメソッドがあります ref: reflect_on_all_associations
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
そこからさらに次のコードから モデル間の親子関係 を取得できます tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
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
これで親子間テーブルと キーのペアが取得できた! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
ですが ここでも問題が… tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
検証段階ではリレーションの精度が100%で出力されず 我々はこのリレーションを どこまで信用するかという問題がありました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
ですが tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
社内向けのドキュメントであること とにかく概要を掴みたいこと 最悪間違っていた場合手動で更新すればいいこと tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
以上のことから 100点のリレーションではありませんが 70点のリレーションを構築すること を目標にしました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
ここで先ほど対応した 定義ファイル分割 が活きてきます tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
このようにファイルを分割したことによって 自動で分割した定義ファイルを 常に更新できるようになりました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
課題2. モデルにのみリレーションが定義されている tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
課題2. モデルにのみリレーションが定義されている tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
本題: 結 ここまで9:00
これらの対応によって 明確にデータベースから アプリケーションを理解 できるようになりました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
チームメンバーや 新しくジョインしたメンバーからも たくさんのポジティブなコメントをもらえました tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
利用者からの声 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 入社してからプロダクトのキャッチアップを する際、また何か調査する際に めちゃくちゃお世話になってます!!! 中でもテーブルやカラムのコメントが ありがたく、細かなRailsの実装を
見なくとも、それらが何をしているのかが わかるのは本当にありがたいです🙏
利用者からの声 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 入社してからプロダクトのキャッチアップを する際、また何か調査する際に めちゃくちゃお世話になってます!!! 中でもテーブルやカラムのコメントが ありがたく、細かなRailsの実装を
見なくとも、それらが何をしているのかが わかるのは本当にありがたいです🙏 ER 図をシュッと見ることができて便利だと 思いました。 リレーションで困ったらすぐ活用してます。
入社してからプロダクトのキャッチアップを する際、また何か調査する際に めちゃくちゃお世話になってます!!! 中でもテーブルやカラムのコメントが ありがたく、細かなRailsの実装を 見なくとも、それらが何をしているのかが わかるのは本当にありがたいです🙏 ER 図をシュッと見ることができて便利だと 思いました。
リレーションで困ったらすぐ活用してます。 利用者からの声 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 複雑なリレーションを持つテーブルが 視覚的に分かるのがとてもいいですね。 有志が追加してくれているdescriptionも とても重宝しています。 開発・調査で迷った際に 参照させていただいています。
入社してからプロダクトのキャッチアップを する際、また何か調査する際に めちゃくちゃお世話になってます!!! 中でもテーブルやカラムのコメントが ありがたく、細かなRailsの実装を 見なくとも、それらが何をしているのかが わかるのは本当にありがたいです🙏 複雑なリレーションを持つテーブルが 視覚的に分かるのがとてもいいですね。 有志が追加してくれているdescriptionも
とても重宝しています。 開発・調査で迷った際に 参照させていただいています。 ER 図をシュッと見ることができて便利だと 思いました。 リレーションで困ったらすぐ活用してます。 利用者からの声 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 開発チームの時は、実装する前に リレーションがどうなっているか確認できて とてもよかったです! ガーディアンになってからは主に調査で 活用させてもらいました! シュッと確認できるので、とても 助かってます!ありがとうございます!
入社してからプロダクトのキャッチアップを する際、また何か調査する際に めちゃくちゃお世話になってます!!! 中でもテーブルやカラムのコメントが ありがたく、細かなRailsの実装を 見なくとも、それらが何をしているのかが わかるのは本当にありがたいです🙏 複雑なリレーションを持つテーブルが 視覚的に分かるのがとてもいいですね。 有志が追加してくれているdescriptionも
とても重宝しています。 開発・調査で迷った際に 参照させていただいています。 ER 図をシュッと見ることができて便利だと 思いました。 リレーションで困ったらすぐ活用してます。 利用者からの声 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜 開発チームの時は、実装する前に リレーションがどうなっているか確認できて とてもよかったです! ガーディアンになってからは主に調査で 活用させてもらいました! シュッと確認できるので、とても 助かってます!ありがとうございます! ビューの機能がすごくありがたいです! 膨大なコードベースなので対象の関心ごとを理解するのに すごく役立っています! また、CIで腐らないER図になっているところも非常に ありがたいです! 既存のER図は手運用だったため網羅されていない点や、 最新状態でないという点が大きな問題だったかと 思っていますが、 tblsの導入でこれらの点が払拭 されたと思っています!(入社のタイミングで欲しかった!)
うれしい! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
すべてが参考になるとは思いませんが 皆さんがドキュメント化で迷った際は 今回のLTを思い出してもらえると嬉しいです tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
確かにER図を整理するということは 簡単なことではありませんし 非常に根気の必要な作業です tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
ですが… 後々レバレッジが効いてくるものなので これを機にドキュメント化に 取り組んでみてはいかがでしょうか? tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
終わりに tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
マネーフォワード福岡開発拠点では 一緒に働ける仲間を募集しています! https://hrmos.co/pages/moneyforward/jobs?category=1666323298559537153 tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
福岡開発拠点のサイトもあるので ぜひご覧ください! https://fukuoka.moneyforward.com tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜
ご清聴ありがとう ございました! tbls活用事例 〜 ビューポイントからデータベースを整理してみた話 〜