限界ORM!BOOTHとギフトとライブラリ【PIXIV MEETUP 2023 LT】
by
RND
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
pixiv Inc. 限界ORM! BOOTHとギフトとライブラリ RND
Slide 2
Slide 2 text
Profile RND エンジニア クリエイター事業部 BOOTH部所属 絵と漫画を描く が趣味 RND(らんど)と読みます
Slide 3
Slide 3 text
前提知識 検索する時に自動でクエリを組み立ててくれる心づよい友達 ORM (= Object Relation Mapping) RDB レコードとオブジェクトとを変換する技術 ActiveRecord: Rails ORMフレームワーク
Slide 4
Slide 4 text
今回 話
Slide 5
Slide 5 text
BOOTH ギフト機能 なし クリエイターとファンを繋ぐ C2C 販売プラットフォーム Railsで書かれている 今年10周年 BOOTH
Slide 6
Slide 6 text
2022年12月
Slide 7
Slide 7 text
DL商品を購入する ギフト用URLが発行される URLにアクセスすると 他 人が DL商品を受け取ることが できる
Slide 8
Slide 8 text
こ 機能
Slide 9
Slide 9 text
実装が大変だった
Slide 10
Slide 10 text
これまで BOOTH 所有者 = 購入者 注文 LineItem 注文と商品 関連テーブル 商品 購入者 (所有者) * 所有 * * これが... 注文完了かつ、LineItemがあれ 所有してる
Slide 11
Slide 11 text
ギフト 場合 所有者 ≠ 購入者 注文 LineItem 注文と商品 関連テーブル 商品 購入者 * 所有(ギフトじゃない時) * * ギフト 受取ユーザー 所有(ギフト 時)
Slide 12
Slide 12 text
ということ 所有=購入で運用されてきたサービス 所有と購入を分離、影響箇所 ... 注文 LineItem 注文と商品 関連テーブル 商品 購入者 発送 売り上げ管理 カート pixivFACTORYと 連携 送り状(伝票) 生成 レコメンド アルゴリズム 無限にある
Slide 13
Slide 13 text
ということ 所有=購入で運用されてきたサービス 所有と購入を分離、影響箇所 ... 注文 LineItem 注文と商品 関連テーブル 商品 購入者 発送 売り上げ管理 カート pixivFACTORYと 連携 送り状(伝票) 生成 レコメンド アルゴリズム 無限にある it’s 無理
Slide 14
Slide 14 text
やった 意外となんとかなる 必要な 気合い やったらできた grepして出てきた箇所をnotionに書き出して影響 有無を判断
Slide 15
Slide 15 text
本題
Slide 16
Slide 16 text
ライブラリ なし
Slide 17
Slide 17 text
ライブラリ ギフトによって 所有 経路が2種類になった 所有している商品が入手順に並ぶページ
Slide 18
Slide 18 text
ギフトで受け取った商品も 自分で買った商品も ライブラリに入手順で並べる
Slide 19
Slide 19 text
2種類 経路でJOINされたテー ブルを結合 でもRails(ActiveRecord)にない unionを実装したgem? もしく 生SQLを書くか、orメソッドなどで頑張る UNIONが必要そう
Slide 20
Slide 20 text
分けたらええやん 「無理そう」な設計が出たら要件を見直す 別ページに分けて解決、ユーザーも困らない。 ギフトで受け取った商品 別ページに遷移して表示
Slide 21
Slide 21 text
まだある
Slide 22
Slide 22 text
ギフト、何回でも受け取れる こんなケース こ 前言ってた アバター、 プレゼントで送ります 好きそうなアバター あったんでギフトで 送ります ダブってしまったけど 受け取らない も 申し訳ないなぁ...
Slide 23
Slide 23 text
受け取れます
Slide 24
Slide 24 text
何回でも
Slide 25
Slide 25 text
ということ
Slide 26
Slide 26 text
ライブラリ 複数回受け取った商品 最新 1件だけ表示される 所有している商品が入手順に並ぶページ new!
Slide 27
Slide 27 text
複数回受け取った場合 GROUP BY `商品` 1件にまとめて表示 ORDER BY `ギフト.受け取り日時` DESC 最近受け取ったも が先にくるように並べる
Slide 28
Slide 28 text
こうか??
Slide 29
Slide 29 text
ダメ ORDER BY GROUP BY より後に実行される
Slide 30
Slide 30 text
欲しいクエリ これ ActiveRecordで記述する手段 ない、一部生SQLになる
Slide 31
Slide 31 text
別 案: サブクエリ 件数がめちゃくちゃ増えてくるとパフォーマンスが悪くなる ActiveRecord from を使うとサブクエリが使える
Slide 32
Slide 32 text
もっと良さそうな案 変えようぜ、テーブル設計 所有を表現するテーブルを用意 アプリケーションで整合性を保つ 移行する 大変だが シンプルで変更につよそう
Slide 33
Slide 33 text
すまんがリリースまで時間ないわ 実装する に時間がかかる 今回 サブクエリ案で年内にリリース。 ユーザーに素早く価値を提供することが大事
Slide 34
Slide 34 text
まとめ:教訓 ActiveRecord、なんかすぐ限界になりがち 限界が見えたら 1. まず要件と仕様を見直す。 コードを書かずに解決しよう 2. テーブル設計を見直す。 プロダクトをシンプルに保とう 3. ActiveRecord芸を頑張ったり、生SQLもありかも (ユニットテストがしっかり書かれててCIでテストがちゃんと動いてるなら生SQLで別にいいんじゃないか(小声))
Slide 35
Slide 35 text
早くこれにしたい で、エンジニアを募集中 ご清聴 ありがとうございました