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
23
29k
クックパッドマートの失敗したデータ設計 Before / After 大放出
https://cookpad.connpass.com/event/249346/
にて発表。
Motoi Okuzono
July 01, 2022
Tweet
Share
More Decks by Motoi Okuzono
See All by Motoi Okuzono
生鮮 EC プラットフォームを支えるアプリケーションたち
mokuzon
0
200
エンジニアによるエンジニアのためのクックパッドマートLIVE説明会 - クックパッドマートのサーバーサイド開発 -
mokuzon
0
1.9k
クックパッド料理教室 における開発
mokuzon
0
60
Other Decks in Programming
See All in Programming
What's new in AppKit on macOS 26
1024jp
0
170
型で語るカタ
irof
1
820
20250708_JAWS_opscdk
takuyay0ne
2
150
テスターからテストエンジニアへ ~新米テストエンジニアが歩んだ9ヶ月振り返り~
non0113
2
240
React は次の10年を生き残れるか:3つのトレンドから考える
oukayuka
40
15k
AIともっと楽するE2Eテスト
myohei
9
3.1k
脱Riverpod?fqueryで考える、TanStack Queryライクなアーキテクチャの可能性
ostk0069
0
560
チームで開発し事業を加速するための"良い"設計の考え方 @ サポーターズCoLab 2025-07-08
agatan
1
490
フロントエンドのパフォーマンスチューニング
koukimiura
6
2.3k
Rails Frontend Evolution: It Was a Setup All Along
skryukov
0
330
MCPで実現できる、Webサービス利用体験について
syumai
7
2k
AIコーディングエージェント全社導入とセキュリティ対策
hikaruegashira
12
7.5k
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
8
370
Six Lessons from altMBA
skipperchong
28
3.9k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Optimizing for Happiness
mojombo
379
70k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
Visualization
eitanlees
146
16k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
30
2.2k
RailsConf 2023
tenderlove
30
1.2k
Done Done
chrislema
184
16k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.8k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
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