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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Yoshitaka Kawashima
April 12, 2019
Programming
26k
59
Share
履歴を持つデータの設計
酔いどれ設計ナイト2019の発表資料です。
Yoshitaka Kawashima
April 12, 2019
Other Decks in Programming
See All in Programming
Exploring RuboCop with MCP
koic
0
500
瑠璃の宝石に学ぶ技術の声の聴き方 / 【劇場版】アニメから得た学びを発表会2026 #エンジニアニメ
mazrean
0
240
LM Linkで(非力な!)ノートPCでローカルLLM
seosoft
0
480
Java 21/25 Virtual Threads 소개
debop
0
350
実践CRDT
tamadeveloper
0
540
「速くなった気がする」をデータで疑う
senleaf24
0
170
Claude Codeをカスタムして自分だけのClaude Codeを作ろう
terisuke
0
120
PHPで TLSのプロトコルを実装してみるをもう一度しゃべりたい
higaki_program
0
200
AI時代の脳疲弊と向き合う ~言語学としてのPHP~
sakuraikotone
1
1.9k
L’IA au service des devs : Anatomie d'un assistant de Code Review
toham
0
240
Mastering Event Sourcing: Your Parents Holidayed in Yugoslavia
super_marek
0
150
의존성 주입과 모듈화
fornewid
0
130
Featured
See All Featured
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
1
180
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
190
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.9k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Marketing to machines
jonoalderson
1
5.2k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
120
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.5k
WCS-LA-2024
lcolladotor
0
530
Designing for Performance
lara
611
70k
Exploring anti-patterns in Rails
aemeredith
3
320
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
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のバージョンとタグの関係性のイメージ 古い世代や未来の世代も画一的に扱う業務に おいては、このパターンを用いる。
まとめ 「履歴」というワードで思考停止して、 実装手段の話を始めてはいけない 業務での利用用途を突き詰めて考え、 イミュータブルデータを出来るだけ作るように がんばりましょう。