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
履歴を持つデータの設計
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yoshitaka Kawashima
April 12, 2019
Programming
59
26k
履歴を持つデータの設計
酔いどれ設計ナイト2019の発表資料です。
Yoshitaka Kawashima
April 12, 2019
Tweet
Share
Other Decks in Programming
See All in Programming
Swift ConcurrencyでよりSwiftyに
yuukiw00w
0
250
エンジニアの「手元の自動化」を加速するn8n 2026.02.27
symy2co
0
130
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
370
nilとは何か 〜interfaceの構造とnil!=nilから理解する〜
kuro_kurorrr
3
1.9k
Claude Code の Skill で複雑な既存仕様をすっきり整理しよう
yuichirokato
1
360
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
150
LangChain4jとは一味違うLangChain4j-CDI
kazumura
1
170
go directiveを最新にしすぎないで欲しい話──あるいは、Go 1.26からgo mod initで作られるgo directiveの値が変わる話 / Go 1.26 リリースパーティ
arthur1
2
530
技術検証結果の整理と解析をAIに任せよう!
keisukeikeda
0
110
Go1.26 go fixをプロダクトに適用して困ったこと
kurakura0916
0
360
Docコメントで始める簡単ガードレール
keisukeikeda
1
110
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
130
Featured
See All Featured
How GitHub (no longer) Works
holman
316
140k
Technical Leadership for Architectural Decision Making
baasie
3
280
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
0
150
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
98
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
150
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The SEO Collaboration Effect
kristinabergwall1
0
390
The Cult of Friendly URLs
andyhume
79
6.8k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
190
Between Models and Reality
mayunak
2
230
Designing Powerful Visuals for Engaging Learning
tmiket
0
270
Transcript
履歴を持つデータの設計 kawasima 酔いどれ設計ナイト2019
課題 • 適用開始日 • 変更履歴 • 削除フラグ • …
ありがちなアドバイス • 最新のものだけ残して、あとはKVSに 入れろ • フラグじゃなくてステータスにしろ • ビュー (マテビュー)でなんとかしろ •
…
業務を考えずにパターンは決まらない イミュータブルデータモデルに沿って、まずは エンティティを分類 会員ID 姓 名 郵便番号 住所 電話番号 注文ID
会員ID 注文日時 リソース イベント 会員 注文 https://www.slideshare.net/kawasima/ss-40471672
イベントとリソースそれぞれで、 「履歴」について考えてみます
イベントの履歴 イベントはそもそも履歴だ。
リソースの変更イベント リソースエンティティに更新日時をもたせたくなるのは、リソー スにまつわるイベントが洗い出せていないことが原因です。 会員ID 姓 名 郵便番号 住所 電話番号 更新日時
会員 • 会員が自分自身で会員情報変更ペー ジから変更する • 規約に違反した会員であったため、 お客さまセンターのオペレータが強 制退会をおこなう。 • 会員からの「誤った退会をしてし まったので取り消して欲しい」との 問合せを受けて、お客さまセンター のオペレータが会員の復会をおこな う。
業務に沿ってイベントを設計する 会員ID 姓 名 郵便番号 住所 電話番号 会員 会員変更ID 会員ID
姓 名 郵便番号 住所 電話番号 変更日時 会員変更 強制退会ID 会員ID 強制退会日時 強制退会理由 強制退会 復会ID 会員変更ID 復会日時 復会
子リソースをたくさんもつリソースの 変更イベント 全部のエンティティ分、変更履歴テーブルもつの?
こういうリソースの変更履歴用途 • カスタマ問い合わせ対応 • 変更トリガーでのストリーム処理 (検索インデックス作成など ) • 属性での複雑な検索はいらない •
時系列DBやドキュメントデータベースに 突っ込む
ロングタームイベントパターン • イベントでもステータス管理が必要なケース • 長期間で完結するイベントはステータスをもち ステータス遷移のイベントを詳細イベントとし て記録する
None
リソースの履歴 • 買ったときの商品価格を参照したい。 • 駅テーブルに2020年〜高輪ゲートウェイが追 加される。 などなど →「履歴」というよりは「世代」になる。
デメリット大きいので、適用することは少ない。 が、マスタ管理機能など入力のみのものであれば用いる ことあるかな…
過去と予定を分けて扱えれば シングル世代テーブルパターンでもOK
バックエンド業務では世代が 必要で、コンシューマ向けの 機能では最新のもののみがあ ればよい、というパターンで は活用できる。
Gitのバージョンとタグの関係性のイメージ 古い世代や未来の世代も画一的に扱う業務に おいては、このパターンを用いる。
まとめ 「履歴」というワードで思考停止して、 実装手段の話を始めてはいけない 業務での利用用途を突き詰めて考え、 イミュータブルデータを出来るだけ作るように がんばりましょう。