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
クックパッドマートの失敗したデータ設計 Before / After 大放出
Search
Motoi Okuzono
July 01, 2022
Programming
30k
23
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
クックパッドマートの失敗したデータ設計 Before / After 大放出
https://cookpad.connpass.com/event/249346/
にて発表。
Motoi Okuzono
July 01, 2022
More Decks by Motoi Okuzono
See All by Motoi Okuzono
生鮮 EC プラットフォームを支えるアプリケーションたち
mokuzon
0
250
エンジニアによるエンジニアのためのクックパッドマートLIVE説明会 - クックパッドマートのサーバーサイド開発 -
mokuzon
0
2k
クックパッド料理教室 における開発
mokuzon
0
82
Other Decks in Programming
See All in Programming
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
5.7k
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
コーディングルールの鮮度を保ちたい for SRE NEXT 2026 / keep-fresh-go-internal-conventions-sre-next-2026
handlename
0
140
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
150
どこまでゆるくて許されるのか
tk3fftk
0
470
【やさしく解説 設計編 #1】「ドメイン駆動」と「実装駆動」ってなに? 〜設計の考え方を、たとえ話で学ぼう〜
panda728
PRO
1
110
はてなアカウント基盤 State of the Union
cockscomb
1
1.3k
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
130
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
150
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
840
【SRE NEXT 2026 Lunch Session】一人目専任SREの立ち上げを加速する ― AIと進めたオンボーディングで2分を0.04秒にした話
pkshadeck
PRO
0
2.3k
act2-costs.pdf
sumedhbala
0
110
Featured
See All Featured
Crafting Experiences
bethany
1
210
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
A better future with KSS
kneath
240
18k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Discover your Explorer Soul
emna__ayadi
2
1.2k
From π to Pie charts
rasagy
0
230
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
180
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Transcript
© 2022 Cookpad Inc. クックパッドマートの失敗したデータ設計 Before / After 大放出 Cookpad
Tech Kitchen #27〜Rails/Next.js/IoTによる食品流通〜 / 2022年6月30日(木)
© 2022 Cookpad Inc. 2 バックエンドエンジニア Who? @mokuzon Motoi Okuzono
職種 経歴 SNS 趣味 2016/08 クックパッド入社 社内情報共有ツール開発 2017/05 クックパッド料理教室 2019/07 クックパッドマート 販売者 2019/12 クックパッドマート 流通 2022/07 クックパッドマート EC @mokuzon オーケストラでホルンを吹く 飲酒 最近はモンハン はやくサンブレイクやりたい
クックパッドマートで生鮮食品流通を実現するには 物理的・論理的を問わず様々な要素があります その中からいくつかを失敗談を交えてご紹介していきます © 2022 Cookpad Inc. 3
© 2022 Cookpad Inc. 4 • 商品や、商品をいれるコンテナに貼る
• ユーザーやドライバーが商品や配送指示を認識するための重要なインターフェース • 種類がいろいろあって、補助的なものも含めると 10 種類ぐらいある ラベル
© 2022 Cookpad Inc. 5 ラベル • ラベルの種類ごとにテーブルがあり •
1 枚ごとに 1 レコード • その日の出荷する注文が締め切られたタイミングで一斉にレコード書き込み • そのレコードを元にラベルプリンターで印刷 • 印刷のためのデータとログとしてのデータが共通 Before • 配送データが書き換わると印刷前にラベルデータも作り直し • 販売者の欠品処理とデータ作成タイミングが同じでエラーが多発 Problem
© 2022 Cookpad Inc. 6 ラベル • 印刷データは配送データから動的に生成 •
その印刷データをログとして印刷時にレコード書き込み • クックパッドマートにおける宣言的ラベル生成 https://techlife.cookpad.com/entry/2021/08/18/100000 After 詳しい人 イベント参加者 限定コンテンツ イベント参加者 限定コンテンツ
© 2022 Cookpad Inc. 7 営業日 • 定休日と臨時休業日をそれぞれ別テーブルに記録 Before
• 定休日に臨時営業したくなったらもう一つテーブルを追加...? • 営業有無を算出するロジックが複雑化し扱いづらい • 臨時休業と臨時営業を同時に設定できないようにしたりも必要 Problem • 販売者や受け取り場所にはお休みの日があるところもある • お盆やお正月など不規則なスケジュールもある
© 2022 Cookpad Inc. 8 営業日 • 営業の有無をベタに保存するテーブルを作り、それを参照 •
上記テーブルのデータを作るための規則を保存するテーブルも用意 • 営業日などの規則性と例外を扱うための設計 https://blog.osa.in.net/schedule-and-scheduling-policies-pattern/ After 詳しい人 イベント参加者 限定コンテンツ イベント参加者 限定コンテンツ
© 2022 Cookpad Inc. 9 留まることの表現 • 商品やそれが入ったコンテナはいくつかの拠点に留まり 配送や受け取りを待つ
• 同じ場所を同じ時間で取り合わないように管理が必要 受け取り場所 / ステーション 配送拠点 / ハブ ココに決めた! ココに決めた!
© 2022 Cookpad Inc. 10 留まることの表現 • 「この便に乗っているものは何時から何時」というドメイン知識から
「これとこれは被る」というのをすべて網羅して判定 • 今日出荷された商品は昨日出荷された商品が最初に到達するハブでは時間帯が被らない • 今日出荷された商品は昨日出荷された商品が最後に到達するハブでは時間帯が被る • etc… • というような条件を愚直に十数件判定 Before • 競合するパターンをすべて洗い出すのは難しい ◦ 実際に考慮漏れをして競合させてしまい損失が出たことも 😭 ◦ 肌感では複数サイクル (マートでは日) を跨いだ影響が出るようになると 考慮漏れが発生しだす Problem ココに入れたい 被ってるコンテナある?
© 2022 Cookpad Inc. 11 留まることの表現 • 素朴に留まることを表現するテーブルを用意
• クックパッドマート最難解ロジック!?「採番」 https://techlife.cookpad.com/entry/cookpad-mart-assignments-2022 After 詳しい人 イベント参加者 限定コンテンツ イベント参加者 限定コンテンツ イベント参加者 限定コンテンツ
買えることの表現 クックパッドマートでは購入時に以下 2 つを選択する 受け取り場所 受け取り日 この組み合わせを Delivery
と呼んで概念化している とある商品 ( Product ) がとある Delivery で買えるかは状況によって変わる • 販売者の営業日 • 配送経路の関係 (現在はこれによって差がステーション間に出来ることはほぼない) 買えないにも 2 種類ある • 同じ受け取り場所で異なる受取日なら買える ◦ これを明確に表示したい • 同じ受け取り場所ならどうやっても買えない これを表現する手段が必要
© 2022 Cookpad Inc. 13 買えることの表現 • 買える ◦
DeliveryProduct という中間モデルで表現 • 同じ受け取り場所で異なる受取日なら買える ◦ DeliveryUnavailableProduct という中間モデルで表現 • それぞれデータは同名のテーブルに永続化 Before • 商品一覧を作るのに毎回 DP と DUP をクエリーして足し合わせる必要がある • 商品を購入可能 ⇔ 不可能の状態が管理しにくい ◦ 都度レコードの生成・削除が必要 Problem
© 2022 Cookpad Inc. 14 買えることの表現 • すべて DP に一本化、DUP
の状態は DP に status enum を生やし表現 • 700 受け取り場所 x 13,000 商品 x 7 日 = 63,700,000 レコードで依然課題ではある After 詳しい人 イベント参加者 限定コンテンツ イベント参加者 限定コンテンツ
© 2022 Cookpad Inc. 15 • toB があるサービスと PDF 生成は切っても切り離せない
◦ 特に初期は web が整っていないこともあり紙のコミュニケーションが多い ◦ 現場において、小さな端末の画面を見る必要がなく コピーも可能な物理的な媒体の需要は依然大きい PDF
© 2022 Cookpad Inc. 16 PDF 1. Excel でテンプレートを作る
2. rubyXL gem を使って Rails のデータを書き込む 3. LibraOffice で PDF に変換する 4. qpdf でテンプレートで用意された余分なページを削除 Before • PDF の種類が増えるたびに Excel のテンプレートが増え、Docker の image size が肥大化 • 実行時間が長い • テンプレートで想定していない量の注文が入るたびに、テンプレートの行数を増やす ぬくもりのあるオペレーション 😇 Problem
© 2022 Cookpad Inc. 17 PDF • prawn gem で宣言的に生成
After 詳しい人 イベント参加者 限定コンテンツ イベント参加者 限定コンテンツ
© 2022 Cookpad Inc. 18 まだまだありますが今日はこの辺で...
• クックパッドマートは作り直しにとっても寛容 ◦ 最初の要件に対しては元の作り方で十分だったが、要件が増えて辛くなることはザラ ◦ 最初から未来の要件をすべて見通すのは不可能 ◦
とにかく最初はシュッと作るが、辛くなったらすぐ作り直しを検討していくことで 新規事業にとって重要な初速 と長期運用に必要な品質 のバランスを取っている • クックパッドマートではいろんなことができます ◦ 登場人物の種類が多い ▪ ユーザー、販売者、ドライバー、受け取り場所設置者、マートスタッフ etc. ◦ それぞれに対して物理的に必要なもの、必要なロジックが沢山ある ◦ 何かしら刺さっていたら幸いです 伝えたかったこと © 2022 Cookpad Inc. 19
© 2022 Cookpad Inc. 20